Browse Source

Rework of "References" node with real models.

pull/80/head
Andreas Weizel 12 years ago
parent
commit
c8755f9ef6
  1. 2
      src/AddIns/Debugger/Debugger.AddIn/Pads/ClassBrowserSupport.cs
  2. 62
      src/Main/Base/Project/Dom/ClassBrowser/AssemblyReferenceTreeNode.cs
  3. 30
      src/Main/Base/Project/Dom/ClassBrowser/AssemblyReferencesTreeNode.cs
  4. 4
      src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs
  5. 34
      src/Main/Base/Project/Dom/ClassBrowser/ProjectTreeNode.cs
  6. 24
      src/Main/Base/Project/Dom/IAssemblyModel.cs
  7. 18
      src/Main/Base/Project/Dom/IAssemblyReferenceModel.cs
  8. 34
      src/Main/Base/Project/Dom/IAssemblyReferencesModel.cs
  9. 7
      src/Main/Base/Project/ICSharpCode.SharpDevelop.addin
  10. 3
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  11. 8
      src/Main/Base/Project/Parser/ProjectContentContainer.cs
  12. 20
      src/Main/SharpDevelop/Dom/AssemblyModel.cs
  13. 75
      src/Main/SharpDevelop/Dom/AssemblyReferenceModel.cs
  14. 1
      src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs
  15. 9
      src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserTreeNodesFactory.cs
  16. 33
      src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs
  17. 2
      src/Main/SharpDevelop/Parser/AssemblyParserService.cs
  18. 1
      src/Main/SharpDevelop/SharpDevelop.csproj

2
src/AddIns/Debugger/Debugger.AddIn/Pads/ClassBrowserSupport.cs

@ -191,7 +191,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads @@ -191,7 +191,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Pads
model.AssemblyName = module.UnresolvedAssembly.AssemblyName;
model.FullAssemblyName = module.UnresolvedAssembly.FullAssemblyName;
model.Update(EmptyList<IUnresolvedTypeDefinition>.Instance, types);
model.References = module.GetReferences().Select(r => new DomAssemblyName(r)).ToArray();
model.UpdateReferences(module.GetReferences().Select(r => new DomAssemblyName(r)).ToArray());
return model;
}
}

62
src/Main/Base/Project/Dom/ClassBrowser/AssemblyReferenceTreeNode.cs

@ -0,0 +1,62 @@ @@ -0,0 +1,62 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop.Parser;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{
/// <summary>
/// Tree node representing one single referenced assembly.
/// </summary>
public class AssemblyReferenceTreeNode : ModelCollectionTreeNode
{
private IAssemblyReferenceModel model;
public AssemblyReferenceTreeNode(IAssemblyReferenceModel model)
{
if (model == null)
throw new ArgumentNullException("model");
this.model = model;
}
protected override object GetModel()
{
return model;
}
protected override IModelCollection<object> ModelChildren {
get {
// TODO Show assemblies referenced by this assembly?
return ImmutableModelCollection<object>.Empty;
}
}
protected override System.Collections.Generic.IComparer<ICSharpCode.TreeView.SharpTreeNode> NodeComparer {
get {
return NodeTextComparer;
}
}
public override object Text {
get {
return model.AssemblyName.ShortName;
}
}
public override object Icon {
get {
return SD.ResourceService.GetImageSource("Icons.16x16.Reference");
}
}
public override void ShowContextMenu()
{
var assemblyReferenceModel = this.Model as IAssemblyReferenceModel;
if (assemblyReferenceModel != null) {
var ctx = MenuService.ShowContextMenu(null, assemblyReferenceModel, "/SharpDevelop/Pads/ClassBrowser/AssemblyReferenceContextMenu");
}
}
}
}

30
src/Main/Base/Project/Dom/ClassBrowser/AssemblyReferencesTreeNode.cs

