Browse Source

Fix handling of type parameters in GetFullTypeName

pull/1198/head
Siegfried Pammer 7 years ago
parent
commit
74e81010b3
  1. 2
      ICSharpCode.Decompiler/Metadata/Dom.cs
  2. 2
      ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs
  3. 14
      ICSharpCode.Decompiler/SRMExtensions.cs

2
ICSharpCode.Decompiler/Metadata/Dom.cs

@ -835,7 +835,7 @@ namespace ICSharpCode.Decompiler.Metadata
public FullTypeName GetTypeFromReference(MetadataReader reader, TypeReferenceHandle handle, byte rawTypeKind)
{
return handle.GetFullTypeName(reader, omitGenericParamCount: true);
return handle.GetFullTypeName(reader);
}
public FullTypeName GetTypeFromSpecification(MetadataReader reader, Unit genericContext, TypeSpecificationHandle handle, byte rawTypeKind)

2
ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

@ -101,6 +101,8 @@ namespace ICSharpCode.Decompiler.Metadata
public static string ToILNameString(this FullTypeName typeName)
{
var escapedName = Disassembler.DisassemblerHelpers.Escape(typeName.Name);
if (typeName.TypeParameterCount > 0)
escapedName += "`" + typeName.TypeParameterCount;
if (typeName.IsNested) {
return $"{typeName.GetDeclaringType().ToILNameString()}/{escapedName}";
} else if (!string.IsNullOrEmpty(typeName.TopLevelTypeName.Namespace)) {

14
ICSharpCode.Decompiler/SRMExtensions.cs

@ -167,7 +167,7 @@ namespace ICSharpCode.Decompiler
}
}
public static FullTypeName GetFullTypeName(this TypeSpecificationHandle handle, MetadataReader reader, bool omitGenericParamCount = false)
public static FullTypeName GetFullTypeName(this TypeSpecificationHandle handle, MetadataReader reader)
{
if (handle.IsNil)
throw new ArgumentNullException(nameof(handle));
@ -175,17 +175,18 @@ namespace ICSharpCode.Decompiler
return ts.DecodeSignature(new Metadata.FullTypeNameSignatureDecoder(reader), default(Unit));
}
public static FullTypeName GetFullTypeName(this TypeReferenceHandle handle, MetadataReader reader, bool omitGenericParamCount = false)
public static FullTypeName GetFullTypeName(this TypeReferenceHandle handle, MetadataReader reader)
{
if (handle.IsNil)
throw new ArgumentNullException(nameof(handle));
var tr = reader.GetTypeReference(handle);
string name = ReflectionHelper.SplitTypeParameterCountFromReflectionName(reader.GetString(tr.Name), out var typeParameterCount);
TypeReferenceHandle declaringTypeHandle;
if ((declaringTypeHandle = tr.GetDeclaringType()).IsNil) {
string @namespace = tr.Namespace.IsNil ? "" : reader.GetString(tr.Namespace);
return new FullTypeName(new TopLevelTypeName(@namespace, reader.GetString(tr.Name)));
return new FullTypeName(new TopLevelTypeName(@namespace, name, typeParameterCount));
} else {
return declaringTypeHandle.GetFullTypeName(reader, omitGenericParamCount).NestedType(reader.GetString(tr.Name), 0);
return declaringTypeHandle.GetFullTypeName(reader).NestedType(name, typeParameterCount);
}
}
@ -199,11 +200,12 @@ namespace ICSharpCode.Decompiler
public static FullTypeName GetFullTypeName(this TypeDefinition td, MetadataReader reader)
{
TypeDefinitionHandle declaringTypeHandle;
string name = ReflectionHelper.SplitTypeParameterCountFromReflectionName(reader.GetString(td.Name), out var typeParameterCount);
if ((declaringTypeHandle = td.GetDeclaringType()).IsNil) {
string @namespace = td.Namespace.IsNil ? "" : reader.GetString(td.Namespace);
return new FullTypeName(new TopLevelTypeName(@namespace, reader.GetString(td.Name)));
return new FullTypeName(new TopLevelTypeName(@namespace, name, typeParameterCount));
} else {
return declaringTypeHandle.GetFullTypeName(reader).NestedType(reader.GetString(td.Name), 0);
return declaringTypeHandle.GetFullTypeName(reader).NestedType(name, typeParameterCount);
}
}

Loading…
Cancel
Save