|
|
|
@ -23,6 +23,7 @@ using System.ComponentModel;
@@ -23,6 +23,7 @@ using System.ComponentModel;
|
|
|
|
|
using System.Diagnostics; |
|
|
|
|
using System.IO; |
|
|
|
|
using System.Linq; |
|
|
|
|
using System.Reflection.Metadata; |
|
|
|
|
using System.Threading.Tasks; |
|
|
|
|
using System.Windows; |
|
|
|
|
using System.Windows.Controls; |
|
|
|
@ -287,15 +288,36 @@ namespace ICSharpCode.ILSpy
@@ -287,15 +288,36 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
ITypeReference typeRef = null; |
|
|
|
|
IMemberReference memberRef = null; |
|
|
|
|
if (args.NavigateTo.StartsWith("T:", StringComparison.Ordinal)) { |
|
|
|
|
typeRef = IdStringProvider.ParseTypeName(args.NavigateTo); |
|
|
|
|
} else { |
|
|
|
|
memberRef = IdStringProvider.ParseMemberIdString(args.NavigateTo); |
|
|
|
|
typeRef = memberRef.DeclaringTypeReference; |
|
|
|
|
} |
|
|
|
|
foreach (LoadedAssembly asm in commandLineLoadedAssemblies) { |
|
|
|
|
var def = asm.GetPEFileOrNull(); |
|
|
|
|
if (def != null) { |
|
|
|
|
var compilation = new SimpleCompilation(def, MinimalCorlib.Instance); |
|
|
|
|
var mr = IdStringProvider.FindEntity(args.NavigateTo, new SimpleTypeResolveContext(compilation)); |
|
|
|
|
if (mr != null) { |
|
|
|
|
var module = asm.GetPEFileOrNull(); |
|
|
|
|
if (CanResolveTypeInPEFile(module, typeRef, out var typeHandle)) { |
|
|
|
|
IEntity mr = null; |
|
|
|
|
if (typeHandle.Kind == HandleKind.ExportedType) { |
|
|
|
|
var decompilerTypeSystem = new DecompilerTypeSystem(module, module.GetAssemblyResolver()); |
|
|
|
|
if (memberRef == null) { |
|
|
|
|
mr = typeRef.Resolve(new SimpleTypeResolveContext(decompilerTypeSystem)) as ITypeDefinition; |
|
|
|
|
} else { |
|
|
|
|
mr = memberRef.Resolve(new SimpleTypeResolveContext(decompilerTypeSystem)); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
var compilation = new SimpleCompilation(module, MinimalCorlib.Instance); |
|
|
|
|
if (memberRef == null) { |
|
|
|
|
mr = ((MetadataModule)compilation.MainModule).GetDefinition((TypeDefinitionHandle)typeHandle); |
|
|
|
|
} else { |
|
|
|
|
mr = memberRef.Resolve(new SimpleTypeResolveContext(compilation)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (mr != null && mr.ParentModule.PEFile != null) { |
|
|
|
|
found = true; |
|
|
|
|
// Defer JumpToReference call to allow an assembly that was loaded while
|
|
|
|
|
// resolving a type-forwarder in FindMemberByKey to appear in the assembly list.
|
|
|
|
|
Dispatcher.BeginInvoke(new Action(() => JumpToReference(mr)), DispatcherPriority.Loaded); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -320,6 +342,30 @@ namespace ICSharpCode.ILSpy
@@ -320,6 +342,30 @@ namespace ICSharpCode.ILSpy
|
|
|
|
|
commandLineLoadedAssemblies.Clear(); // clear references once we don't need them anymore
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private bool CanResolveTypeInPEFile(PEFile module, ITypeReference typeRef, out EntityHandle typeHandle) |
|
|
|
|
{ |
|
|
|
|
switch (typeRef) { |
|
|
|
|
case GetPotentiallyNestedClassTypeReference topLevelType: |
|
|
|
|
typeHandle = topLevelType.ResolveInPEFile(module); |
|
|
|
|
return !typeHandle.IsNil; |
|
|
|
|
case NestedTypeReference nestedType: |
|
|
|
|
if (!CanResolveTypeInPEFile(module, nestedType.DeclaringTypeReference, out typeHandle)) |
|
|
|
|
return false; |
|
|
|
|
if (typeHandle.Kind == HandleKind.ExportedType) |
|
|
|
|
return true; |
|
|
|
|
var typeDef = module.Metadata.GetTypeDefinition((TypeDefinitionHandle)typeHandle); |
|
|
|
|
typeHandle = typeDef.GetNestedTypes().FirstOrDefault(t => { |
|
|
|
|
var td = module.Metadata.GetTypeDefinition(t); |
|
|
|
|
var typeName = ReflectionHelper.SplitTypeParameterCountFromReflectionName(module.Metadata.GetString(td.Name), out int typeParameterCount); |
|
|
|
|
return nestedType.AdditionalTypeParameterCount == typeParameterCount && nestedType.Name == typeName; |
|
|
|
|
}); |
|
|
|
|
return !typeHandle.IsNil; |
|
|
|
|
default: |
|
|
|
|
typeHandle = default; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void MainWindow_Loaded(object sender, RoutedEventArgs e) |
|
|
|
|
{ |
|
|
|
|
ILSpySettings spySettings = this.spySettings; |
|
|
|
|