@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
using System;
using System.Linq;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Parser;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
@ -12,24 +13,21 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -12,24 +13,21 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
/// </summary>
public class AssemblyReferencesTreeNode : ModelCollectionTreeNode
{
private IAssemblyModel assemblyModel;
private IAssemblyReferencesModel referencesModel;
private string text;
private SimpleModelCollection<IAssemblyModel> references;
public AssemblyReferencesTreeNode(IAssemblyModel assemblyModel)
public AssemblyReferencesTreeNode(IAssemblyReferencesModel referencesModel)
{
if (assemblyModel == null)
throw new ArgumentNullException("assemblyModel");
this.assemblyModel = assemblyModel;
if (referencesModel == null)
throw new ArgumentNullException("referencesModel");
this.referencesModel = referencesModel;
this.text = SD.ResourceService.GetString("ICSharpCode.SharpDevelop.Commands.ProjectBrowser.ReferencesNodeText");
references = new SimpleModelCollection<IAssemblyModel>();
UpdateReferences();
}
protected override IModelCollection<object> ModelChildren
{
get {
return references;
return referencesModel.AssemblyNames;
}
}
@ -53,19 +51,5 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -53,19 +51,5 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
return SD.ResourceService.GetImageSource("ProjectBrowser.ReferenceFolder.Closed");
}
}
void UpdateReferences()
{
references.Clear();
var assemblyParserService = SD.GetRequiredService<IAssemblyParserService>();
if (assemblyModel.References != null) {
foreach (var referencedAssemblyName in assemblyModel.References) {
DefaultAssemblySearcher searcher = new DefaultAssemblySearcher(assemblyModel.Location);
var resolvedFile = searcher.FindAssembly(referencedAssemblyName);
var referenceAssemblyModel = assemblyParserService.GetAssemblyModel(resolvedFile);
references.Add(referenceAssemblyModel);
}
}
}
}
}

4
src/Main/Base/Project/Dom/ClassBrowser/BaseTypesTreeNode.cs

