From 225a3f9f92f4307644f15b696145639f1fd8d44e Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 23 Jun 2018 23:05:40 +0200 Subject: [PATCH] Fix typedef names in IL view --- .../TypeSystem/TypeProvider.cs | 37 ++++++++++++------- ILSpy/Languages/Language.cs | 35 ++++++------------ 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs b/ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs index 0c57abf10..473dd8c94 100644 --- a/ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs +++ b/ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs @@ -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 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 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) diff --git a/ILSpy/Languages/Language.cs b/ILSpy/Languages/Language.cs index 259c4f252..e9b53b69b 100644 --- a/ILSpy/Languages/Language.cs +++ b/ILSpy/Languages/Language.cs @@ -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: