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

Commit e45db52

Browse files
committed
Fix #261: Class members added in code are shown twice and some more problems with overloaded methods.
1 parent c3118cb commit e45db52

5 files changed

Lines changed: 41 additions & 8 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public bool GoToEntity(IEntity entity)
183183
int entityParamsCount = parametrizedEntityMember.Parameters != null ? parametrizedEntityMember.Parameters.Count : 0;
184184
if (treeNodeParamsCount == entityParamsCount) {
185185
for (int i = 0; i < entityParamsCount; i++) {
186-
if (parametrizedEntityMember.Parameters[i].Type.FullName != parametrizedTreeNodeMember.Parameters[i].Type.Resolve(entityAssembly.Compilation).FullName) {
186+
if (!parametrizedEntityMember.Parameters[i].Type.Equals(parametrizedTreeNodeMember.Parameters[i].Type.Resolve(entityAssembly.Compilation))) {
187187
return false;
188188
}
189189
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class TypeDefinitionTreeNode : ModelCollectionTreeNode
1717
{
1818
static readonly IComparer<SharpTreeNode> TypeMemberNodeComparer = new TypeDefinitionMemberNodeComparer();
1919
ITypeDefinitionModel definition;
20+
IModelCollection<object> combinedModelChildren;
2021

2122
public TypeDefinitionTreeNode(ITypeDefinitionModel definition)
2223
{
@@ -27,6 +28,7 @@ public TypeDefinitionTreeNode(ITypeDefinitionModel definition)
2728
UpdateBaseTypesNode();
2829
UpdateDerivedTypesNode();
2930
};
31+
this.combinedModelChildren = definition.NestedTypes.Concat<object>(definition.Members);
3032
}
3133

3234
protected override object GetModel()
@@ -55,7 +57,7 @@ protected override IComparer<SharpTreeNode> NodeComparer {
5557

5658
protected override IModelCollection<object> ModelChildren {
5759
get {
58-
return definition.NestedTypes.Concat<object>(definition.Members);
60+
return combinedModelChildren;
5961
}
6062
}
6163

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,14 @@ public int Compare(SharpTreeNode x, SharpTreeNode y)
3434
return stringComparer.Compare(x.Text.ToString(), y.Text.ToString());
3535
}
3636
}
37+
38+
IModelCollection<object> combinedModelChildren;
3739

3840
protected static readonly IComparer<SharpTreeNode> ChildNodeComparer = new WorkspaceChildComparer();
3941

4042
public WorkspaceTreeNode()
4143
{
44+
combinedModelChildren = SD.ClassBrowser.MainAssemblyList.Assemblies.Concat(SD.ClassBrowser.UnpinnedAssemblies.Assemblies);
4245
SD.ClassBrowser.CurrentWorkspace.AssemblyLists.CollectionChanged += AssemblyListsCollectionChanged;
4346
}
4447

@@ -48,7 +51,7 @@ protected override object GetModel()
4851
}
4952

5053
protected override IModelCollection<object> ModelChildren {
51-
get { return SD.ClassBrowser.MainAssemblyList.Assemblies.Concat(SD.ClassBrowser.UnpinnedAssemblies.Assemblies); }
54+
get { return combinedModelChildren; }
5255
}
5356

5457
protected override IComparer<SharpTreeNode> NodeComparer {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class ModelCollectionChangedEvent<T>
2525

2626
public void AddHandler(ModelCollectionChangedEventHandler<T> handler)
2727
{
28-
if (handler != null)
28+
if ((handler != null) && !_handlers.Contains(handler))
2929
_handlers.Add(handler);
3030
}
3131

src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ public TypeDefinitionModel(IEntityModelContext context, IUnresolvedTypeDefinitio
3636
this.fullTypeName = firstPart.FullTypeName;
3737
}
3838

39+
public IEntityModelContext Context
40+
{
41+
get { return context; }
42+
}
43+
3944
public IReadOnlyList<IUnresolvedTypeDefinition> Parts {
4045
get { return parts; }
4146
}
@@ -139,14 +144,14 @@ public void UpdatePart(int partIndex, IUnresolvedTypeDefinition newPart)
139144
var newMembers = newPart.Members;
140145
int startPos = 0;
141146
// Look at the initial members and update them if they're matching
142-
while (startPos < list.Count && startPos < newMembers.Count && IsMatch(list[startPos], newMembers[startPos])) {
147+
while (startPos < list.Count && startPos < newMembers.Count && IsMatch(parent.Context, list[startPos], newMembers[startPos])) {
143148
list[startPos].Update(newMembers[startPos]);
144149
startPos++;
145150
}
146151
// Look at the final members
147152
int endPosOld = list.Count - 1;
148153
int endPosNew = newMembers.Count - 1;
149-
while (endPosOld >= startPos && endPosNew >= startPos && IsMatch(list[endPosOld], newMembers[endPosNew])) {
154+
while (endPosOld >= startPos && endPosNew >= startPos && IsMatch(parent.Context, list[endPosOld], newMembers[endPosNew])) {
150155
list[endPosOld--].Update(newMembers[endPosNew--]);
151156
}
152157
// [startPos, endPos] is the middle portion that contains all the changes
@@ -172,9 +177,32 @@ public void UpdatePart(int partIndex, IUnresolvedTypeDefinition newPart)
172177
}
173178
}
174179

175-
static bool IsMatch(MemberModel memberModel, IUnresolvedMember newMember)
180+
static bool IsMatch(IEntityModelContext context, MemberModel memberModel, IUnresolvedMember newMember)
176181
{
177-
return memberModel.SymbolKind == newMember.SymbolKind && memberModel.Name == newMember.Name;
182+
bool isSymbolOfTypeAndName = memberModel.SymbolKind == newMember.SymbolKind && memberModel.Name == newMember.Name;
183+
if (isSymbolOfTypeAndName) {
184+
var parametrizedNewMember = newMember as IUnresolvedParameterizedMember;
185+
var parametrizedModelMember = memberModel.UnresolvedMember as IUnresolvedParameterizedMember;
186+
if ((parametrizedNewMember != null) && (parametrizedModelMember != null)) {
187+
// For methods and constructors additionally check the parameters and their types to handle overloading properly
188+
int treeNodeParamsCount = parametrizedModelMember.Parameters != null ? parametrizedModelMember.Parameters.Count : 0;
189+
int entityParamsCount = parametrizedNewMember.Parameters != null ? parametrizedNewMember.Parameters.Count : 0;
190+
if (treeNodeParamsCount == entityParamsCount) {
191+
for (int i = 0; i < entityParamsCount; i++) {
192+
if (!parametrizedNewMember.Parameters[i].Type.Resolve(context.GetCompilation()).Equals(parametrizedModelMember.Parameters[i].Type.Resolve(context.GetCompilation()))) {
193+
return false;
194+
}
195+
}
196+
197+
// All parameters were equal
198+
return true;
199+
}
200+
} else {
201+
return true;
202+
}
203+
}
204+
205+
return false;
178206
}
179207

180208
public event ModelCollectionChangedEventHandler<MemberModel> CollectionChanged {

0 commit comments

Comments
 (0)