@ -103,9 +103,9 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -103,9 +103,9 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
// Look at referenced assemblies
if ((assemblyModel.References != null) && (assemblyParserService != null)) {
foreach (var referencedAssemblyName in assemblyModel.References) {
foreach (var referencedAssemblyName in assemblyModel.References.AssemblyNames) {
DefaultAssemblySearcher searcher = new DefaultAssemblySearcher(assemblyModel.Location);
var resolvedFile = searcher.FindAssembly(referencedAssemblyName);
var resolvedFile = searcher.FindAssembly(referencedAssemblyName.AssemblyName);
var referenceAssemblyModel = assemblyParserService.GetAssemblyModel(resolvedFile);
resolveTypeDefModel = referenceAssemblyModel.TopLevelTypeDefinitions[baseTypeDefinition.FullTypeName];
if (resolveTypeDefModel != null) {

34
src/Main/Base/Project/Dom/ClassBrowser/ProjectTreeNode.cs

@ -10,13 +10,34 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -10,13 +10,34 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{
public class ProjectTreeNode : ModelCollectionTreeNode
{
class ProjectChildComparer : IComparer<SharpTreeNode>
{
IComparer<string> stringComparer = StringComparer.OrdinalIgnoreCase;
public int Compare(SharpTreeNode x, SharpTreeNode y)
{
// "References" node has precedence over other nodes
if ((x is AssemblyReferencesTreeNode) && !(y is AssemblyReferencesTreeNode))
return -1;
if (!(x is AssemblyReferencesTreeNode) && (y is AssemblyReferencesTreeNode))
return 1;
// All other nodes are compared by their Text property
return stringComparer.Compare(x.Text.ToString(), y.Text.ToString());
}
}
protected static readonly IComparer<SharpTreeNode> ChildNodeComparer = new ProjectChildComparer();
IProject project;
IAssemblyReferencesModel assemblyReferencesModel;
public ProjectTreeNode(IProject project)
{
if (project == null)
throw new ArgumentNullException("project");
this.project = project;
assemblyReferencesModel = project.AssemblyModel.References;
}
protected override object GetModel()
@ -38,7 +59,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -38,7 +59,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
protected override IComparer<SharpTreeNode> NodeComparer {
get {
return NodeTextComparer;
return ChildNodeComparer;
}
}
@ -55,14 +76,9 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -55,14 +76,9 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
protected override void InsertSpecialNodes()
{
UpdateReferencesNode();
}
void UpdateReferencesNode()
{
this.Children.RemoveAll(n => n is AssemblyReferencesTreeNode);
var refsTreeNode = new AssemblyReferencesTreeNode(project.AssemblyModel);
Children.Insert(0, refsTreeNode);
var treeNode = SD.TreeNodeFactory.CreateTreeNode(assemblyReferencesModel);
if (treeNode != null)
Children.OrderedInsert(treeNode, ChildNodeComparer);
}
}
}

24
src/Main/Base/Project/Dom/IAssemblyModel.cs

@ -5,7 +5,6 @@ using System; @@ -5,7 +5,6 @@ using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.NRefactory;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Parser;
@ -64,7 +63,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -64,7 +63,7 @@ namespace ICSharpCode.SharpDevelop.Dom
/// <summary>
/// Returns the assembly references.
/// </summary>
IReadOnlyList<DomAssemblyName> References { get; }
IAssemblyReferencesModel References { get; }
}
/// <summary>
@ -86,6 +85,12 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -86,6 +85,12 @@ namespace ICSharpCode.SharpDevelop.Dom
/// </summary>
void Update(IList<IUnresolvedTypeDefinition> oldFile, IList<IUnresolvedTypeDefinition> newFile);
/// <summary>
/// Updates references of this assembly.
/// </summary>
/// <param name="references">Names of referenced assemblies</param>
void UpdateReferences(IReadOnlyList<DomAssemblyName> references);
/// <summary>
/// Gets the assembly name (short name).
/// </summary>
@ -95,17 +100,12 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -95,17 +100,12 @@ namespace ICSharpCode.SharpDevelop.Dom
/// Gets the full assembly name (including public key token etc.)
/// </summary>
new string FullAssemblyName { get; set; }
/// <summary>
/// Returns the assembly references.
/// </summary>
new IReadOnlyList<DomAssemblyName> References { get; set; }
}
public sealed class EmptyAssemblyModel : IAssemblyModel
{
public readonly static IAssemblyModel Instance = new EmptyAssemblyModel();
EmptyAssemblyModel()
{
}
@ -117,7 +117,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -117,7 +117,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public string FullAssemblyName {
get { return string.Empty; }
}
public ITypeDefinitionModelCollection TopLevelTypeDefinitions {
get { return EmptyTypeDefinitionModelCollection.Instance; }
}
@ -129,7 +129,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -129,7 +129,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public INamespaceModel RootNamespace {
get { return EmptyNamespaceModel.Instance; }
}
public IEntityModelContext Context {
get {
return null;
@ -142,8 +142,8 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -142,8 +142,8 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public IReadOnlyList<DomAssemblyName> References {
get { return EmptyList<DomAssemblyName>.Instance; }
public IAssemblyReferencesModel References {
get { return EmptyAssemblyReferencesModel.Instance; }
}
}
}

18
src/Main/Base/Project/Dom/IAssemblyReferenceModel.cs

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Parser;
namespace ICSharpCode.SharpDevelop.Dom
{
/// <summary>
/// Base interface for a single assembly reference.
/// </summary>
public interface IAssemblyReferenceModel
{
DomAssemblyName AssemblyName { get; }
IAssemblyModel ParentAssemblyModel { get; }
}
}

34
src/Main/Base/Project/Dom/IAssemblyReferencesModel.cs

@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using ICSharpCode.SharpDevelop.Parser;
namespace ICSharpCode.SharpDevelop.Dom
{
/// <summary>
/// Base interface for list of assembly references.
/// </summary>
public interface IAssemblyReferencesModel
{
IModelCollection<IAssemblyReferenceModel> AssemblyNames { get; }
}
/// <summary>
/// Implements an empty assembly references model.
/// </summary>
public class EmptyAssemblyReferencesModel : IAssemblyReferencesModel
{
public static readonly IAssemblyReferencesModel Instance = new EmptyAssemblyReferencesModel();
private static readonly SimpleModelCollection<IAssemblyReferenceModel> EmptyReferenceCollection =
new SimpleModelCollection<IAssemblyReferenceModel>();
public IModelCollection<IAssemblyReferenceModel> AssemblyNames {
get {
return EmptyReferenceCollection;
}
}
}
}

7
src/Main/Base/Project/ICSharpCode.SharpDevelop.addin

@ -1013,6 +1013,13 @@ @@ -1013,6 +1013,13 @@
class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.RemoveAssemblyCommand"/>
</Path>
<Path name = "/SharpDevelop/Pads/ClassBrowser/AssemblyReferenceContextMenu">
<MenuItem id = "PermanentlyAddToWorkspace"
label = "${res:MainWindow.Windows.ClassBrowser.AddToWorkspace}"
icon = "Icons.16x16.AssemblyFromFile"
class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.PermanentlyAddModuleToWorkspaceCommand"/>
</Path>
<Path name="/SharpDevelop/EntityContextMenu">
<MenuItem id="OpenInClassBrowser"
icon="ILSpy"

3
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -86,6 +86,7 @@ @@ -86,6 +86,7 @@
<Compile Include="Designer\TypeResolutionService.cs" />
<Compile Include="Dom\ClassBrowser\AssemblyLoadErrorTreeNode.cs" />
<Compile Include="Dom\ClassBrowser\AssemblyReferencesTreeNode.cs" />
<Compile Include="Dom\ClassBrowser\AssemblyReferenceTreeNode.cs" />
<Compile Include="Dom\ClassBrowser\AssemblyTreeNode.cs" />
<Compile Include="Dom\ClassBrowser\BaseTypesTreeNode.cs" />
<Compile Include="Dom\ClassBrowser\ClassBrowserAssemblyModelExtensions.cs" />
@ -102,6 +103,8 @@ @@ -102,6 +103,8 @@
<Compile Include="Dom\ClassBrowser\WorkspaceTreeNode.cs" />
<Compile Include="Dom\IAssemblyList.cs" />
<Compile Include="Dom\IAssemblyModel.cs" />
<Compile Include="Dom\IAssemblyReferenceModel.cs" />
<Compile Include="Dom\IAssemblyReferencesModel.cs" />
<Compile Include="Dom\IEntityModelContext.cs" />
<Compile Include="Dom\IEventModel.cs" />
<Compile Include="Dom\IFieldModel.cs" />

8
src/Main/Base/Project/Parser/ProjectContentContainer.cs

@ -460,8 +460,8 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -460,8 +460,8 @@ namespace ICSharpCode.SharpDevelop.Parser
projectContent = projectContent.RemoveAssemblyReferences(this.references).AddAssemblyReferences(newReferences);
this.references = newReferences.ToArray();
SD.ParserService.InvalidateCurrentSolutionSnapshot();
assemblyModel.References = projectContent.AssemblyReferences
.Select(ResolveReferenceForAssemblyModel).Where(r => r != null).ToList();
assemblyModel.UpdateReferences(projectContent.AssemblyReferences
.Select(ResolveReferenceForAssemblyModel).Where(r => r != null).ToList());
}
}
}
@ -488,8 +488,8 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -488,8 +488,8 @@ namespace ICSharpCode.SharpDevelop.Parser
this.references[index] = e.NewAssembly;
projectContent = projectContent.RemoveAssemblyReferences(e.OldAssembly).AddAssemblyReferences(e.NewAssembly);
SD.ParserService.InvalidateCurrentSolutionSnapshot();
assemblyModel.References = projectContent.AssemblyReferences
.Select(ResolveReferenceForAssemblyModel).Where(r => r != null).ToList();
assemblyModel.UpdateReferences(projectContent.AssemblyReferences
.Select(ResolveReferenceForAssemblyModel).Where(r => r != null).ToList());
}
}
}

