From de3ffa28510428ba1a486c48b72ae42bddbdef5d Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 14 Jul 2018 17:13:35 +0200 Subject: [PATCH] Adjust ILSpy to type system changes. --- ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs | 2 +- ILSpy/Analyzers/Builtin/MethodUsesAnalyzer.cs | 11 ++++++----- ILSpy/Languages/CSharpLanguage.cs | 9 +++++---- ILSpy/Languages/ILAstLanguage.cs | 2 +- ILSpy/MainWindow.xaml.cs | 8 +++----- ILSpy/TextView/DecompilerTextView.cs | 6 +----- ILSpy/TreeNodes/BaseTypesEntryNode.cs | 2 +- 7 files changed, 18 insertions(+), 22 deletions(-) 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();