Browse Source

Extract the shared disassembler setup in ILLanguage

All six member-level Decompile* entry points wired the same assembly
resolver and debug info onto a fresh disassembler before dispatching;
the module-aware CreateDisassembler overload now owns that setup.

Assisted-by: Claude:claude-fable-5[1m]:Claude Code
pull/3759/head
Siegfried Pammer 4 weeks ago
parent
commit
160b76b65c
  1. 36
      ILSpy/Languages/ILLanguage.cs

36
ILSpy/Languages/ILLanguage.cs

@ -62,30 +62,36 @@ namespace ILSpy.Languages @@ -62,30 +62,36 @@ namespace ILSpy.Languages
};
}
public override void DecompileMethod(IMethod method, ITextOutput output, DecompilationOptions options)
/// <summary>
/// Creates a disassembler wired to <paramref name="module"/>'s assembly resolver and
/// debug info — the setup shared by every member-level Decompile* entry point.
/// </summary>
ReflectionDisassembler CreateDisassembler(ITextOutput output, DecompilationOptions options, MetadataFile module)
{
var dis = CreateDisassembler(output, options);
MetadataFile module = method.ParentModule!.MetadataFile!;
dis.AssemblyResolver = module.GetAssemblyResolver();
dis.DebugInfo = module.GetDebugInfoOrNull();
return dis;
}
public override void DecompileMethod(IMethod method, ITextOutput output, DecompilationOptions options)
{
MetadataFile module = method.ParentModule!.MetadataFile!;
var dis = CreateDisassembler(output, options, module);
dis.DisassembleMethod(module, (MethodDefinitionHandle)method.MetadataToken);
}
public override void DecompileField(IField field, ITextOutput output, DecompilationOptions options)
{
var dis = CreateDisassembler(output, options);
MetadataFile module = field.ParentModule!.MetadataFile!;
dis.AssemblyResolver = module.GetAssemblyResolver();
dis.DebugInfo = module.GetDebugInfoOrNull();
var dis = CreateDisassembler(output, options, module);
dis.DisassembleField(module, (FieldDefinitionHandle)field.MetadataToken);
}
public override void DecompileProperty(IProperty property, ITextOutput output, DecompilationOptions options)
{
var dis = CreateDisassembler(output, options);
MetadataFile module = property.ParentModule!.MetadataFile!;
dis.AssemblyResolver = module.GetAssemblyResolver();
dis.DebugInfo = module.GetDebugInfoOrNull();
var dis = CreateDisassembler(output, options, module);
dis.DisassembleProperty(module, (PropertyDefinitionHandle)property.MetadataToken);
var pd = module.Metadata.GetPropertyDefinition((PropertyDefinitionHandle)property.MetadataToken);
var accessors = pd.GetAccessors();
@ -104,10 +110,8 @@ namespace ILSpy.Languages @@ -104,10 +110,8 @@ namespace ILSpy.Languages
public override void DecompileEvent(IEvent ev, ITextOutput output, DecompilationOptions options)
{
var dis = CreateDisassembler(output, options);
MetadataFile module = ev.ParentModule!.MetadataFile!;
dis.AssemblyResolver = module.GetAssemblyResolver();
dis.DebugInfo = module.GetDebugInfoOrNull();
var dis = CreateDisassembler(output, options, module);
dis.DisassembleEvent(module, (EventDefinitionHandle)ev.MetadataToken);
var ed = module.Metadata.GetEventDefinition((EventDefinitionHandle)ev.MetadataToken);
@ -131,21 +135,17 @@ namespace ILSpy.Languages @@ -131,21 +135,17 @@ namespace ILSpy.Languages
public override void DecompileType(ITypeDefinition type, ITextOutput output, DecompilationOptions options)
{
var dis = CreateDisassembler(output, options);
MetadataFile module = type.ParentModule!.MetadataFile!;
dis.AssemblyResolver = module.GetAssemblyResolver();
dis.DebugInfo = module.GetDebugInfoOrNull();
var dis = CreateDisassembler(output, options, module);
dis.DisassembleType(module, (TypeDefinitionHandle)type.MetadataToken);
}
public override void DecompileNamespace(string nameSpace, IEnumerable<ITypeDefinition> types, ITextOutput output, DecompilationOptions options)
{
var dis = CreateDisassembler(output, options);
MetadataFile module = types.FirstOrDefault()?.ParentModule!.MetadataFile!;
MetadataFile? module = types.FirstOrDefault()?.ParentModule!.MetadataFile;
if (module == null)
return;
dis.AssemblyResolver = module.GetAssemblyResolver();
dis.DebugInfo = module.GetDebugInfoOrNull();
var dis = CreateDisassembler(output, options, module);
dis.DisassembleNamespace(nameSpace, module, types.Select(t => (TypeDefinitionHandle)t.MetadataToken));
}

Loading…
Cancel
Save