20
src/Main/SharpDevelop/Dom/AssemblyModel.cs

@ -19,18 +19,18 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -19,18 +19,18 @@ namespace ICSharpCode.SharpDevelop.Dom
TopLevelTypeDefinitionModelCollection typeDeclarations;
KeyedModelCollection<string, NamespaceModel> namespaces;
NamespaceModel rootNamespace;
IReadOnlyList<DomAssemblyName> references;
AssemblyReferencesModel referencesModel;
public AssemblyModel(IEntityModelContext context)
{
if (context == null)
throw new ArgumentNullException("context");
this.context = context;
this.references = EmptyList<DomAssemblyName>.Instance;
this.rootNamespace = new NamespaceModel(context.Project, null, "");
this.typeDeclarations = new TopLevelTypeDefinitionModelCollection(context);
this.typeDeclarations.CollectionChanged += TypeDeclarationsCollectionChanged;
this.namespaces = new KeyedModelCollection<string, NamespaceModel>(value => value.FullName);
this.referencesModel = new AssemblyReferencesModel(this);
}
public string AssemblyName { get; set; }
@ -48,6 +48,12 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -48,6 +48,12 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public IAssemblyReferencesModel ReferencesModel {
get {
return referencesModel;
}
}
public INamespaceModel RootNamespace {
get {
return rootNamespace;
@ -86,6 +92,11 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -86,6 +92,11 @@ namespace ICSharpCode.SharpDevelop.Dom
typeDeclarations.Update(oldFile, newFile);
}
public void UpdateReferences(IReadOnlyList<DomAssemblyName> references)
{
referencesModel.Update(references);
}
void TypeDeclarationsCollectionChanged(IReadOnlyCollection<ITypeDefinitionModel> removedItems, IReadOnlyCollection<ITypeDefinitionModel> addedItems)
{
List<IDisposable> batchList = new List<IDisposable>();
@ -143,9 +154,8 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -143,9 +154,8 @@ namespace ICSharpCode.SharpDevelop.Dom
}
}
public IReadOnlyList<DomAssemblyName> References {
get { return references; }
set { references = value; }
public IAssemblyReferencesModel References {
get { return referencesModel; }
}
}
}

