Browse Source

Clean up node classes.

pull/3149/head
Siegfried Pammer 1 year ago
parent
commit
12cbf14106
  1. 10
      ICSharpCode.Decompiler/Metadata/PEFile.cs
  2. 47
      ICSharpCode.ILSpyX/LoadedAssembly.cs
  3. 5
      ILSpy/Metadata/DebugDirectoryTreeNode.cs
  4. 77
      ILSpy/Metadata/DebugMetadataTablesTreeNode.cs
  5. 71
      ILSpy/Metadata/DebugMetadataTreeNode.cs
  6. 73
      ILSpy/Metadata/MetadataTablesTreeNode.cs
  7. 39
      ILSpy/Metadata/MetadataTreeNode.cs
  8. 13
      ILSpy/TreeNodes/AssemblyTreeNode.cs

10
ICSharpCode.Decompiler/Metadata/PEFile.cs

@ -34,7 +34,15 @@ namespace ICSharpCode.Decompiler.Metadata
{ {
public class MetadataFile public class MetadataFile
{ {
public enum MetadataFileKind
{
PortableExecutable,
ProgramDebugDatabase,
Metadata
}
public string FileName { get; } public string FileName { get; }
public MetadataFileKind Kind { get; }
public MetadataReader Metadata { get; } public MetadataReader Metadata { get; }
public virtual int MetadataOffset { get; } public virtual int MetadataOffset { get; }
@ -46,6 +54,7 @@ namespace ICSharpCode.Decompiler.Metadata
this.Metadata = metadata.GetMetadataReader(metadataOptions); this.Metadata = metadata.GetMetadataReader(metadataOptions);
this.MetadataOffset = metadataOffset; this.MetadataOffset = metadataOffset;
this.IsEmbedded = isEmbedded; this.IsEmbedded = isEmbedded;
this.Kind = isEmbedded || Path.GetExtension(fileName).Equals(".pdb", StringComparison.OrdinalIgnoreCase) ? MetadataFileKind.ProgramDebugDatabase : MetadataFileKind.Metadata;
} }
private protected MetadataFile(string fileName, PEReader reader, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default) private protected MetadataFile(string fileName, PEReader reader, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default)
@ -55,6 +64,7 @@ namespace ICSharpCode.Decompiler.Metadata
if (!reader.HasMetadata) if (!reader.HasMetadata)
throw new PEFileNotSupportedException("PE file does not contain any managed metadata."); throw new PEFileNotSupportedException("PE file does not contain any managed metadata.");
this.Metadata = reader.GetMetadataReader(metadataOptions); this.Metadata = reader.GetMetadataReader(metadataOptions);
this.Kind = MetadataFileKind.PortableExecutable;
} }
} }

47
ICSharpCode.ILSpyX/LoadedAssembly.cs

@ -268,31 +268,34 @@ namespace ICSharpCode.ILSpyX
if (IsLoaded && !HasLoadError) if (IsLoaded && !HasLoadError)
{ {
var result = GetLoadResultAsync().GetAwaiter().GetResult(); var result = GetLoadResultAsync().GetAwaiter().GetResult();
if (result.PEFile != null) if (result.MetadataFile != null)
{ {
var metadata = result.PEFile.Metadata; switch (result.MetadataFile.Kind)
string? versionOrInfo = null;
if (metadata != null)
{ {
if (metadata.IsAssembly) case MetadataFile.MetadataFileKind.PortableExecutable:
{ var metadata = result.MetadataFile.Metadata;
versionOrInfo = metadata.GetAssemblyDefinition().Version?.ToString(); string? versionOrInfo;
string tfId = GetTargetFrameworkIdAsync().GetAwaiter().GetResult(); if (metadata.IsAssembly)
if (!string.IsNullOrEmpty(tfId)) {
versionOrInfo += ", " + tfId.Replace("Version=", " "); versionOrInfo = metadata.GetAssemblyDefinition().Version?.ToString();
} string tfId = GetTargetFrameworkIdAsync().GetAwaiter().GetResult();
else if (!string.IsNullOrEmpty(tfId))
{ versionOrInfo += ", " + tfId.Replace("Version=", " ");
versionOrInfo = ".netmodule"; }
} else
{
versionOrInfo = ".netmodule";
}
if (versionOrInfo == null)
return ShortName;
return string.Format("{0} ({1})", ShortName, versionOrInfo);
case MetadataFile.MetadataFileKind.ProgramDebugDatabase:
return ShortName + " (Debug Metadata)";
case MetadataFile.MetadataFileKind.Metadata:
return ShortName + " (Metadata)";
default:
return ShortName;
} }
if (versionOrInfo == null)
return ShortName;
return string.Format("{0} ({1})", ShortName, versionOrInfo);
}
else if (result.MetadataFile != null)
{
return ShortName + " (Metadata)";
} }
} }
return ShortName; return ShortName;

