diff --git a/ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs b/ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs
index 602cc3f73..351960710 100644
--- a/ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs
+++ b/ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs
@@ -487,7 +487,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
/// * May return specialized members, where generics are involved.
/// * Other types of handles that don't correspond to TS entities, will return null.
///
- public IEntity ResolveEntity(EntityHandle entityHandle, GenericContext context)
+ public IEntity ResolveEntity(EntityHandle entityHandle, GenericContext context = default)
{
switch (entityHandle.Kind) {
case HandleKind.TypeReference:
diff --git a/ILSpy/Analyzers/Builtin/MethodUsesAnalyzer.cs b/ILSpy/Analyzers/Builtin/MethodUsesAnalyzer.cs
index 3fd348f24..2a6e31f61 100644
--- a/ILSpy/Analyzers/Builtin/MethodUsesAnalyzer.cs
+++ b/ILSpy/Analyzers/Builtin/MethodUsesAnalyzer.cs
@@ -48,12 +48,13 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin
IEnumerable ScanMethod(IMethod analyzedMethod, MethodDefinitionHandle handle, AnalyzerContext context)
{
- var module = analyzedMethod.ParentModule.PEFile;
- var md = module.Metadata.GetMethodDefinition(handle);
+ var module = (MetadataModule)analyzedMethod.ParentModule;
+ var md = module.PEFile.Metadata.GetMethodDefinition(handle);
if (!md.HasBody()) yield break;
- var blob = module.Reader.GetMethodBody(md.RelativeVirtualAddress).GetILReader();
+ var blob = module.PEFile.Reader.GetMethodBody(md.RelativeVirtualAddress).GetILReader();
var visitor = new TypeDefinitionCollector();
+ var genericContext = new Decompiler.TypeSystem.GenericContext(); // type parameters don't matter for this analyzer
while (blob.RemainingBytes > 0) {
var opCode = blob.DecodeOpCode();
@@ -71,13 +72,13 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin
case HandleKind.TypeDefinition:
case HandleKind.TypeReference:
case HandleKind.TypeSpecification:
- context.TypeSystem.ResolveAsType(member).AcceptVisitor(visitor);
+ module.ResolveType(member, genericContext).AcceptVisitor(visitor);
break;
case HandleKind.MethodDefinition:
case HandleKind.MethodSpecification:
case HandleKind.MemberReference:
case HandleKind.FieldDefinition:
- var m = context.TypeSystem.ResolveAsMember(member);
+ var m = module.ResolveMethod(member, genericContext);
if (m != null)
yield return m;
break;
diff --git a/ILSpy/Languages/CSharpLanguage.cs b/ILSpy/Languages/CSharpLanguage.cs
index 2d831364c..8ae064a5c 100644
--- a/ILSpy/Languages/CSharpLanguage.cs
+++ b/ILSpy/Languages/CSharpLanguage.cs
@@ -135,7 +135,7 @@ namespace ICSharpCode.ILSpy
AddReferenceWarningMessage(assembly, output);
WriteCommentLine(output, TypeToString(method.DeclaringType, includeNamespace: true));
CSharpDecompiler decompiler = CreateDecompiler(assembly, options);
- var methodDefinition = decompiler.TypeSystem.ResolveAsMethod(method.MetadataToken);
+ var methodDefinition = decompiler.TypeSystem.MainModule.ResolveEntity(method.MetadataToken) as IMethod;
if (methodDefinition.IsConstructor && methodDefinition.DeclaringType.IsReferenceType != false) {
var members = CollectFieldsAndCtors(methodDefinition.DeclaringTypeDefinition, methodDefinition.IsStatic);
decompiler.AstTransforms.Add(new SelectCtorTransform(methodDefinition));
@@ -215,7 +215,8 @@ namespace ICSharpCode.ILSpy
WriteCode(output, options.DecompilerSettings, decompiler.Decompile(field.MetadataToken), decompiler.TypeSystem);
} else {
var members = CollectFieldsAndCtors(field.DeclaringTypeDefinition, field.IsStatic);
- decompiler.AstTransforms.Add(new SelectFieldTransform(decompiler.TypeSystem.ResolveAsField(field.MetadataToken)));
+ var resolvedField = decompiler.TypeSystem.MainModule.GetDefinition((FieldDefinitionHandle)field.MetadataToken);
+ decompiler.AstTransforms.Add(new SelectFieldTransform(resolvedField));
WriteCode(output, options.DecompilerSettings, decompiler.Decompile(members), decompiler.TypeSystem);
}
}
@@ -341,7 +342,7 @@ namespace ICSharpCode.ILSpy
var corHeader = module.Reader.PEHeaders.CorHeader;
var entrypointHandle = MetadataTokenHelpers.EntityHandleOrNil(corHeader.EntryPointTokenOrRelativeVirtualAddress);
if (!entrypointHandle.IsNil && entrypointHandle.Kind == HandleKind.MethodDefinition) {
- var entrypoint = typeSystem.ResolveAsMethod(entrypointHandle);
+ var entrypoint = typeSystem.MainModule.ResolveMethod(entrypointHandle, new Decompiler.TypeSystem.GenericContext());
if (entrypoint != null) {
output.Write("// Entry point: ");
output.WriteReference(entrypoint, entrypoint.DeclaringType.FullName + "." + entrypoint.Name);
@@ -362,7 +363,7 @@ namespace ICSharpCode.ILSpy
}
output.WriteLine();
- CSharpDecompiler decompiler = new CSharpDecompiler(typeSystem, assemblyResolver, options.DecompilerSettings);
+ CSharpDecompiler decompiler = new CSharpDecompiler(typeSystem, options.DecompilerSettings);
decompiler.CancellationToken = options.CancellationToken;
SyntaxTree st;
if (options.FullDecompilation) {
diff --git a/ILSpy/Languages/ILAstLanguage.cs b/ILSpy/Languages/ILAstLanguage.cs
index d3cd5a532..fa278e490 100644
--- a/ILSpy/Languages/ILAstLanguage.cs
+++ b/ILSpy/Languages/ILAstLanguage.cs
@@ -121,7 +121,7 @@ namespace ICSharpCode.ILSpy
var methodBody = module.Reader.GetMethodBody(methodDef.RelativeVirtualAddress);
ILFunction il = reader.ReadIL((SRM.MethodDefinitionHandle)method.MetadataToken, methodBody, cancellationToken: options.CancellationToken);
var namespaces = new HashSet();
- var decompiler = new CSharpDecompiler(typeSystem, assemblyResolver, options.DecompilerSettings) { CancellationToken = options.CancellationToken };
+ var decompiler = new CSharpDecompiler(typeSystem, options.DecompilerSettings) { CancellationToken = options.CancellationToken };
ILTransformContext context = decompiler.CreateILTransformContext(il);
context.Stepper.StepLimit = options.StepLimit;
context.Stepper.IsDebug = options.IsDebug;
diff --git a/ILSpy/MainWindow.xaml.cs b/ILSpy/MainWindow.xaml.cs
index dd197391c..77bd8730a 100644
--- a/ILSpy/MainWindow.xaml.cs
+++ b/ILSpy/MainWindow.xaml.cs
@@ -289,7 +289,8 @@ namespace ICSharpCode.ILSpy
foreach (LoadedAssembly asm in commandLineLoadedAssemblies) {
var def = asm.GetPEFileOrNull();
if (def != null) {
- var mr = IdStringProvider.FindEntity(args.NavigateTo, new SimpleCompilation(def, MinimalCorlib.Instance).TypeResolveContext);
+ var compilation = new SimpleCompilation(def, MinimalCorlib.Instance);
+ var mr = IdStringProvider.FindEntity(args.NavigateTo, new SimpleTypeResolveContext(compilation));
if (mr != null) {
found = true;
// Defer JumpToReference call to allow an assembly that was loaded while
@@ -637,10 +638,7 @@ namespace ICSharpCode.ILSpy
break;
case ValueTuple unresolvedEntity:
var typeSystem = new DecompilerTypeSystem(unresolvedEntity.Item1, unresolvedEntity.Item1.GetAssemblyResolver());
- if (unresolvedEntity.Item2.Kind.IsTypeKind())
- reference = typeSystem.ResolveAsType(unresolvedEntity.Item2).GetDefinition();
- else
- reference = typeSystem.ResolveAsMember(unresolvedEntity.Item2);
+ reference = typeSystem.MainModule.ResolveEntity(unresolvedEntity.Item2);
goto default;
default:
ILSpyTreeNode treeNode = FindTreeNode(reference);
diff --git a/ILSpy/TextView/DecompilerTextView.cs b/ILSpy/TextView/DecompilerTextView.cs
index b72adca48..06f56dc17 100644
--- a/ILSpy/TextView/DecompilerTextView.cs
+++ b/ILSpy/TextView/DecompilerTextView.cs
@@ -211,11 +211,7 @@ namespace ICSharpCode.ILSpy.TextView
return CreateTextBlockForEntity(entity);
} else if (segment.Reference is ValueTuple unresolvedEntity) {
var typeSystem = new DecompilerTypeSystem(unresolvedEntity.Item1, unresolvedEntity.Item1.GetAssemblyResolver());
- IEntity resolved;
- if (unresolvedEntity.Item2.Kind.IsTypeKind())
- resolved = typeSystem.ResolveAsType(unresolvedEntity.Item2).GetDefinition();
- else
- resolved = typeSystem.ResolveAsMember(unresolvedEntity.Item2);
+ IEntity resolved = typeSystem.MainModule.ResolveEntity(unresolvedEntity.Item2);
if (resolved == null)
return null;
return CreateTextBlockForEntity(resolved);
diff --git a/ILSpy/TreeNodes/BaseTypesEntryNode.cs b/ILSpy/TreeNodes/BaseTypesEntryNode.cs
index 183d90999..5b2ef2fff 100644
--- a/ILSpy/TreeNodes/BaseTypesEntryNode.cs
+++ b/ILSpy/TreeNodes/BaseTypesEntryNode.cs
@@ -50,7 +50,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
ITypeDefinition TryResolve(PEFile module, EntityHandle handle, IType type, bool mayRetry = true)
{
DecompilerTypeSystem typeSystem = new DecompilerTypeSystem(module, module.GetAssemblyResolver());
- var t = typeSystem.ResolveAsType(handle).GetDefinition();
+ var t = typeSystem.MainModule.ResolveEntity(handle) as ITypeDefinition;
if (t != null) {
showExpander = t.DirectBaseTypes.Any();
var other = t.ParentModule.PEFile.GetTypeSystemOrNull();