Browse Source

Merge support for type forwarders into newdecompiler

pull/850/head
Daniel Grunwald 8 years ago
parent
commit
304a258379
  1. 37
      ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs

37
ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs

@ -45,15 +45,48 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -45,15 +45,48 @@ namespace ICSharpCode.Decompiler.TypeSystem
typeReferenceCecilLoader.SetCurrentModule(moduleDefinition);
IUnresolvedAssembly mainAssembly = cecilLoader.LoadModule(moduleDefinition);
var referencedAssemblies = new List<IUnresolvedAssembly>();
foreach (var asmRef in moduleDefinition.AssemblyReferences) {
var assemblyReferenceQueue = new Queue<AssemblyNameReference>(moduleDefinition.AssemblyReferences);
var processedAssemblyReferences = new HashSet<AssemblyNameReference>(AssemblyNameReferenceComparer.Instance);
while (assemblyReferenceQueue.Count > 0) {
var asmRef = assemblyReferenceQueue.Dequeue();
if (!processedAssemblyReferences.Add(asmRef))
continue;
var asm = moduleDefinition.AssemblyResolver.Resolve(asmRef);
if (asm != null)
if (asm != null) {
referencedAssemblies.Add(cecilLoader.LoadAssembly(asm));
foreach (var forwarder in asm.MainModule.ExportedTypes) {
if (!forwarder.IsForwarder || !(forwarder.Scope is AssemblyNameReference forwarderRef)) continue;
assemblyReferenceQueue.Enqueue(forwarderRef);
}
}
}
compilation = new SimpleCompilation(mainAssembly, referencedAssemblies);
if (compilation.FindType(KnownTypeCode.Void).Kind == TypeKind.Unknown || compilation.FindType(KnownTypeCode.Void).Kind == TypeKind.Unknown) {
referencedAssemblies.Add(MinimalCorlib.Instance);
compilation = new SimpleCompilation(mainAssembly, referencedAssemblies);
}
context = new SimpleTypeResolveContext(compilation.MainAssembly);
}
class AssemblyNameReferenceComparer : IEqualityComparer<AssemblyNameReference>
{
public static readonly AssemblyNameReferenceComparer Instance = new AssemblyNameReferenceComparer();
public bool Equals(AssemblyNameReference x, AssemblyNameReference y)
{
if (x == y)
return true;
if (x == null || y == null)
return false;
return x.FullName.Equals(y.FullName);
}
public int GetHashCode(AssemblyNameReference obj)
{
return obj.FullName.GetHashCode();
}
}
public ICompilation Compilation {
get { return compilation; }
}

Loading…
Cancel
Save