5
ILSpy/Metadata/DebugDirectoryTreeNode.cs

@ -74,8 +74,9 @@ namespace ICSharpCode.ILSpy.Metadata
break; break;
case DebugDirectoryEntryType.EmbeddedPortablePdb: case DebugDirectoryEntryType.EmbeddedPortablePdb:
var embeddedPortablePdbReader = module.Reader.ReadEmbeddedPortablePdbDebugDirectoryData(entry).GetMetadataReader(); var embeddedPortablePdbProvider = module.Reader.ReadEmbeddedPortablePdbDebugDirectoryData(entry);
this.Children.Add(new DebugMetadataTreeNode(module)); var embeddedPortablePdbMetadataFile = new MetadataFile(module.FileName, embeddedPortablePdbProvider, isEmbedded: true);
this.Children.Add(new MetadataTreeNode(embeddedPortablePdbMetadataFile, "Debug Metadata (Embedded)"));
break; break;
case DebugDirectoryEntryType.PdbChecksum: case DebugDirectoryEntryType.PdbChecksum:

77
ILSpy/Metadata/DebugMetadataTablesTreeNode.cs

@ -1,77 +0,0 @@
// Copyright (c) 2021 AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.ViewModels;
namespace ICSharpCode.ILSpy.Metadata
{
class DebugMetadataTablesTreeNode : ILSpyTreeNode
{
private MetadataFile metadataFile;
public DebugMetadataTablesTreeNode(MetadataFile metadataFile)
{
this.metadataFile = metadataFile;
this.LazyLoading = true;
}
public override object Text => "Tables";
public override object Icon => Images.Literal;
protected override void LoadChildren()
{
if (ShowTable(TableIndex.Document))
this.Children.Add(new DocumentTableTreeNode(metadataFile));
if (ShowTable(TableIndex.MethodDebugInformation))
this.Children.Add(new MethodDebugInformationTableTreeNode(metadataFile));
if (ShowTable(TableIndex.LocalScope))
this.Children.Add(new LocalScopeTableTreeNode(metadataFile));
if (ShowTable(TableIndex.LocalVariable))
this.Children.Add(new LocalVariableTableTreeNode(metadataFile));
if (ShowTable(TableIndex.LocalConstant))
this.Children.Add(new LocalConstantTableTreeNode(metadataFile));
if (ShowTable(TableIndex.ImportScope))
this.Children.Add(new ImportScopeTableTreeNode(metadataFile));
if (ShowTable(TableIndex.StateMachineMethod))
this.Children.Add(new StateMachineMethodTableTreeNode(metadataFile));
if (ShowTable(TableIndex.CustomDebugInformation))
this.Children.Add(new CustomDebugInformationTableTreeNode(metadataFile));
bool ShowTable(TableIndex table) => !MainWindow.Instance.CurrentDisplaySettings.HideEmptyMetadataTables || metadataFile.Metadata.GetTableRowCount(table) > 0;
}
public override bool View(TabPageModel tabPage)
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
return false;
}
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{
language.WriteCommentLine(output, "Metadata Tables");
}
}
}

71
ILSpy/Metadata/DebugMetadataTreeNode.cs

