diff --git a/src/Main/Base/Project/Dom/ClassBrowser/NamespaceTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/NamespaceTreeNode.cs index 94d9250917..0f6c302d81 100644 --- a/src/Main/Base/Project/Dom/ClassBrowser/NamespaceTreeNode.cs +++ b/src/Main/Base/Project/Dom/ClassBrowser/NamespaceTreeNode.cs @@ -13,6 +13,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser { public class NamespaceTreeNode : ModelCollectionTreeNode { + static readonly IComparer TypeNodeComparer = new TypeDefinitionNodeComparer(); INamespaceModel model; public NamespaceTreeNode(INamespaceModel model) @@ -29,7 +30,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser protected override IComparer NodeComparer { get { - return NodeTextComparer; + return TypeNodeComparer; } } @@ -50,6 +51,33 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser return model.FullName; } } + + class TypeDefinitionNodeComparer : IComparer + { + public int Compare(SharpTreeNode x, SharpTreeNode y) + { + var a = x.Model as ITypeDefinitionModel; + var b = y.Model as ITypeDefinitionModel; + + if (a == null && b == null) + return NodeTextComparer.Compare(x, y); + if (a == null) + return -1; + if (b == null) + return 1; + + int typeNameComparison = StringComparer.OrdinalIgnoreCase.Compare(a.Name, b.Name); + if (typeNameComparison == 0) { + // Compare length of complete string (type parameters...) + if (x.Text.ToString().Length < y.Text.ToString().Length) + return -1; + if (x.Text.ToString().Length < y.Text.ToString().Length) + return 1; + } + + return typeNameComparison; + } + } } } diff --git a/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs b/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs index e53205281f..b763284826 100644 --- a/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs +++ b/src/Main/Base/Project/Dom/ClassBrowser/TypeDefinitionTreeNode.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Security.Policy; +using System.Text; using ICSharpCode.Core.Presentation; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.Utils; @@ -39,7 +40,7 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser public override object Text { get { - return definition.Name; + return GenerateNodeText(); } } @@ -84,6 +85,32 @@ namespace ICSharpCode.SharpDevelop.Dom.ClassBrowser } } + string GenerateNodeText() + { + var target = definition.Resolve(); + if (target != null) { + return GetTypeName(target); + } + return definition.Name; + } + + string GetTypeName(IType type) + { + StringBuilder typeName = new StringBuilder(type.Name); + if (type.TypeParameterCount > 0) { + typeName.Append("<"); + bool isFirst = true; + foreach (var typeParameter in type.TypeArguments) { + if (!isFirst) + typeName.Append(","); + typeName.Append(GetTypeName(typeParameter)); + isFirst = false; + } + typeName.Append(">"); + } + return typeName.ToString(); + } + class TypeDefinitionMemberNodeComparer : IComparer { public int Compare(SharpTreeNode x, SharpTreeNode y)