Browse Source

Fix typedef names in IL view

pull/1198/head
Daniel Grunwald 7 years ago
parent
commit
225a3f9f92
  1. 37
      ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs
  2. 35
      ILSpy/Languages/Language.cs

37
ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs

@ -39,6 +39,12 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -39,6 +39,12 @@ namespace ICSharpCode.Decompiler.TypeSystem
this.compilation = assembly.Compilation;
}
public TypeProvider(ICompilation compilation)
{
this.assembly = null;
this.compilation = compilation ?? throw new ArgumentNullException(nameof(compilation));
}
public IType GetArrayType(IType elementType, SRM.ArrayShape shape)
{
return new ArrayType(compilation, elementType, shape.Rank);
@ -109,12 +115,25 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -109,12 +115,25 @@ namespace ICSharpCode.Decompiler.TypeSystem
return new ArrayType(compilation, elementType);
}
bool? IsReferenceType(SRM.MetadataReader reader, SRM.EntityHandle handle, byte rawTypeKind)
{
switch (reader.ResolveSignatureTypeKind(handle, rawTypeKind)) {
case SRM.SignatureTypeKind.ValueType:
return false;
case SRM.SignatureTypeKind.Class:
return true;
default:
return null;
}
}
public IType GetTypeFromDefinition(SRM.MetadataReader reader, SRM.TypeDefinitionHandle handle, byte rawTypeKind)
{
ITypeDefinition td = assembly.ResolveTypeDefToken(handle);
ITypeDefinition td = assembly?.ResolveTypeDefToken(handle);
if (td != null)
return td;
return SpecialType.UnknownType;
bool? isReferenceType = IsReferenceType(reader, handle, rawTypeKind);
return new UnknownType(handle.GetFullTypeName(reader), isReferenceType);
}
public IType GetTypeFromReference(SRM.MetadataReader reader, SRM.TypeReferenceHandle handle, byte rawTypeKind)
@ -125,24 +144,16 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -125,24 +144,16 @@ namespace ICSharpCode.Decompiler.TypeSystem
nrAsmRef = DefaultAssemblyReference.CurrentAssembly;
else
nrAsmRef = new DefaultAssemblyReference(reader.GetString(reader.GetAssemblyReference(asmref).Name));
bool? isReferenceType = null;
switch (reader.ResolveSignatureTypeKind(handle, rawTypeKind)) {
case SRM.SignatureTypeKind.ValueType:
isReferenceType = false;
break;
case SRM.SignatureTypeKind.Class:
isReferenceType = true;
break;
}
bool? isReferenceType = IsReferenceType(reader, handle, rawTypeKind);
var gctr = new GetClassTypeReference(handle.GetFullTypeName(reader), nrAsmRef, isReferenceType);
return gctr.Resolve(new SimpleTypeResolveContext(assembly));
return gctr.Resolve(assembly != null ? new SimpleTypeResolveContext(assembly) : new SimpleTypeResolveContext(compilation));
}
public IType GetTypeFromSerializedName(string name)
{
// TODO: aren't we missing support for assembly-qualified names?
return new GetClassTypeReference(new FullTypeName(name))
.Resolve(new SimpleTypeResolveContext(assembly));
.Resolve(assembly != null ? new SimpleTypeResolveContext(assembly) : new SimpleTypeResolveContext(compilation));
}
public IType GetTypeFromSpecification(SRM.MetadataReader reader, ITypeResolveContext genericContext, SRM.TypeSpecificationHandle handle, byte rawTypeKind)

35
ILSpy/Languages/Language.cs

@ -171,31 +171,20 @@ namespace ICSharpCode.ILSpy @@ -171,31 +171,20 @@ namespace ICSharpCode.ILSpy
return provider.GetTypeFromReference(metadata, (SRM.TypeReferenceHandle)type.Handle, 0);
case SRM.HandleKind.TypeDefinition:
var td = metadata.GetTypeDefinition((SRM.TypeDefinitionHandle)type.Handle);
var genericParams = td.GetGenericParameters();
var buffer = new System.Text.StringBuilder();
var name = td.GetFullTypeName(metadata);
if (includeNamespace)
buffer.Append(name.ToString());
else
buffer.Append(name.Name);
if (genericParams.Count > 0) {
buffer.Append('<');
int i = 0;
foreach (var h in genericParams) {
var gp = metadata.GetGenericParameter(h);
if (i > 0)
buffer.Append(", ");
buffer.Append(metadata.GetString(gp.Name));
i++;
if (includeNamespace) {
var buffer = new System.Text.StringBuilder();
if (!td.GetDeclaringType().IsNil) {
buffer.Append(TypeToString(new TypeDefinition(type.Module, td.GetDeclaringType()), genericContext, includeNamespace));
buffer.Append('+');
} else if (!td.Namespace.IsNil) {
buffer.Append(metadata.GetString(td.Namespace));
buffer.Append('.');
}
buffer.Append('>');
buffer.Append(metadata.GetString(td.Name));
return buffer.ToString();
} else {
return metadata.GetString(td.Name);
}
return buffer.ToString();
case SRM.HandleKind.TypeSpecification:
return provider.GetTypeFromSpecification(metadata, genericContext ?? GenericContext.Empty, (SRM.TypeSpecificationHandle)type.Handle, 0);
default:

Loading…
Cancel
Save