Browse Source

Implement nested type forwarders.

pull/1198/head
Siegfried Pammer 8 years ago
parent
commit
d33348dbe1
  1. 45
      ICSharpCode.Decompiler/TypeSystem/MetadataAssembly.cs

45
ICSharpCode.Decompiler/TypeSystem/MetadataAssembly.cs

@ -558,27 +558,8 @@ namespace ICSharpCode.Decompiler.TypeSystem
IType ResolveForwardedType(ExportedType forwarder) IType ResolveForwardedType(ExportedType forwarder)
{ {
IAssembly assembly; IAssembly assembly = ResolveAssembly(forwarder);
switch (forwarder.Implementation.Kind) { Debug.Assert(assembly != null);
case HandleKind.AssemblyFile:
assembly = this;
break;
case HandleKind.ExportedType:
throw new NotImplementedException();
case HandleKind.AssemblyReference:
var asmRef = metadata.GetAssemblyReference((AssemblyReferenceHandle)forwarder.Implementation);
string shortName = metadata.GetString(asmRef.Name);
assembly = null;
foreach (var asm in Compilation.Assemblies) {
if (string.Equals(asm.AssemblyName, shortName, StringComparison.OrdinalIgnoreCase)) {
assembly = asm;
break;
}
}
break;
default:
throw new NotSupportedException();
}
var typeName = forwarder.GetFullTypeName(metadata); var typeName = forwarder.GetFullTypeName(metadata);
using (var busyLock = BusyManager.Enter(this)) { using (var busyLock = BusyManager.Enter(this)) {
if (busyLock.Success) { if (busyLock.Success) {
@ -589,6 +570,28 @@ namespace ICSharpCode.Decompiler.TypeSystem
} }
} }
return new UnknownType(typeName); return new UnknownType(typeName);
IAssembly ResolveAssembly(ExportedType type)
{
switch (type.Implementation.Kind) {
case HandleKind.AssemblyFile:
return this;
case HandleKind.ExportedType:
var outerType = metadata.GetExportedType((ExportedTypeHandle)type.Implementation);
return ResolveAssembly(outerType);
case HandleKind.AssemblyReference:
var asmRef = metadata.GetAssemblyReference((AssemblyReferenceHandle)type.Implementation);
string shortName = metadata.GetString(asmRef.Name);
foreach (var asm in Compilation.Assemblies) {
if (string.Equals(asm.AssemblyName, shortName, StringComparison.OrdinalIgnoreCase)) {
return asm;
}
}
return null;
default:
throw new NotSupportedException();
}
}
} }
#endregion #endregion

Loading…
Cancel
Save