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 @@ -34,7 +34,15 @@ namespace ICSharpCode.Decompiler.Metadata
{
public class MetadataFile
{
public enum MetadataFileKind
{
PortableExecutable,
ProgramDebugDatabase,
Metadata
}
public string FileName { get; }
public MetadataFileKind Kind { get; }
public MetadataReader Metadata { get; }
public virtual int MetadataOffset { get; }
@ -46,6 +54,7 @@ namespace ICSharpCode.Decompiler.Metadata @@ -46,6 +54,7 @@ namespace ICSharpCode.Decompiler.Metadata
this.Metadata = metadata.GetMetadataReader(metadataOptions);
this.MetadataOffset = metadataOffset;
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)
@ -55,6 +64,7 @@ namespace ICSharpCode.Decompiler.Metadata @@ -55,6 +64,7 @@ namespace ICSharpCode.Decompiler.Metadata
if (!reader.HasMetadata)
throw new PEFileNotSupportedException("PE file does not contain any managed metadata.");
this.Metadata = reader.GetMetadataReader(metadataOptions);
this.Kind = MetadataFileKind.PortableExecutable;
}
}

47
ICSharpCode.ILSpyX/LoadedAssembly.cs

@ -268,31 +268,34 @@ namespace ICSharpCode.ILSpyX @@ -268,31 +268,34 @@ namespace ICSharpCode.ILSpyX
if (IsLoaded && !HasLoadError)
{
var result = GetLoadResultAsync().GetAwaiter().GetResult();
if (result.PEFile != null)
if (result.MetadataFile != null)
{
var metadata = result.PEFile.Metadata;
string? versionOrInfo = null;
if (metadata != null)
switch (result.MetadataFile.Kind)
{
if (metadata.IsAssembly)
{
versionOrInfo = metadata.GetAssemblyDefinition().Version?.ToString();
string tfId = GetTargetFrameworkIdAsync().GetAwaiter().GetResult();
if (!string.IsNullOrEmpty(tfId))
versionOrInfo += ", " + tfId.Replace("Version=", " ");
}
else
{
versionOrInfo = ".netmodule";
}
case MetadataFile.MetadataFileKind.PortableExecutable:
var metadata = result.MetadataFile.Metadata;
string? versionOrInfo;
if (metadata.IsAssembly)
{
versionOrInfo = metadata.GetAssemblyDefinition().Version?.ToString();
string tfId = GetTargetFrameworkIdAsync().GetAwaiter().GetResult();
if (!string.IsNullOrEmpty(tfId))
versionOrInfo += ", " + tfId.Replace("Version=", " ");
}
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;

5
ILSpy/Metadata/DebugDirectoryTreeNode.cs

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

77
ILSpy/Metadata/DebugMetadataTablesTreeNode.cs

@ -1,77 +0,0 @@ @@ -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 @@ @@ -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 @@ -43,74 +43,11 @@ namespace ICSharpCode.ILSpy.Metadata
protected override void LoadChildren()
{
if (ShowTable(TableIndex.Module, metadataFile.Metadata))
this.Children.Add(new ModuleTableTreeNode(metadataFile));
if (ShowTable(TableIndex.TypeRef, metadataFile.Metadata))
this.Children.Add(new TypeRefTableTreeNode(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));
foreach (var table in Enum.GetValues<TableIndex>())
{
if (ShowTable(table, metadataFile.Metadata))
this.Children.Add(CreateTableTreeNode(table, metadataFile));
}
}
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; @@ -21,11 +21,11 @@ using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Windows.Data;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.Properties;
using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.ViewModels;
@ -33,17 +33,17 @@ namespace ICSharpCode.ILSpy.Metadata @@ -33,17 +33,17 @@ namespace ICSharpCode.ILSpy.Metadata
{
class MetadataTreeNode : ILSpyTreeNode
{
private readonly PEFile module;
private AssemblyTreeNode assemblyTreeNode;
private readonly MetadataFile metadataFile;
private readonly string title;
public MetadataTreeNode(PEFile module, AssemblyTreeNode assemblyTreeNode)
public MetadataTreeNode(MetadataFile module, string title)
{
this.module = module;
this.assemblyTreeNode = assemblyTreeNode;
this.metadataFile = module;
this.title = title;
this.LazyLoading = true;
}
public override object Text => Resources.Metadata;
public override object Text => title;
public override object Icon => Images.Library;
@ -57,21 +57,24 @@ namespace ICSharpCode.ILSpy.Metadata @@ -57,21 +57,24 @@ namespace ICSharpCode.ILSpy.Metadata
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{
language.WriteCommentLine(output, "Metadata");
language.WriteCommentLine(output, title);
}
protected override void LoadChildren()
{
this.Children.Add(new DosHeaderTreeNode(module));
this.Children.Add(new CoffHeaderTreeNode(module));
this.Children.Add(new OptionalHeaderTreeNode(module));
this.Children.Add(new DataDirectoriesTreeNode(module));
this.Children.Add(new DebugDirectoryTreeNode(module));
this.Children.Add(new MetadataTablesTreeNode(module));
this.Children.Add(new StringHeapTreeNode(module));
this.Children.Add(new UserStringHeapTreeNode(module));
this.Children.Add(new GuidHeapTreeNode(module));
this.Children.Add(new BlobHeapTreeNode(module));
if (metadataFile is PEFile module)
{
this.Children.Add(new DosHeaderTreeNode(module));
this.Children.Add(new CoffHeaderTreeNode(module));
this.Children.Add(new OptionalHeaderTreeNode(module));
this.Children.Add(new DataDirectoriesTreeNode(module));
this.Children.Add(new DebugDirectoryTreeNode(module));
}
this.Children.Add(new MetadataTablesTreeNode(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)

13
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -194,6 +194,15 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -194,6 +194,15 @@ namespace ICSharpCode.ILSpy.TreeNodes
var package = loadResult.Package;
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)
{
@ -205,12 +214,12 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -205,12 +214,12 @@ namespace ICSharpCode.ILSpy.TreeNodes
{
typeSystem = LoadedAssembly.GetTypeSystemOrNull();
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();
if (debugInfo is PortableDebugInfoProvider ppdb
&& 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));
if (module.Resources.Any())

Loading…
Cancel
Save