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 @@ -183,7 +183,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser
int entityParamsCount = parametrizedEntityMember.Parameters != null ? parametrizedEntityMember.Parameters.Count : 0;
if (treeNodeParamsCount == entityParamsCount) {
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;
}
}

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

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

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

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

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

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

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

@ -36,6 +36,11 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -36,6 +36,11 @@ namespace ICSharpCode.SharpDevelop.Dom
this.fullTypeName = firstPart.FullTypeName;
}
public IEntityModelContext Context
{
get { return context; }
}
public IReadOnlyList<IUnresolvedTypeDefinition> Parts {
get { return parts; }
}
@ -139,14 +144,14 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -139,14 +144,14 @@ namespace ICSharpCode.SharpDevelop.Dom
var newMembers = newPart.Members;
int startPos = 0;
// 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]);
startPos++;
}
// Look at the final members
int endPosOld = list.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--]);
}
// [startPos, endPos] is the middle portion that contains all the changes
@ -172,9 +177,32 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -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 {

Loading…
Cancel
Save