Browse Source

Refactor GetDeclaringAssembly + Add support for module references.

pull/1030/head
Siegfried Pammer 7 years ago
parent
commit
1f9472e10e
  1. 10
      ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs
  2. 6
      ICSharpCode.Decompiler/TypeSystem/Implementation/TypeSpecification.cs
  3. 7
      ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs

10
ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

@ -89,16 +89,20 @@ namespace ICSharpCode.Decompiler.Metadata @@ -89,16 +89,20 @@ namespace ICSharpCode.Decompiler.Metadata
return Disassembler.DisassemblerHelpers.Escape(name);
}
public static AssemblyReferenceHandle GetDeclaringAssembly(this TypeReferenceHandle handle, MetadataReader reader)
public static TypeSystem.IAssemblyReference GetDeclaringAssembly(this TypeReferenceHandle handle, MetadataReader reader)
{
var tr = reader.GetTypeReference(handle);
switch (tr.ResolutionScope.Kind) {
case HandleKind.TypeReference:
return ((TypeReferenceHandle)tr.ResolutionScope).GetDeclaringAssembly(reader);
case HandleKind.AssemblyReference:
return (AssemblyReferenceHandle)tr.ResolutionScope;
var asmRef = reader.GetAssemblyReference((AssemblyReferenceHandle)tr.ResolutionScope);
return new DefaultAssemblyReference(reader.GetString(asmRef.Name));
case HandleKind.ModuleReference:
var modRef = reader.GetModuleReference((ModuleReferenceHandle)tr.ResolutionScope);
return new DefaultAssemblyReference(reader.GetString(modRef.Name));
default:
return default;
return DefaultAssemblyReference.CurrentAssembly;
}
}

6
ICSharpCode.Decompiler/TypeSystem/Implementation/TypeSpecification.cs

@ -184,11 +184,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation @@ -184,11 +184,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
public ITypeReference GetTypeFromReference(SRM.MetadataReader reader, SRM.TypeReferenceHandle handle, byte rawTypeKind)
{
var asmref = handle.GetDeclaringAssembly(reader);
if (asmref.IsNil)
return new GetClassTypeReference(handle.GetFullTypeName(reader), DefaultAssemblyReference.CurrentAssembly);
var asm = reader.GetAssemblyReference(asmref);
return new GetClassTypeReference(handle.GetFullTypeName(reader), new DefaultAssemblyReference(reader.GetString(asm.Name)));
return new GetClassTypeReference(handle.GetFullTypeName(reader), handle.GetDeclaringAssembly(reader));
}
public ITypeReference GetTypeFromSpecification(SRM.MetadataReader reader, Unit genericContext, SRM.TypeSpecificationHandle handle, byte rawTypeKind)

7
ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs

@ -132,13 +132,8 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -132,13 +132,8 @@ namespace ICSharpCode.Decompiler.TypeSystem
public IType GetTypeFromReference(SRM.MetadataReader reader, SRM.TypeReferenceHandle handle, byte rawTypeKind)
{
var asmref = handle.GetDeclaringAssembly(reader);
IAssemblyReference nrAsmRef;
if (asmref.IsNil)
nrAsmRef = DefaultAssemblyReference.CurrentAssembly;
else
nrAsmRef = new DefaultAssemblyReference(reader.GetString(reader.GetAssemblyReference(asmref).Name));
bool? isReferenceType = IsReferenceType(reader, handle, rawTypeKind);
var gctr = new GetClassTypeReference(handle.GetFullTypeName(reader), nrAsmRef, isReferenceType);
var gctr = new GetClassTypeReference(handle.GetFullTypeName(reader), handle.GetDeclaringAssembly(reader), isReferenceType);
return gctr.Resolve(assembly != null ? new SimpleTypeResolveContext(assembly) : new SimpleTypeResolveContext(compilation));
}

Loading…
Cancel
Save