From d307ace82cd9dce4384d5462bfe85acb25182766 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 26 Sep 2019 10:26:06 +0200 Subject: [PATCH] Add MethodImplTableTreeNode --- ILSpy/ILSpy.csproj | 4 + .../CorTables/MethodImplTableTreeNode.cs | 129 ++++++++++++++++++ ILSpy/Metadata/MetadataTableViews.xaml | 21 +++ ILSpy/Metadata/MetadataTreeNode.cs | 1 + 4 files changed, 155 insertions(+) create mode 100644 ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs diff --git a/ILSpy/ILSpy.csproj b/ILSpy/ILSpy.csproj index 73616d97b..579d583dc 100644 --- a/ILSpy/ILSpy.csproj +++ b/ILSpy/ILSpy.csproj @@ -163,6 +163,10 @@ + + Code + MSBuild:Compile + True diff --git a/ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs b/ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs new file mode 100644 index 000000000..bb41c3258 --- /dev/null +++ b/ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs @@ -0,0 +1,129 @@ +// 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; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Metadata; +using System.Reflection.Metadata.Ecma335; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Controls; +using ICSharpCode.Decompiler; +using ICSharpCode.Decompiler.IL; +using ICSharpCode.Decompiler.Disassembler; +using ICSharpCode.Decompiler.Metadata; +using ICSharpCode.Decompiler.TypeSystem; +using ICSharpCode.ILSpy.TextView; +using ICSharpCode.ILSpy.TreeNodes; +using System.Reflection; + +namespace ICSharpCode.ILSpy.Metadata +{ + internal class MethodImplTableTreeNode : ILSpyTreeNode + { + private PEFile module; + + public MethodImplTableTreeNode(PEFile module) + { + this.module = module; + } + + public override object Text => $"19 MethodImpl ({module.Metadata.GetTableRowCount(TableIndex.MethodImpl)})"; + + public override object Icon => Images.Literal; + + public override bool View(DecompilerTextView textView) + { + ListView view = Helpers.CreateListView("MethodImplView"); + var metadata = module.Metadata; + + var list = new List(); + + for (int row = 1; row <= module.Metadata.GetTableRowCount(TableIndex.MethodImpl); row++) { + list.Add(new MethodImplEntry(module, MetadataTokens.MethodImplementationHandle(row))); + } + + view.ItemsSource = list; + + textView.ShowContent(new[] { this }, view); + return true; + } + + struct MethodImplEntry + { + readonly int metadataOffset; + readonly PEFile module; + readonly MetadataReader metadata; + readonly MethodImplementationHandle handle; + readonly MethodImplementation methodImpl; + + public int RID => MetadataTokens.GetToken(handle) & 0xFFFFFF; + + public int Token => MetadataTokens.GetToken(handle); + + public int Offset => metadataOffset + + metadata.GetTableMetadataOffset(TableIndex.MethodDef) + + metadata.GetTableRowSize(TableIndex.MethodDef) * (RID - 1); + + public int MethodDeclarationHandle => MetadataTokens.GetToken(methodImpl.MethodDeclaration); + + public string MethodDeclaration { + get { + ITextOutput output = new PlainTextOutput(); + methodImpl.MethodDeclaration.WriteTo(module, output, Decompiler.Metadata.GenericContext.Empty); + return output.ToString(); + } + } + + public int MethodBodyHandle => MetadataTokens.GetToken(methodImpl.MethodBody); + + public string MethodBody { + get { + ITextOutput output = new PlainTextOutput(); + methodImpl.MethodBody.WriteTo(module, output, Decompiler.Metadata.GenericContext.Empty); + return output.ToString(); + } + } + + public int TypeHandle => MetadataTokens.GetToken(methodImpl.Type); + + public string Type { + get { + ITextOutput output = new PlainTextOutput(); + ((EntityHandle)methodImpl.Type).WriteTo(module, output, Decompiler.Metadata.GenericContext.Empty); + return output.ToString(); + } + } + + public MethodImplEntry(PEFile module, MethodImplementationHandle handle) + { + this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset; + this.module = module; + this.metadata = module.Metadata; + this.handle = handle; + this.methodImpl = metadata.GetMethodImplementation(handle); + } + } + + public override void Decompile(Language language, ITextOutput output, DecompilationOptions options) + { + language.WriteCommentLine(output, "MethodDefs"); + } + } +} diff --git a/ILSpy/Metadata/MetadataTableViews.xaml b/ILSpy/Metadata/MetadataTableViews.xaml index ec084b25e..124ceada6 100644 --- a/ILSpy/Metadata/MetadataTableViews.xaml +++ b/ILSpy/Metadata/MetadataTableViews.xaml @@ -636,4 +636,25 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/ILSpy/Metadata/MetadataTreeNode.cs b/ILSpy/Metadata/MetadataTreeNode.cs index 99549841f..ea92e21c8 100644 --- a/ILSpy/Metadata/MetadataTreeNode.cs +++ b/ILSpy/Metadata/MetadataTreeNode.cs @@ -73,6 +73,7 @@ namespace ICSharpCode.ILSpy.Metadata this.Children.Add(new EventTableTreeNode(module)); this.Children.Add(new PropertyTableTreeNode(module)); this.Children.Add(new MethodSemanticsTableTreeNode(module)); + this.Children.Add(new MethodImplTableTreeNode(module)); this.Children.Add(new ModuleRefTableTreeNode(module)); this.Children.Add(new TypeSpecTableTreeNode(module)); this.Children.Add(new AssemblyTableTreeNode(module));