Browse Source

Fix #577: Improve the display of namespaces and nested classes

pull/940/merge
Siegfried Pammer 8 years ago
parent
commit
c3ff2ce63c
  1. 39
      ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs
  2. 4
      ILSpy/TreeNodes/TypeTreeNode.cs

39
ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

@ -934,13 +934,31 @@ namespace ICSharpCode.Decompiler.CSharp @@ -934,13 +934,31 @@ namespace ICSharpCode.Decompiler.CSharp
} else if (type is GenericParameter) {
return new SimpleType(type.Name);
} else if (type.IsNested) {
AstType typeRef = ConvertType(type.DeclaringType, typeAttributes, ref typeIndex, options & ~ConvertTypeOptions.IncludeTypeParameterDefinitions);
string namepart = ReflectionHelper.SplitTypeParameterCountFromReflectionName(type.Name);
MemberType memberType = new MemberType { Target = typeRef, MemberName = namepart };
memberType.AddAnnotation(type);
AstType memberType;
if ((options & (ConvertTypeOptions.IncludeOuterTypeName | ConvertTypeOptions.IncludeNamespace)) != 0) {
AstType typeRef = ConvertType(type.DeclaringType, typeAttributes, ref typeIndex, options & ~ConvertTypeOptions.IncludeTypeParameterDefinitions);
memberType = new MemberType { Target = typeRef, MemberName = namepart };
if ((options & ConvertTypeOptions.IncludeTypeParameterDefinitions) == ConvertTypeOptions.IncludeTypeParameterDefinitions) {
AddTypeParameterDefininitionsTo(type, memberType);
}
} else {
memberType = new SimpleType(namepart);
if ((options & ConvertTypeOptions.IncludeTypeParameterDefinitions) == ConvertTypeOptions.IncludeTypeParameterDefinitions) {
if (type.HasGenericParameters) {
List<AstType> typeArguments = new List<AstType>();
foreach (GenericParameter gp in type.GenericParameters) {
typeArguments.Add(new SimpleType(gp.Name));
}
ReflectionHelper.SplitTypeParameterCountFromReflectionName(type.Name, out int typeParameterCount);
if (typeParameterCount > typeArguments.Count)
typeParameterCount = typeArguments.Count;
((SimpleType)memberType).TypeArguments.AddRange(typeArguments.GetRange(typeArguments.Count - typeParameterCount, typeParameterCount));
typeArguments.RemoveRange(typeArguments.Count - typeParameterCount, typeParameterCount);
}
}
}
memberType.AddAnnotation(type);
return memberType;
} else {
string ns = type.Namespace ?? string.Empty;
@ -1029,14 +1047,22 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1029,14 +1047,22 @@ namespace ICSharpCode.Decompiler.CSharp
{
SimpleType st = baseType as SimpleType;
if (st != null) {
TypeReference type = st.Annotation<TypeReference>();
if (type != null) {
ReflectionHelper.SplitTypeParameterCountFromReflectionName(type.Name, out int typeParameterCount);
if (typeParameterCount > typeArguments.Count)
typeParameterCount = typeArguments.Count;
st.TypeArguments.AddRange(typeArguments.GetRange(typeArguments.Count - typeParameterCount, typeParameterCount));
} else {
st.TypeArguments.AddRange(typeArguments);
}
}
MemberType mt = baseType as MemberType;
if (mt != null) {
TypeReference type = mt.Annotation<TypeReference>();
if (type != null) {
int typeParameterCount;
ReflectionHelper.SplitTypeParameterCountFromReflectionName(type.Name, out typeParameterCount);
ReflectionHelper.SplitTypeParameterCountFromReflectionName(type.Name, out int typeParameterCount);
if (typeParameterCount > typeArguments.Count)
typeParameterCount = typeArguments.Count;
mt.TypeArguments.AddRange(typeArguments.GetRange(typeArguments.Count - typeParameterCount, typeParameterCount));
@ -1090,6 +1116,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1090,6 +1116,7 @@ namespace ICSharpCode.Decompiler.CSharp
None = 0,
IncludeNamespace = 1,
IncludeTypeParameterDefinitions = 2,
DoNotUsePrimitiveTypeNames = 4
DoNotUsePrimitiveTypeNames = 4,
IncludeOuterTypeName = 8,
}
}

4
ILSpy/TreeNodes/TypeTreeNode.cs

@ -44,10 +44,6 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -44,10 +44,6 @@ namespace ICSharpCode.ILSpy.TreeNodes
public AssemblyTreeNode ParentAssemblyNode { get; }
public string Name => TypeDefinition.Name;
public string Namespace => TypeDefinition.Namespace;
public override object Text => HighlightSearchMatch(this.Language.FormatTypeName(TypeDefinition), TypeDefinition.MetadataToken.ToSuffixString());
public override bool IsPublicAPI {

Loading…
Cancel
Save