Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit c8755f9

Browse files
committed
Rework of "References" node with real models.
1 parent 7aa8587 commit c8755f9

18 files changed

Lines changed: 300 additions & 67 deletions

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ static IAssemblyModel CreateAssemblyModel(Module module)
191191
model.AssemblyName = module.UnresolvedAssembly.AssemblyName;
192192
model.FullAssemblyName = module.UnresolvedAssembly.FullAssemblyName;
193193
model.Update(EmptyList<IUnresolvedTypeDefinition>.Instance, types);
194-
model.References = module.GetReferences().Select(r => new DomAssemblyName(r)).ToArray();
194+
model.UpdateReferences(module.GetReferences().Select(r => new DomAssemblyName(r)).ToArray());
195195
return model;
196196
}
197197
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2+
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
3+
4+
using System;
5+
using ICSharpCode.Core.Presentation;
6+
using ICSharpCode.SharpDevelop.Parser;
7+
8+
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
9+
{
10+
/// <summary>
11+
/// Tree node representing one single referenced assembly.
12+
/// </summary>
13+
public class AssemblyReferenceTreeNode : ModelCollectionTreeNode
14+
{
15+
private IAssemblyReferenceModel model;
16+
17+
public AssemblyReferenceTreeNode(IAssemblyReferenceModel model)
18+
{
19+
if (model == null)
20+
throw new ArgumentNullException("model");
21+
this.model = model;
22+
}
23+
24+
protected override object GetModel()
25+
{
26+
return model;
27+
}
28+
29+
protected override IModelCollection<object> ModelChildren {
30+
get {
31+
// TODO Show assemblies referenced by this assembly?
32+
return ImmutableModelCollection<object>.Empty;
33+
}
34+
}
35+
36+
protected override System.Collections.Generic.IComparer<ICSharpCode.TreeView.SharpTreeNode> NodeComparer {
37+
get {
38+
return NodeTextComparer;
39+
}
40+
}
41+
42+
public override object Text {
43+
get {
44+
return model.AssemblyName.ShortName;
45+
}
46+
}
47+
48+
public override object Icon {
49+
get {
50+
return SD.ResourceService.GetImageSource("Icons.16x16.Reference");
51+
}
52+
}
53+
54+
public override void ShowContextMenu()
55+
{
56+
var assemblyReferenceModel = this.Model as IAssemblyReferenceModel;
57+
if (assemblyReferenceModel != null) {
58+
var ctx = MenuService.ShowContextMenu(null, assemblyReferenceModel, "/SharpDevelop/Pads/ClassBrowser/AssemblyReferenceContextMenu");
59+
}
60+
}
61+
}
62+
}

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

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Linq;
6+
using ICSharpCode.SharpDevelop.Dom;
67
using ICSharpCode.SharpDevelop.Parser;
78