@ -1,71 +0,0 @@
// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System.Linq;
using System.Reflection.Metadata;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.ViewModels;
namespace ICSharpCode.ILSpy.Metadata
{
class DebugMetadataTreeNode : ILSpyTreeNode
{
private MetadataFile metadataFile;
public DebugMetadataTreeNode(MetadataFile metadataFile)
{
this.metadataFile = metadataFile;
this.Text = "Debug Metadata (" + (metadataFile.IsEmbedded ? "Embedded" : "From portable PDB") + ")";
this.LazyLoading = true;
}
public override object Text { get; }
public override object Icon => Images.Library;
public override bool View(TabPageModel tabPage)
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
return false;
}
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{
language.WriteCommentLine(output, "Debug Metadata");
}
protected override void LoadChildren()
{
this.Children.Add(new DebugMetadataTablesTreeNode(metadataFile));
this.Children.Add(new StringHeapTreeNode(metadataFile));
this.Children.Add(new UserStringHeapTreeNode(metadataFile));
this.Children.Add(new GuidHeapTreeNode(metadataFile));
this.Children.Add(new BlobHeapTreeNode(metadataFile));
}
public MetadataTableTreeNode FindNodeByHandleKind(HandleKind kind)
{
return this.Children.OfType<MetadataTableTreeNode>().SingleOrDefault(x => x.Kind == kind);
}
}
}

73
ILSpy/Metadata/MetadataTablesTreeNode.cs

@ -43,74 +43,11 @@ namespace ICSharpCode.ILSpy.Metadata
protected override void LoadChildren() protected override void LoadChildren()
{ {
if (ShowTable(TableIndex.Module, metadataFile.Metadata)) foreach (var table in Enum.GetValues<TableIndex>())
this.Children.Add(new ModuleTableTreeNode(metadataFile)); {
if (ShowTable(TableIndex.TypeRef, metadataFile.Metadata)) if (ShowTable(table, metadataFile.Metadata))
this.Children.Add(new TypeRefTableTreeNode(metadataFile)); this.Children.Add(CreateTableTreeNode(table, metadataFile));
if (ShowTable(TableIndex.TypeDef, metadataFile.Metadata)) }
this.Children.Add(new TypeDefTableTreeNode(metadataFile));
if (ShowTable(TableIndex.Field, metadataFile.Metadata))
this.Children.Add(new FieldTableTreeNode(metadataFile));
if (ShowTable(TableIndex.MethodDef, metadataFile.Metadata))
this.Children.Add(new MethodTableTreeNode(metadataFile));
if (ShowTable(TableIndex.Param, metadataFile.Metadata))
this.Children.Add(new ParamTableTreeNode(metadataFile));
if (ShowTable(TableIndex.InterfaceImpl, metadataFile.Metadata))
this.Children.Add(new InterfaceImplTableTreeNode(metadataFile));
if (ShowTable(TableIndex.MemberRef, metadataFile.Metadata))
this.Children.Add(new MemberRefTableTreeNode(metadataFile));
if (ShowTable(TableIndex.Constant, metadataFile.Metadata))
this.Children.Add(new ConstantTableTreeNode(metadataFile));
if (ShowTable(TableIndex.CustomAttribute, metadataFile.Metadata))
this.Children.Add(new CustomAttributeTableTreeNode(metadataFile));
if (ShowTable(TableIndex.FieldMarshal, metadataFile.Metadata))
this.Children.Add(new FieldMarshalTableTreeNode(metadataFile));
if (ShowTable(TableIndex.DeclSecurity, metadataFile.Metadata))
this.Children.Add(new DeclSecurityTableTreeNode(metadataFile));
if (ShowTable(TableIndex.ClassLayout, metadataFile.Metadata))
this.Children.Add(new ClassLayoutTableTreeNode(metadataFile));
if (ShowTable(TableIndex.FieldLayout, metadataFile.Metadata))
this.Children.Add(new FieldLayoutTableTreeNode(metadataFile));
if (ShowTable(TableIndex.StandAloneSig, metadataFile.Metadata))
this.Children.Add(new StandAloneSigTableTreeNode(metadataFile));
if (ShowTable(TableIndex.EventMap, metadataFile.Metadata))
this.Children.Add(new EventMapTableTreeNode(metadataFile));
if (ShowTable(TableIndex.Event, metadataFile.Metadata))
this.Children.Add(new EventTableTreeNode(metadataFile));
if (ShowTable(TableIndex.PropertyMap, metadataFile.Metadata))
this.Children.Add(new PropertyMapTableTreeNode(metadataFile));
if (ShowTable(TableIndex.Property, metadataFile.Metadata))
this.Children.Add(new PropertyTableTreeNode(metadataFile));
if (ShowTable(TableIndex.MethodSemantics, metadataFile.Metadata))
this.Children.Add(new MethodSemanticsTableTreeNode(metadataFile));
if (ShowTable(TableIndex.MethodImpl, metadataFile.Metadata))
this.Children.Add(new MethodImplTableTreeNode(metadataFile));
if (ShowTable(TableIndex.ModuleRef, metadataFile.Metadata))
this.Children.Add(new ModuleRefTableTreeNode(metadataFile));
if (ShowTable(TableIndex.TypeSpec, metadataFile.Metadata))
this.Children.Add(new TypeSpecTableTreeNode(metadataFile));
if (ShowTable(TableIndex.ImplMap, metadataFile.Metadata))
this.Children.Add(new ImplMapTableTreeNode(metadataFile));
if (ShowTable(TableIndex.FieldRva, metadataFile.Metadata))
this.Children.Add(new FieldRVATableTreeNode(metadataFile));
if (ShowTable(TableIndex.Assembly, metadataFile.Metadata))
this.Children.Add(new AssemblyTableTreeNode(metadataFile));
if (ShowTable(TableIndex.AssemblyRef, metadataFile.Metadata))
this.Children.Add(new AssemblyRefTableTreeNode(metadataFile));
if (ShowTable(TableIndex.File, metadataFile.Metadata))
this.Children.Add(new FileTableTreeNode(metadataFile));
if (ShowTable(TableIndex.ExportedType, metadataFile.Metadata))
this.Children.Add(new ExportedTypeTableTreeNode(metadataFile));
if (ShowTable(TableIndex.ManifestResource, metadataFile.Metadata))
this.Children.Add(new ManifestResourceTableTreeNode(metadataFile));
if (ShowTable(TableIndex.NestedClass, metadataFile.Metadata))
this.Children.Add(new NestedClassTableTreeNode(metadataFile));
if (ShowTable(TableIndex.GenericParam, metadataFile.Metadata))
this.Children.Add(new GenericParamTableTreeNode(metadataFile));
if (ShowTable(TableIndex.MethodSpec, metadataFile.Metadata))
this.Children.Add(new MethodSpecTableTreeNode(metadataFile));
if (ShowTable(TableIndex.GenericParamConstraint, metadataFile.Metadata))
this.Children.Add(new GenericParamConstraintTableTreeNode(metadataFile));
} }
internal static bool ShowTable(TableIndex table, MetadataReader metadata) => !MainWindow.Instance.CurrentDisplaySettings.HideEmptyMetadataTables || metadata.GetTableRowCount(table) > 0; internal static bool ShowTable(TableIndex table, MetadataReader metadata) => !MainWindow.Instance.CurrentDisplaySettings.HideEmptyMetadataTables || metadata.GetTableRowCount(table) > 0;