75
src/Main/SharpDevelop/Dom/AssemblyReferenceModel.cs

@ -0,0 +1,75 @@ @@ -0,0 +1,75 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.SharpDevelop.Parser;
namespace ICSharpCode.SharpDevelop.Dom
{
/// <summary>
/// Model representing list of assembly references.
/// </summary>
public class AssemblyReferencesModel : IAssemblyReferencesModel
{
IAssemblyModel parentAssemblyModel;
private NullSafeSimpleModelCollection<IAssemblyReferenceModel> assemblyNames;
public AssemblyReferencesModel(IAssemblyModel parentAssemblyModel)
{
if (parentAssemblyModel == null)
throw new ArgumentNullException("parentAssemblyModel");
assemblyNames = new NullSafeSimpleModelCollection<IAssemblyReferenceModel>();
this.parentAssemblyModel = parentAssemblyModel;
}
public IModelCollection<IAssemblyReferenceModel> AssemblyNames
{
get {
return assemblyNames;
}
}
public void Update(IReadOnlyList<DomAssemblyName> references)
{
assemblyNames.Clear();
if (references != null) {
assemblyNames.AddRange(references.Select(r => new AssemblyReferenceModel(parentAssemblyModel, r)));
}
}
}
/// <summary>
/// Model representing an assembly reference.
/// </summary>
public class AssemblyReferenceModel : IAssemblyReferenceModel
{
IAssemblyModel parentAssemblyModel;
DomAssemblyName assemblyName;
public AssemblyReferenceModel(IAssemblyModel parentAssemblyModel, DomAssemblyName assemblyName)
{
if (parentAssemblyModel == null)
throw new ArgumentNullException("parentAssemblyModel");
if (assemblyName == null)
throw new ArgumentNullException("assemblyName");
this.parentAssemblyModel = parentAssemblyModel;
this.assemblyName = assemblyName;
}
public DomAssemblyName AssemblyName {
get {
return assemblyName;
}
}
public IAssemblyModel ParentAssemblyModel {
get {
return parentAssemblyModel;
}
}
}
}

1
src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserPad.cs

@ -259,7 +259,6 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -259,7 +259,6 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
IUpdateableAssemblyModel unresolvedModel = modelFactory.CreateAssemblyModel(unresolvedContext);
unresolvedModel.AssemblyName = unresolvedContext.AssemblyName;
unresolvedModel.FullAssemblyName = unresolvedContext.FullAssemblyName;
unresolvedModel.References = EmptyList<DomAssemblyName>.Instance;
return unresolvedModel;
}

9
src/Main/SharpDevelop/Dom/ClassBrowser/ClassBrowserTreeNodesFactory.cs

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.SharpDevelop.Parser;
using ICSharpCode.TreeView;
using ICSharpCode.SharpDevelop.Project;
@ -23,6 +24,10 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -23,6 +24,10 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
return typeof(IMemberModel);
if (model is IAssemblyModel)
return typeof(IAssemblyModel);
if (model is IAssemblyReferenceModel)
return typeof(IAssemblyReferenceModel);
if (model is IAssemblyReferencesModel)
return typeof(IAssemblyReferencesModel);
return null;
}
@ -40,6 +45,10 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -40,6 +45,10 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
return new MemberTreeNode((IMemberModel)model);
if (model is IAssemblyModel)
return new AssemblyTreeNode((IAssemblyModel) model);
if (model is IAssemblyReferenceModel)
return new AssemblyReferenceTreeNode((IAssemblyReferenceModel) model);
if (model is IAssemblyReferencesModel)
return new AssemblyReferencesTreeNode((IAssemblyReferencesModel) model);
return null;
}
}

