Browse Source

Adjust ILSpy to type system changes.

pull/1030/head
Daniel Grunwald 7 years ago
parent
commit
de3ffa2851
  1. 2
      ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs
  2. 11
      ILSpy/Analyzers/Builtin/MethodUsesAnalyzer.cs
  3. 9
      ILSpy/Languages/CSharpLanguage.cs
  4. 2
      ILSpy/Languages/ILAstLanguage.cs
  5. 8
      ILSpy/MainWindow.xaml.cs
  6. 6
      ILSpy/TextView/DecompilerTextView.cs
  7. 2
      ILSpy/TreeNodes/BaseTypesEntryNode.cs

2
ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs

@ -487,7 +487,7 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -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 <c>null</c>.
/// </remarks>
public IEntity ResolveEntity(EntityHandle entityHandle, GenericContext context)
public IEntity ResolveEntity(EntityHandle entityHandle, GenericContext context = default)
{
switch (entityHandle.Kind) {
case HandleKind.TypeReference:

11
ILSpy/Analyzers/Builtin/MethodUsesAnalyzer.cs

@ -48,12 +48,13 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin @@ -48,12 +48,13 @@ namespace ICSharpCode.ILSpy.Analyzers.Builtin
IEnumerable<IEntity> 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 @@ -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;

9
ILSpy/Languages/CSharpLanguage.cs

@ -135,7 +135,7 @@ namespace ICSharpCode.ILSpy @@ -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 @@ -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 @@ -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 @@ -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) {

2
ILSpy/Languages/ILAstLanguage.cs

@ -121,7 +121,7 @@ namespace ICSharpCode.ILSpy @@ -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<string>();
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;

8
ILSpy/MainWindow.xaml.cs

@ -289,7 +289,8 @@ namespace ICSharpCode.ILSpy @@ -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 @@ -637,10 +638,7 @@ namespace ICSharpCode.ILSpy
break;
case ValueTuple<PEFile, System.Reflection.Metadata.EntityHandle> 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);

6
ILSpy/TextView/DecompilerTextView.cs

@ -211,11 +211,7 @@ namespace ICSharpCode.ILSpy.TextView @@ -211,11 +211,7 @@ namespace ICSharpCode.ILSpy.TextView
return CreateTextBlockForEntity(entity);
} else if (segment.Reference is ValueTuple<PEFile, System.Reflection.Metadata.EntityHandle> 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);

2
ILSpy/TreeNodes/BaseTypesEntryNode.cs

@ -50,7 +50,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -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();

Loading…
Cancel
Save