39
ILSpy/Metadata/MetadataTreeNode.cs

@ -21,11 +21,11 @@ using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using System.Reflection.Metadata; using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Windows.Data; using System.Windows.Data;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata; using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.Properties;
using ICSharpCode.ILSpy.TreeNodes; using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.ViewModels; using ICSharpCode.ILSpy.ViewModels;
@ -33,17 +33,17 @@ namespace ICSharpCode.ILSpy.Metadata
{ {
class MetadataTreeNode : ILSpyTreeNode class MetadataTreeNode : ILSpyTreeNode
{ {
private readonly PEFile module; private readonly MetadataFile metadataFile;
private AssemblyTreeNode assemblyTreeNode; private readonly string title;
public MetadataTreeNode(PEFile module, AssemblyTreeNode assemblyTreeNode) public MetadataTreeNode(MetadataFile module, string title)
{ {
this.module = module; this.metadataFile = module;
this.assemblyTreeNode = assemblyTreeNode; this.title = title;
this.LazyLoading = true; this.LazyLoading = true;
} }
public override object Text => Resources.Metadata; public override object Text => title;
public override object Icon => Images.Library; public override object Icon => Images.Library;
@ -57,21 +57,24 @@ namespace ICSharpCode.ILSpy.Metadata
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options) public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{ {
language.WriteCommentLine(output, "Metadata"); language.WriteCommentLine(output, title);
} }
protected override void LoadChildren() protected override void LoadChildren()
{ {
this.Children.Add(new DosHeaderTreeNode(module)); if (metadataFile is PEFile module)
this.Children.Add(new CoffHeaderTreeNode(module)); {
this.Children.Add(new OptionalHeaderTreeNode(module)); this.Children.Add(new DosHeaderTreeNode(module));
this.Children.Add(new DataDirectoriesTreeNode(module)); this.Children.Add(new CoffHeaderTreeNode(module));
this.Children.Add(new DebugDirectoryTreeNode(module)); this.Children.Add(new OptionalHeaderTreeNode(module));
this.Children.Add(new MetadataTablesTreeNode(module)); this.Children.Add(new DataDirectoriesTreeNode(module));
this.Children.Add(new StringHeapTreeNode(module)); this.Children.Add(new DebugDirectoryTreeNode(module));
this.Children.Add(new UserStringHeapTreeNode(module)); }
this.Children.Add(new GuidHeapTreeNode(module)); this.Children.Add(new MetadataTablesTreeNode(metadataFile));
this.Children.Add(new BlobHeapTreeNode(module)); this.Children.Add(new StringHeapTreeNode(metadataFile));
this.Children.Add(new UserStringHeapTreeNode(metadataFile));
this.Children.Add(new GuidHeapTreeNode(metadataFile));
this.Children.Add(new BlobHeapTreeNode(metadataFile));
} }
public MetadataTableTreeNode FindNodeByHandleKind(HandleKind kind) public MetadataTableTreeNode FindNodeByHandleKind(HandleKind kind)

13
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -194,6 +194,15 @@ namespace ICSharpCode.ILSpy.TreeNodes
var package = loadResult.Package; var package = loadResult.Package;
this.Children.AddRange(PackageFolderTreeNode.LoadChildrenForFolder(package.RootFolder)); this.Children.AddRange(PackageFolderTreeNode.LoadChildrenForFolder(package.RootFolder));
} }
else if (loadResult.MetadataFile != null)
{
var metadata = loadResult.MetadataFile;
this.Children.Add(new MetadataTablesTreeNode(metadata));
this.Children.Add(new StringHeapTreeNode(metadata));
this.Children.Add(new UserStringHeapTreeNode(metadata));
this.Children.Add(new GuidHeapTreeNode(metadata));
this.Children.Add(new BlobHeapTreeNode(metadata));
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -205,12 +214,12 @@ namespace ICSharpCode.ILSpy.TreeNodes
{ {
typeSystem = LoadedAssembly.GetTypeSystemOrNull(); typeSystem = LoadedAssembly.GetTypeSystemOrNull();
var assembly = (MetadataModule)typeSystem.MainModule; var assembly = (MetadataModule)typeSystem.MainModule;
this.Children.Add(new Metadata.MetadataTreeNode(module, this)); this.Children.Add(new MetadataTreeNode(module, Resources.Metadata));
Decompiler.DebugInfo.IDebugInfoProvider debugInfo = LoadedAssembly.GetDebugInfoOrNull(); Decompiler.DebugInfo.IDebugInfoProvider debugInfo = LoadedAssembly.GetDebugInfoOrNull();
if (debugInfo is PortableDebugInfoProvider ppdb if (debugInfo is PortableDebugInfoProvider ppdb
&& ppdb.GetMetadataReader() is System.Reflection.Metadata.MetadataReader reader) && ppdb.GetMetadataReader() is System.Reflection.Metadata.MetadataReader reader)
{ {
this.Children.Add(new Metadata.DebugMetadataTreeNode(module, ppdb.IsEmbedded, reader)); this.Children.Add(new MetadataTreeNode(ppdb.ToMetadataFile(), $"Debug Metadata ({(ppdb.IsEmbedded ? "Embedded" : "From portable PDB")})"));
} }
this.Children.Add(new ReferenceFolderTreeNode(module, this)); this.Children.Add(new ReferenceFolderTreeNode(module, this));
if (module.Resources.Any()) if (module.Resources.Any())

Loading…
Cancel
Save