89
namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
@@ -12,24 +13,21 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
1213
/// </summary>
1314
public class AssemblyReferencesTreeNode : ModelCollectionTreeNode
1415
{
15-
private IAssemblyModel assemblyModel;
16+
private IAssemblyReferencesModel referencesModel;
1617
private string text;
17-
private SimpleModelCollection<IAssemblyModel> references;
1818

19-
public AssemblyReferencesTreeNode(IAssemblyModel assemblyModel)
19+
public AssemblyReferencesTreeNode(IAssemblyReferencesModel referencesModel)
2020
{
21-
if (assemblyModel == null)
22-
throw new ArgumentNullException("assemblyModel");
23-
this.assemblyModel = assemblyModel;
21+
if (referencesModel == null)
22+
throw new ArgumentNullException("referencesModel");
23+
this.referencesModel = referencesModel;
2424
this.text = SD.ResourceService.GetString("ICSharpCode.SharpDevelop.Commands.ProjectBrowser.ReferencesNodeText");
25-
references = new SimpleModelCollection<IAssemblyModel>();
26-
UpdateReferences();
2725
}
2826

2927
protected override IModelCollection<object> ModelChildren
3028
{
3129
get {
32-
return references;
30+
return referencesModel.AssemblyNames;
3331
}
3432
}
3533

@@ -53,19 +51,5 @@ public override object Icon
5351
return SD.ResourceService.GetImageSource("ProjectBrowser.ReferenceFolder.Closed");
5452
}
5553
}
56-
57-
void UpdateReferences()
58-
{
59-
references.Clear();
60-
var assemblyParserService = SD.GetRequiredService<IAssemblyParserService>();
61-
if (assemblyModel.References != null) {
62-
foreach (var referencedAssemblyName in assemblyModel.References) {
63-
DefaultAssemblySearcher searcher = new DefaultAssemblySearcher(assemblyModel.Location);
64-
var resolvedFile = searcher.FindAssembly(referencedAssemblyName);
65-
var referenceAssemblyModel = assemblyParserService.GetAssemblyModel(resolvedFile);
66-
references.Add(referenceAssemblyModel);
67-
}
68-
}
69-
}
7054
}
7155
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,9 @@ ITypeDefinitionModel GetTypeDefinitionModel(ITypeDefinition mainTypeDefinition,
103103

104104
// Look at referenced assemblies
105105
if ((assemblyModel.References != null) && (assemblyParserService != null)) {
106-
foreach (var referencedAssemblyName in assemblyModel.References) {
106+
foreach (var referencedAssemblyName in assemblyModel.References.AssemblyNames) {
107107
DefaultAssemblySearcher searcher = new DefaultAssemblySearcher(assemblyModel.Location);
108-
var resolvedFile = searcher.FindAssembly(referencedAssemblyName);
108+
var resolvedFile = searcher.FindAssembly(referencedAssemblyName.AssemblyName);
109109
var referenceAssemblyModel = assemblyParserService.GetAssemblyModel(resolvedFile);
110110
resolveTypeDefModel = referenceAssemblyModel.TopLevelTypeDefinitions[baseTypeDefinition.FullTypeName];
111111
if (resolveTypeDefModel != null) {

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

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,34 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
1010
{
1111
public class ProjectTreeNode : ModelCollectionTreeNode
1212
{
13+
class ProjectChildComparer : IComparer<SharpTreeNode>
14+
{
15+
IComparer<string> stringComparer = StringComparer.OrdinalIgnoreCase;
16+
17+
public int Compare(SharpTreeNode x, SharpTreeNode y)
18+
{
19+
// "References" node has precedence over other nodes
20+
if ((x is AssemblyReferencesTreeNode) && !(y is AssemblyReferencesTreeNode))
21+
return -1;
22+
if (!(x is AssemblyReferencesTreeNode) && (y is AssemblyReferencesTreeNode))
23+
return 1;
24+
25+
// All other nodes are compared by their Text property
26+
return stringComparer.Compare(x.Text.ToString(), y.Text.ToString());
27+
}
28+
}
29+
30+
protected static readonly IComparer<SharpTreeNode> ChildNodeComparer = new ProjectChildComparer();
31+
1332
IProject project;
33+
IAssemblyReferencesModel assemblyReferencesModel;
1434

1535
public ProjectTreeNode(IProject project)
1636
{
1737
if (project == null)
1838
throw new ArgumentNullException("project");
1939
this.project = project;
40+
assemblyReferencesModel = project.AssemblyModel.References;
2041
}
2142

2243
protected override object GetModel()
@@ -38,7 +59,7 @@ public override object Icon {
3859

3960
protected override IComparer<SharpTreeNode> NodeComparer {
4061
get {
41-
return NodeTextComparer;
62+
return ChildNodeComparer;
4263
}
4364
}
4465

@@ -55,14 +76,9 @@ protected override bool IsSpecialNode()
5576

5677
protected override void InsertSpecialNodes()
5778
{
58-
UpdateReferencesNode();
59-
}
60-
61-
void UpdateReferencesNode()
62-
{
63-
this.Children.RemoveAll(n => n is AssemblyReferencesTreeNode);
64-
var refsTreeNode = new AssemblyReferencesTreeNode(project.AssemblyModel);
65-
Children.Insert(0, refsTreeNode);
79+
var treeNode = SD.TreeNodeFactory.CreateTreeNode(assemblyReferencesModel);
80+
if (treeNode != null)
81+
Children.OrderedInsert(treeNode, ChildNodeComparer);
6682
}
6783
}
6884
}

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using System.Collections.Generic;
66
using System.Linq;
77
using ICSharpCode.Core;
8-
using ICSharpCode.NRefactory;
98
using ICSharpCode.NRefactory.TypeSystem;
109
using ICSharpCode.SharpDevelop.Parser;
1110

@@ -64,7 +63,7 @@ public interface IAssemblyModel
6463
/// <summary>
6564
/// Returns the assembly references.
6665
/// </summary>
67-
IReadOnlyList<DomAssemblyName> References { get; }
66+
IAssemblyReferencesModel References { get; }
6867
}
6968

7069
/// <summary>
@@ -86,6 +85,12 @@ public interface IUpdateableAssemblyModel : IAssemblyModel
8685
/// </summary>
8786
void Update(IList<IUnresolvedTypeDefinition> oldFile, IList<IUnresolvedTypeDefinition> newFile);
8887

88+
/// <summary>
89+
/// Updates references of this assembly.
90+
/// </summary>
91+
/// <param name="references">Names of referenced assemblies</param>
92+
void UpdateReferences(IReadOnlyList<DomAssemblyName> references);
93+
8994
/// <summary>
9095
/// Gets the assembly name (short name).
9196
/// </summary>
@@ -95,17 +100,12 @@ public interface IUpdateableAssemblyModel : IAssemblyModel
95100
/// Gets the full assembly name (including public key token etc.)
96101
/// </summary>
97102
new string FullAssemblyName { get; set; }
98-
99-
/// <summary>
100-
/// Returns the assembly references.
101-
/// </summary>
102-
new IReadOnlyList<DomAssemblyName> References { get; set; }
103103
}
104104

105105
public sealed class EmptyAssemblyModel : IAssemblyModel
106106
{
107107
public readonly static IAssemblyModel Instance = new EmptyAssemblyModel();
108-
108+
109109
EmptyAssemblyModel()
110110
{
111111
}
@@ -117,7 +117,7 @@ public string AssemblyName {
117117
public string FullAssemblyName {
118118
get { return string.Empty; }
119119
}
120-
120+
121121
public ITypeDefinitionModelCollection TopLevelTypeDefinitions {
122122
get { return EmptyTypeDefinitionModelCollection.Instance; }
123123
}
@@ -129,7 +129,7 @@ public IModelCollection<INamespaceModel> Namespaces {
129129
public INamespaceModel RootNamespace {
130130
get { return EmptyNamespaceModel.Instance; }
131131
}
132-
132+
133133
public IEntityModelContext Context {
134134
get {
135135
return null;
@@ -142,8 +142,8 @@ public FileName Location {
142142
}
143143
}
144144

145-
public IReadOnlyList<DomAssemblyName> References {
146-
get { return EmptyList<DomAssemblyName>.Instance; }
145+
public IAssemblyReferencesModel References {
146+
get { return EmptyAssemblyReferencesModel.Instance; }
147147
}
148148
}
149149
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2+
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using ICSharpCode.SharpDevelop.Parser;
7+
8+
namespace ICSharpCode.SharpDevelop.Dom
9+
{
10+
/// <summary>
11+
/// Base interface for a single assembly reference.
12+
/// </summary>
13+
public interface IAssemblyReferenceModel
14+
{
15+
DomAssemblyName AssemblyName { get; }
16+
IAssemblyModel ParentAssemblyModel { get; }
17+
}
18+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2+
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using ICSharpCode.SharpDevelop.Parser;
7+
8+
namespace ICSharpCode.SharpDevelop.Dom
9+
{
10+
/// <summary>
11+
/// Base interface for list of assembly references.
12+
/// </summary>
13+
public interface IAssemblyReferencesModel
14+
{
15+
IModelCollection<IAssemblyReferenceModel> AssemblyNames { get; }
16+
}
17+
18+
/// <summary>
19+
/// Implements an empty assembly references model.
20+
/// </summary>
21+
public class EmptyAssemblyReferencesModel : IAssemblyReferencesModel
22+
{
23+
public static readonly IAssemblyReferencesModel Instance = new EmptyAssemblyReferencesModel();
24+
25+
private static readonly SimpleModelCollection<IAssemblyReferenceModel> EmptyReferenceCollection =
26+
new SimpleModelCollection<IAssemblyReferenceModel>();
27+
28+
public IModelCollection<IAssemblyReferenceModel> AssemblyNames {
29+
get {
30+
return EmptyReferenceCollection;
31+
}
32+
}
33+
}
34+
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,6 +1013,13 @@
10131013
class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.RemoveAssemblyCommand"/>
10141014
</Path>
10151015

1016+
<Path name = "/SharpDevelop/Pads/ClassBrowser/AssemblyReferenceContextMenu">
1017+
<MenuItem id = "PermanentlyAddToWorkspace"
1018+
label = "${res:MainWindow.Windows.ClassBrowser.AddToWorkspace}"
1019+
icon = "Icons.16x16.AssemblyFromFile"
1020+
class = "ICSharpCode.SharpDevelop.Dom.ClassBrowser.PermanentlyAddModuleToWorkspaceCommand"/>
1021+
</Path>
1022+
10161023
<Path name="/SharpDevelop/EntityContextMenu">
10171024
<MenuItem id="OpenInClassBrowser"
10181025
icon="ILSpy"

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
<Compile Include="Designer\TypeResolutionService.cs" />
8787
<Compile Include="Dom\ClassBrowser\AssemblyLoadErrorTreeNode.cs" />
8888
<Compile Include="Dom\ClassBrowser\AssemblyReferencesTreeNode.cs" />
89+
<Compile Include="Dom\ClassBrowser\AssemblyReferenceTreeNode.cs" />
8990
<Compile Include="Dom\ClassBrowser\AssemblyTreeNode.cs" />
9091
<Compile Include="Dom\ClassBrowser\BaseTypesTreeNode.cs" />
9192
<Compile Include="Dom\ClassBrowser\ClassBrowserAssemblyModelExtensions.cs" />
@@ -102,6 +103,8 @@
102103
<Compile Include="Dom\ClassBrowser\WorkspaceTreeNode.cs" />
103104
<Compile Include="Dom\IAssemblyList.cs" />
104105
<Compile Include="Dom\IAssemblyModel.cs" />
106+
<Compile Include="Dom\IAssemblyReferenceModel.cs" />
107+
<Compile Include="Dom\IAssemblyReferencesModel.cs" />
105108
<Compile Include="Dom\IEntityModelContext.cs" />
106109
<Compile Include="Dom\IEventModel.cs" />
107110
<Compile Include="Dom\IFieldModel.cs" />

0 commit comments

Comments
 (0)