Browse Source

Fix #261: Class members added in code are shown twice and some more problems with overloaded methods.

pull/315/head
Andreas Weizel 12 years ago
parent
commit
e45db528f7
  1. 2
      src/Main/Base/Project/Dom/ClassBrowser/ClassBrowserTreeView.cs
  2. 4
      src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs
  3. 5
      src/Main/Base/Project/Dom/ClassBrowser/WorkspaceTreeNode.cs
  4. 2
      src/Main/Base/Project/Dom/ModelCollectionChangedEvent.cs
  5. 36
      src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs

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

@ -183,7 +183,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
int entityParamsCount = parametrizedEntityMember.Parameters != null ? parametrizedEntityMember.Parameters.Count : 0; int entityParamsCount = parametrizedEntityMember.Parameters != null ? parametrizedEntityMember.Parameters.Count : 0;
if (treeNodeParamsCount == entityParamsCount) { if (treeNodeParamsCount == entityParamsCount) {
for (int i = 0; i < entityParamsCount; i++) { for (int i = 0; i < entityParamsCount; i++) {
if (parametrizedEntityMember.Parameters[i].Type.FullName != parametrizedTreeNodeMember.Parameters[i].Type.Resolve(entityAssembly.Compilation).FullName) { if (!parametrizedEntityMember.Parameters[i].Type.Equals(parametrizedTreeNodeMember.Parameters[i].Type.Resolve(entityAssembly.Compilation))) {
return false; return false;
} }
} }

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

@ -17,6 +17,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
{ {
static readonly IComparer<SharpTreeNode> TypeMemberNodeComparer = new TypeDefinitionMemberNodeComparer(); static readonly IComparer<SharpTreeNode> TypeMemberNodeComparer = new TypeDefinitionMemberNodeComparer();
ITypeDefinitionModel definition; ITypeDefinitionModel definition;
IModelCollection<object> combinedModelChildren;
public TypeDefinitionTreeNode(ITypeDefinitionModel definition) public TypeDefinitionTreeNode(ITypeDefinitionModel definition)
{ {
@ -27,6 +28,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
UpdateBaseTypesNode(); UpdateBaseTypesNode();
UpdateDerivedTypesNode(); UpdateDerivedTypesNode();
}; };
this.combinedModelChildren = definition.NestedTypes.Concat<object>(definition.Members);
} }
protected override object GetModel() protected override object GetModel()
@ -55,7 +57,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
protected override IModelCollection<object> ModelChildren { protected override IModelCollection<object> ModelChildren {
get { get {
return definition.NestedTypes.Concat<object>(definition.Members); return combinedModelChildren;
} }
} }

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

@ -35,10 +35,13 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
} }
} }
IModelCollection<object> combinedModelChildren;
protected static readonly IComparer<SharpTreeNode> ChildNodeComparer = new WorkspaceChildComparer(); protected static readonly IComparer<SharpTreeNode> ChildNodeComparer = new WorkspaceChildComparer();
public WorkspaceTreeNode() public WorkspaceTreeNode()
{ {
combinedModelChildren = SD.ClassBrowser.MainAssemblyList.Assemblies.Concat(SD.ClassBrowser.UnpinnedAssemblies.Assemblies);
SD.ClassBrowser.CurrentWorkspace.AssemblyLists.CollectionChanged += AssemblyListsCollectionChanged; SD.ClassBrowser.CurrentWorkspace.AssemblyLists.CollectionChanged += AssemblyListsCollectionChanged;
} }
@ -48,7 +51,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
} }
protected override IModelCollection<object> ModelChildren { protected override IModelCollection<object> ModelChildren {
get { return SD.ClassBrowser.MainAssemblyList.Assemblies.Concat(SD.ClassBrowser.UnpinnedAssemblies.Assemblies); } get { return combinedModelChildren; }
} }
protected override IComparer<SharpTreeNode> NodeComparer { protected override IComparer<SharpTreeNode> NodeComparer {

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

@ -25,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.Dom
public void AddHandler(ModelCollectionChangedEventHandler<T> handler) public void AddHandler(ModelCollectionChangedEventHandler<T> handler)
{ {
if (handler != null) if ((handler != null) && !_handlers.Contains(handler))
_handlers.Add(handler); _handlers.Add(handler);
} }

36
src/Main/SharpDevelop/Dom/TypeDefinitionModel.cs

@ -36,6 +36,11 @@ namespace ICSharpCode.SharpDevelop.Dom
this.fullTypeName = firstPart.FullTypeName; this.fullTypeName = firstPart.FullTypeName;
} }
public IEntityModelContext Context
{
get { return context; }
}
public IReadOnlyList<IUnresolvedTypeDefinition> Parts { public IReadOnlyList<IUnresolvedTypeDefinition> Parts {
get { return parts; } get { return parts; }
} }
@ -139,14 +144,14 @@ namespace ICSharpCode.SharpDevelop.Dom
var newMembers = newPart.Members; var newMembers = newPart.Members;
int startPos = 0; int startPos = 0;
// Look at the initial members and update them if they're matching // Look at the initial members and update them if they're matching
while (startPos < list.Count && startPos < newMembers.Count && IsMatch(list[startPos], newMembers[startPos])) { while (startPos < list.Count && startPos < newMembers.Count && IsMatch(parent.Context, list[startPos], newMembers[startPos])) {
list[startPos].Update(newMembers[startPos]); list[startPos].Update(newMembers[startPos]);
startPos++; startPos++;
} }
// Look at the final members // Look at the final members
int endPosOld = list.Count - 1; int endPosOld = list.Count - 1;
int endPosNew = newMembers.Count - 1; int endPosNew = newMembers.Count - 1;
while (endPosOld >= startPos && endPosNew >= startPos && IsMatch(list[endPosOld], newMembers[endPosNew])) { while (endPosOld >= startPos && endPosNew >= startPos && IsMatch(parent.Context, list[endPosOld], newMembers[endPosNew])) {
list[endPosOld--].Update(newMembers[endPosNew--]); list[endPosOld--].Update(newMembers[endPosNew--]);
} }
// [startPos, endPos] is the middle portion that contains all the changes // [startPos, endPos] is the middle portion that contains all the changes
@ -172,9 +177,32 @@ namespace ICSharpCode.SharpDevelop.Dom
} }
} }
static bool IsMatch(MemberModel memberModel, IUnresolvedMember newMember) static bool IsMatch(IEntityModelContext context, MemberModel memberModel, IUnresolvedMember newMember)
{ {
return memberModel.SymbolKind == newMember.SymbolKind && memberModel.Name == newMember.Name; bool isSymbolOfTypeAndName = memberModel.SymbolKind == newMember.SymbolKind && memberModel.Name == newMember.Name;
if (isSymbolOfTypeAndName) {
var parametrizedNewMember = newMember as IUnresolvedParameterizedMember;
var parametrizedModelMember = memberModel.UnresolvedMember as IUnresolvedParameterizedMember;
if ((parametrizedNewMember != null) && (parametrizedModelMember != null)) {
// For methods and constructors additionally check the parameters and their types to handle overloading properly
int treeNodeParamsCount = parametrizedModelMember.Parameters != null ? parametrizedModelMember.Parameters.Count : 0;
int entityParamsCount = parametrizedNewMember.Parameters != null ? parametrizedNewMember.Parameters.Count : 0;
if (treeNodeParamsCount == entityParamsCount) {
for (int i = 0; i < entityParamsCount; i++) {
if (!parametrizedNewMember.Parameters[i].Type.Resolve(context.GetCompilation()).Equals(parametrizedModelMember.Parameters[i].Type.Resolve(context.GetCompilation()))) {
return false;
}
}
// All parameters were equal
return true;
}
} else {
return true;
}
}
return false;
} }
public event ModelCollectionChangedEventHandler<MemberModel> CollectionChanged { public event ModelCollectionChangedEventHandler<MemberModel> CollectionChanged {

Loading…
Cancel
Save