Browse Source

Fix namespace resolving bug in MetadataResolver

pull/1198/head
Siegfried Pammer 7 years ago
parent
commit
a668567e86
  1. 35
      ICSharpCode.Decompiler/Metadata/MetadataResolver.cs

35
ICSharpCode.Decompiler/Metadata/MetadataResolver.cs

@ -1,12 +1,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Reflection.Metadata; using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335; using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;
using System.Text;
using System.Threading.Tasks;
using ICSharpCode.Decompiler.Util; using ICSharpCode.Decompiler.Util;
using SRM = System.Reflection.Metadata; using SRM = System.Reflection.Metadata;
@ -143,28 +141,35 @@ namespace ICSharpCode.Decompiler.Metadata
TypeDefinition ResolveTypeInOtherAssembly(AssemblyReferenceHandle asm, string ns, string typeName) TypeDefinition ResolveTypeInOtherAssembly(AssemblyReferenceHandle asm, string ns, string typeName)
{ {
var module = context.ResolveAssembly(new AssemblyReference(context.CurrentModule, (AssemblyReferenceHandle)tr.ResolutionScope)); var module = context.ResolveAssembly(new AssemblyReference(context.CurrentModule, asm));
var moduleMetadata = module.Metadata; if (module == null)
var @namespace = ResolveNamespace(moduleMetadata, ns.Split('.')); return default;
if (@namespace == null) var @namespace = ResolveNamespace(module.Metadata, ns);
throw new NotSupportedException(); Debug.Assert(@namespace != null);
var type = FindTypeInNamespace(moduleMetadata, @namespace.Value, typeName); var type = FindTypeInNamespace(module.Metadata, @namespace.Value, typeName);
if (type.IsNil) Debug.Assert(!type.IsNil);
throw new NotSupportedException();
return new TypeDefinition(module, type); return new TypeDefinition(module, type);
} }
} }
static NamespaceDefinition? ResolveNamespace(MetadataReader metadata, string[] namespaceParts) static NamespaceDefinition? ResolveNamespace(MetadataReader metadata, string @namespace)
{ {
var currentNamespace = metadata.GetNamespaceDefinitionRoot(); var currentNamespace = metadata.GetNamespaceDefinitionRoot();
for (int i = 0; i < namespaceParts.Length; i++) { int startIndex = 0;
string identifier = namespaceParts[i]; int dotIndex;
do {
dotIndex = @namespace.IndexOf('.', startIndex);
string identifier = dotIndex == -1 ? @namespace : @namespace.Substring(0, dotIndex);
var next = currentNamespace.NamespaceDefinitions.FirstOrDefault(ns => metadata.StringComparer.Equals(ns, identifier)); var next = currentNamespace.NamespaceDefinitions.FirstOrDefault(ns => metadata.StringComparer.Equals(ns, identifier));
if (next.IsNil) if (next.IsNil)
return null; return null;
currentNamespace = metadata.GetNamespaceDefinition(next); currentNamespace = metadata.GetNamespaceDefinition(next);
} startIndex = dotIndex + 1;
} while (dotIndex > 0);
return currentNamespace; return currentNamespace;
} }

Loading…
Cancel
Save