33
src/Main/SharpDevelop/Dom/ClassBrowser/Commands.cs

@ -9,6 +9,7 @@ using ICSharpCode.NRefactory.Semantics; @@ -9,6 +9,7 @@ using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Editor.Commands;
using ICSharpCode.SharpDevelop.Parser;
using Microsoft.Win32;
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
@ -67,22 +68,36 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser @@ -67,22 +68,36 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
public override bool CanExecute(object parameter)
{
IAssemblyModel assemblyModel = parameter as IAssemblyModel;
return (assemblyModel != null) && assemblyModel.Context.IsValid;
IAssemblyReferenceModel assemblyReferenceModel = parameter as IAssemblyReferenceModel;
return ((assemblyModel != null) && assemblyModel.Context.IsValid) || (assemblyReferenceModel != null);
}
public override void Execute(object parameter)
{
var classBrowser = SD.GetService<IClassBrowser>();
if (classBrowser != null) {
IAssemblyModel assemblyModel = (IAssemblyModel) parameter;
// Try to remove AssemblyModel from list of UnpinnedAssemblies
classBrowser.UnpinnedAssemblies.Assemblies.Remove(assemblyModel);
IAssemblyModel assemblyModel = parameter as IAssemblyModel;
if (assemblyModel == null) {
IAssemblyReferenceModel assemblyReference = parameter as IAssemblyReferenceModel;
if (assemblyReference == null) {
// Neither assembly model, nor a assembly reference model
return;
}
// Model is an assembly reference
IAssemblyParserService assemblyParserService = SD.GetRequiredService<IAssemblyParserService>();
DefaultAssemblySearcher searcher = new DefaultAssemblySearcher(assemblyReference.ParentAssemblyModel.Location);
var resolvedFile = searcher.FindAssembly(assemblyReference.AssemblyName);
assemblyModel = assemblyParserService.GetAssemblyModelSafe(resolvedFile);
}
// Create a new copy of this assembly model
IAssemblyModel newAssemblyModel = SD.AssemblyParserService.GetAssemblyModelSafe(new ICSharpCode.Core.FileName(assemblyModel.Context.Location), true);
if (newAssemblyModel != null)
classBrowser.MainAssemblyList.Assemblies.Add(newAssemblyModel);
if (assemblyModel != null) {
// Try to remove AssemblyModel from list of UnpinnedAssemblies
classBrowser.UnpinnedAssemblies.Assemblies.RemoveAll(a => a.FullAssemblyName == assemblyModel.FullAssemblyName);
if (!classBrowser.MainAssemblyList.Assemblies.Contains(assemblyModel))
classBrowser.MainAssemblyList.Assemblies.Add(assemblyModel);
}
}
}
}

2
src/Main/SharpDevelop/Parser/AssemblyParserService.cs

@ -352,7 +352,7 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -352,7 +352,7 @@ namespace ICSharpCode.SharpDevelop.Parser
model.Update(EmptyList<IUnresolvedTypeDefinition>.Instance, assembly.ProjectContent.TopLevelTypeDefinitions.ToList());
model.AssemblyName = assembly.ProjectContent.AssemblyName;
model.FullAssemblyName = assembly.ProjectContent.FullAssemblyName;
model.References = assembly.References.ToList();
model.UpdateReferences(assembly.References);
assembly.Model = model;
}

1
src/Main/SharpDevelop/SharpDevelop.csproj

@ -106,6 +106,7 @@ @@ -106,6 +106,7 @@
<Compile Include="..\ICSharpCode.SharpDevelop.BuildWorker\ExtendedBinaryReader.cs">
<Link>Project\Build\MSBuildEngine\ExtendedBinaryReader.cs</Link>
</Compile>
<Compile Include="Dom\AssemblyReferenceModel.cs" />
<Compile Include="Dom\ClassBrowser\ClassBrowserPad.cs" />
<Compile Include="Dom\ClassBrowser\ClassBrowserTreeNodesFactory.cs" />
<Compile Include="Dom\ClassBrowser\Commands.cs" />

Loading…
Cancel
Save