Browse Source

Reduce code duplication in Metadata tables by introducing a LoadTable method.

pull/3544/head
Siegfried Pammer 4 months ago
parent
commit
ff247168ec
  1. 30
      ILSpy/Metadata/CorTables/AssemblyRefTableTreeNode.cs
  2. 18
      ILSpy/Metadata/CorTables/AssemblyTableTreeNode.cs
  3. 29
      ILSpy/Metadata/CorTables/ClassLayoutTableTreeNode.cs
  4. 35
      ILSpy/Metadata/CorTables/ConstantTableTreeNode.cs
  5. 35
      ILSpy/Metadata/CorTables/CustomAttributeTableTreeNode.cs
  6. 35
      ILSpy/Metadata/CorTables/DeclSecurityTableTreeNode.cs
  7. 41
      ILSpy/Metadata/CorTables/EventMapTableTreeNode.cs
  8. 35
      ILSpy/Metadata/CorTables/EventTableTreeNode.cs
  9. 33
      ILSpy/Metadata/CorTables/ExportedTypeTableTreeNode.cs
  10. 39
      ILSpy/Metadata/CorTables/FieldLayoutTableTreeNode.cs
  11. 41
      ILSpy/Metadata/CorTables/FieldMarshalTableTreeNode.cs
  12. 39
      ILSpy/Metadata/CorTables/FieldRVATableTreeNode.cs
  13. 35
      ILSpy/Metadata/CorTables/FieldTableTreeNode.cs
  14. 36
      ILSpy/Metadata/CorTables/FileTableTreeNode.cs
  15. 33
      ILSpy/Metadata/CorTables/GenericParamConstraintTableTreeNode.cs
  16. 31
      ILSpy/Metadata/CorTables/GenericParamTableTreeNode.cs
  17. 44
      ILSpy/Metadata/CorTables/ImplMapTableTreeNode.cs
  18. 38
      ILSpy/Metadata/CorTables/InterfaceImplTableTreeNode.cs
  19. 34
      ILSpy/Metadata/CorTables/ManifestResourceTableTreeNode.cs
  20. 35
      ILSpy/Metadata/CorTables/MemberRefTableTreeNode.cs
  21. 32
      ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs
  22. 32
      ILSpy/Metadata/CorTables/MethodSemanticsTableTreeNode.cs
  23. 35
      ILSpy/Metadata/CorTables/MethodSpecTableTreeNode.cs
  24. 34
      ILSpy/Metadata/CorTables/MethodTableTreeNode.cs
  25. 35
      ILSpy/Metadata/CorTables/ModuleRefTableTreeNode.cs
  26. 27
      ILSpy/Metadata/CorTables/ModuleTableTreeNode.cs
  27. 44
      ILSpy/Metadata/CorTables/NestedClassTableTreeNode.cs
  28. 32
      ILSpy/Metadata/CorTables/ParamTableTreeNode.cs
  29. 42
      ILSpy/Metadata/CorTables/PropertyMapTableTreeNode.cs
  30. 34
      ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs
  31. 33
      ILSpy/Metadata/CorTables/PtrTableTreeNode.cs
  32. 31
      ILSpy/Metadata/CorTables/StandAloneSigTableTreeNode.cs
  33. 35
      ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs
  34. 35
      ILSpy/Metadata/CorTables/TypeRefTableTreeNode.cs
  35. 35
      ILSpy/Metadata/CorTables/TypeSpecTableTreeNode.cs
  36. 39
      ILSpy/Metadata/DebugTables/CustomDebugInformationTableTreeNode.cs
  37. 30
      ILSpy/Metadata/DebugTables/DocumentTableTreeNode.cs
  38. 31
      ILSpy/Metadata/DebugTables/ImportScopeTableTreeNode.cs
  39. 29
      ILSpy/Metadata/DebugTables/LocalConstantTableTreeNode.cs
  40. 29
      ILSpy/Metadata/DebugTables/LocalScopeTableTreeNode.cs
  41. 29
      ILSpy/Metadata/DebugTables/LocalVariableTableTreeNode.cs
  42. 30
      ILSpy/Metadata/DebugTables/MethodDebugInformationTableTreeNode.cs
  43. 31
      ILSpy/Metadata/DebugTables/StateMachineMethodTableTreeNode.cs
  44. 51
      ILSpy/Metadata/MetadataTableTreeNode.cs

30
ILSpy/Metadata/CorTables/AssemblyRefTableTreeNode.cs

@ -26,44 +26,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -26,44 +26,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class AssemblyRefTableTreeNode : MetadataTableTreeNode
internal class AssemblyRefTableTreeNode : MetadataTableTreeNode<AssemblyRefTableTreeNode.AssemblyRefEntry>
{
public AssemblyRefTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.AssemblyRef, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<AssemblyRefEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<AssemblyRefEntry>();
AssemblyRefEntry scrollTargetEntry = default;
foreach (var row in metadataFile.Metadata.AssemblyReferences)
{
AssemblyRefEntry entry = new AssemblyRefEntry(metadataFile, row);
if (scrollTarget == MetadataTokens.GetRowNumber(row))
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new AssemblyRefEntry(metadataFile, row));
}
return true;
return list;
}
struct AssemblyRefEntry
internal struct AssemblyRefEntry
{
readonly MetadataFile metadataFile;
readonly AssemblyReferenceHandle handle;

18
ILSpy/Metadata/CorTables/AssemblyTableTreeNode.cs

@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
@ -25,33 +26,26 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,33 +26,26 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class AssemblyTableTreeNode : MetadataTableTreeNode
internal class AssemblyTableTreeNode : MetadataTableTreeNode<AssemblyTableTreeNode.AssemblyEntry>
{
public AssemblyTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.Assembly, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<AssemblyEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
if (metadataFile.Metadata.IsAssembly)
{
view.ItemsSource = new[] { new AssemblyEntry(metadataFile.Metadata, metadataFile.MetadataOffset) };
return [new AssemblyEntry(metadataFile.Metadata, metadataFile.MetadataOffset)];
}
else
{
view.ItemsSource = Array.Empty<AssemblyEntry>();
return [];
}
tabPage.Content = view;
return true;
}
readonly struct AssemblyEntry
internal readonly struct AssemblyEntry
{
readonly int metadataOffset;
readonly MetadataReader metadata;

29
ILSpy/Metadata/CorTables/ClassLayoutTableTreeNode.cs

@ -26,45 +26,26 @@ using ICSharpCode.Decompiler.Metadata; @@ -26,45 +26,26 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class ClassLayoutTableTreeNode : MetadataTableTreeNode
internal class ClassLayoutTableTreeNode : MetadataTableTreeNode<ClassLayoutTableTreeNode.ClassLayoutEntry>
{
public ClassLayoutTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.ClassLayout, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<ClassLayoutEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<ClassLayoutEntry>();
var length = metadataFile.Metadata.GetTableRowCount(TableIndex.ClassLayout);
ReadOnlySpan<byte> ptr = metadataFile.Metadata.AsReadOnlySpan();
ClassLayoutEntry scrollTargetEntry = default;
for (int rid = 1; rid <= length; rid++)
{
ClassLayoutEntry entry = new ClassLayoutEntry(metadataFile, ptr, rid);
if (scrollTarget == rid)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new ClassLayoutEntry(metadataFile, ptr, rid));
}
return true;
return list;
}
readonly struct ClassLayout
@ -81,7 +62,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -81,7 +62,7 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
struct ClassLayoutEntry
internal struct ClassLayoutEntry
{
readonly MetadataFile metadataFile;
readonly ClassLayout classLayout;

35
ILSpy/Metadata/CorTables/ConstantTableTreeNode.cs

@ -21,50 +21,27 @@ using System.Reflection.Metadata; @@ -21,50 +21,27 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.ViewModels;
namespace ICSharpCode.ILSpy.Metadata
{
internal class ConstantTableTreeNode : MetadataTableTreeNode
internal class ConstantTableTreeNode : MetadataTableTreeNode<ConstantTableTreeNode.ConstantEntry>
{
public ConstantTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.Constant, metadataFile)
{
}
public override bool View(TabPageModel tabPage)
protected override IReadOnlyList<ConstantEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<ConstantEntry>();
ConstantEntry scrollTargetEntry = default;
for (int row = 1; row <= metadata.GetTableRowCount(TableIndex.Constant); row++)
for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.Constant); row++)
{
ConstantEntry entry = new ConstantEntry(metadataFile, MetadataTokens.ConstantHandle(row));
if (scrollTarget == row)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new ConstantEntry(metadataFile, MetadataTokens.ConstantHandle(row)));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
struct ConstantEntry
internal struct ConstantEntry
{
readonly MetadataFile metadataFile;
readonly EntityHandle handle;

35
ILSpy/Metadata/CorTables/CustomAttributeTableTreeNode.cs

@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class CustomAttributeTableTreeNode : MetadataTableTreeNode
class CustomAttributeTableTreeNode : MetadataTableTreeNode<CustomAttributeTableTreeNode.CustomAttributeEntry>
{
public CustomAttributeTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.CustomAttribute, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<CustomAttributeEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<CustomAttributeEntry>();
CustomAttributeEntry scrollTargetEntry = default;
foreach (var row in metadata.CustomAttributes)
{
CustomAttributeEntry entry = new CustomAttributeEntry(metadataFile, row);
if (scrollTarget == MetadataTokens.GetRowNumber(row))
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
foreach (var row in metadataFile.Metadata.CustomAttributes)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new CustomAttributeEntry(metadataFile, row));
}
return true;
return list;
}
struct CustomAttributeEntry
internal struct CustomAttributeEntry
{
readonly MetadataFile metadataFile;
readonly CustomAttributeHandle handle;

35
ILSpy/Metadata/CorTables/DeclSecurityTableTreeNode.cs

@ -25,47 +25,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,47 +25,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class DeclSecurityTableTreeNode : MetadataTableTreeNode
class DeclSecurityTableTreeNode : MetadataTableTreeNode<DeclSecurityTableTreeNode.DeclSecurityEntry>
{
public DeclSecurityTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.DeclSecurity, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<DeclSecurityEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<DeclSecurityEntry>();
DeclSecurityEntry scrollTargetEntry = default;
foreach (var row in metadata.DeclarativeSecurityAttributes)
{
var entry = new DeclSecurityEntry(metadataFile, row);
if (scrollTarget == MetadataTokens.GetRowNumber(row))
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
foreach (var row in metadataFile.Metadata.DeclarativeSecurityAttributes)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new DeclSecurityEntry(metadataFile, row));
}
return true;
return list;
}
struct DeclSecurityEntry
internal struct DeclSecurityEntry
{
readonly MetadataFile metadataFile;
readonly DeclarativeSecurityAttributeHandle handle;

41
ILSpy/Metadata/CorTables/EventMapTableTreeNode.cs

@ -25,46 +25,27 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,46 +25,27 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class EventMapTableTreeNode : MetadataTableTreeNode
class EventMapTableTreeNode : MetadataTableTreeNode<EventMapTableTreeNode.EventMapEntry>
{
public EventMapTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.EventMap, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<EventMapEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<EventMapEntry>();
EventMapEntry scrollTargetEntry = default;
var metadata = metadataFile.Metadata;
var length = metadata.GetTableRowCount(TableIndex.EventMap);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int typeDefSize = metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4;
int eventDefSize = metadata.GetTableRowCount(TableIndex.Event) < ushort.MaxValue ? 2 : 4;
for (int rid = 1; rid <= length; rid++)
{
EventMapEntry entry = new EventMapEntry(metadataFile, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new EventMapEntry(metadataFile, ptr, rid, typeDefSize, eventDefSize));
}
return true;
return list;
}
readonly struct EventMap
@ -79,15 +60,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -79,15 +60,13 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
struct EventMapEntry
internal struct EventMapEntry
{
readonly MetadataFile metadataFile;
readonly EventMap eventMap;
public int RID { get; }
public int Token => 0x12000000 | RID;
public int Offset { get; }
[ColumnInfo("X8", Kind = ColumnKind.Token)]
@ -112,15 +91,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -112,15 +91,13 @@ namespace ICSharpCode.ILSpy.Metadata
string eventListTooltip;
public string EventListTooltip => GenerateTooltip(ref eventListTooltip, metadataFile, eventMap.EventList);
public EventMapEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row)
public EventMapEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row, int typeDefSize, int eventDefSize)
{
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.EventMap)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.EventMap) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
int typeDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4;
int eventDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.Event) < ushort.MaxValue ? 2 : 4;
this.eventMap = new EventMap(ptr.Slice(rowOffset), typeDefSize, eventDefSize);
this.parentTooltip = null;
this.eventListTooltip = null;

35
ILSpy/Metadata/CorTables/EventTableTreeNode.cs

@ -27,47 +27,24 @@ using ICSharpCode.ILSpy.TreeNodes; @@ -27,47 +27,24 @@ using ICSharpCode.ILSpy.TreeNodes;
namespace ICSharpCode.ILSpy.Metadata
{
internal class EventTableTreeNode : MetadataTableTreeNode
internal class EventTableTreeNode : MetadataTableTreeNode<EventTableTreeNode.EventDefEntry>
{
public EventTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.Event, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<EventDefEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<EventDefEntry>();
EventDefEntry scrollTargetEntry = default;
foreach (var row in metadata.EventDefinitions)
{
EventDefEntry entry = new EventDefEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
foreach (var row in metadataFile.Metadata.EventDefinitions)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new EventDefEntry(metadataFile, row));
}
return true;
return list;
}
struct EventDefEntry : IMemberTreeNode
internal struct EventDefEntry : IMemberTreeNode
{
readonly MetadataFile metadataFile;
readonly EventDefinitionHandle handle;

33
ILSpy/Metadata/CorTables/ExportedTypeTableTreeNode.cs

@ -25,46 +25,25 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,46 +25,25 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class ExportedTypeTableTreeNode : MetadataTableTreeNode
internal class ExportedTypeTableTreeNode : MetadataTableTreeNode<ExportedTypeTableTreeNode.ExportedTypeEntry>
{
public ExportedTypeTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.ExportedType, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<ExportedTypeEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<ExportedTypeEntry>();
ExportedTypeEntry scrollTargetEntry = default;
var metadata = metadataFile.Metadata;
foreach (var row in metadata.ExportedTypes)
{
ExportedTypeEntry entry = new ExportedTypeEntry(metadataFile, row, metadataFile.Metadata.GetExportedType(row));
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new ExportedTypeEntry(metadataFile, row, metadata.GetExportedType(row)));
}
return true;
return list;
}
struct ExportedTypeEntry
internal struct ExportedTypeEntry
{
readonly MetadataFile metadataFile;
readonly ExportedTypeHandle handle;

39
ILSpy/Metadata/CorTables/FieldLayoutTableTreeNode.cs

@ -26,46 +26,26 @@ using ICSharpCode.Decompiler.Metadata; @@ -26,46 +26,26 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class FieldLayoutTableTreeNode : MetadataTableTreeNode
internal class FieldLayoutTableTreeNode : MetadataTableTreeNode<FieldLayoutTableTreeNode.FieldLayoutEntry>
{
public FieldLayoutTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.FieldLayout, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<FieldLayoutEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<FieldLayoutEntry>();
FieldLayoutEntry scrollTargetEntry = default;
var metadata = metadataFile.Metadata;
var length = metadata.GetTableRowCount(TableIndex.FieldLayout);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int fieldDefSize = metadata.GetTableRowCount(TableIndex.Field) < ushort.MaxValue ? 2 : 4;
for (int rid = 1; rid <= length; rid++)
{
FieldLayoutEntry entry = new FieldLayoutEntry(metadataFile, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new FieldLayoutEntry(metadataFile, ptr, rid, fieldDefSize));
}
return true;
return list;
}
readonly struct FieldLayout
@ -80,15 +60,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -80,15 +60,13 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
struct FieldLayoutEntry
internal struct FieldLayoutEntry
{
readonly MetadataFile metadataFile;
readonly FieldLayout fieldLayout;
public int RID { get; }
public int Token => 0x10000000 | RID;
public int Offset { get; }
[ColumnInfo("X8", Kind = ColumnKind.Token)]
@ -105,14 +83,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -105,14 +83,13 @@ namespace ICSharpCode.ILSpy.Metadata
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public int FieldOffset => fieldLayout.Offset;
public FieldLayoutEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row)
public FieldLayoutEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row, int fieldDefSize)
{
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.FieldLayout)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.FieldLayout) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
int fieldDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.Field) < ushort.MaxValue ? 2 : 4;
this.fieldLayout = new FieldLayout(ptr.Slice(rowOffset), fieldDefSize);
this.fieldTooltip = null;
}

41
ILSpy/Metadata/CorTables/FieldMarshalTableTreeNode.cs

@ -25,46 +25,27 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,46 +25,27 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class FieldMarshalTableTreeNode : MetadataTableTreeNode
internal class FieldMarshalTableTreeNode : MetadataTableTreeNode<FieldMarshalTableTreeNode.FieldMarshalEntry>
{
public FieldMarshalTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.FieldMarshal, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<FieldMarshalEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<FieldMarshalEntry>();
FieldMarshalEntry scrollTargetEntry = default;
var metadata = metadataFile.Metadata;
var length = metadata.GetTableRowCount(TableIndex.FieldMarshal);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int hasFieldMarshalRefSize = metadata.ComputeCodedTokenSize(32768, TableMask.Field | TableMask.Param);
int blobHeapSize = metadata.GetHeapSize(HeapIndex.Blob) < ushort.MaxValue ? 2 : 4;
for (int rid = 1; rid <= length; rid++)
{
FieldMarshalEntry entry = new FieldMarshalEntry(metadataFile, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new FieldMarshalEntry(metadataFile, ptr, rid, blobHeapSize, hasFieldMarshalRefSize));
}
return true;
return list;
}
readonly struct FieldMarshal
@ -79,15 +60,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -79,15 +60,13 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
struct FieldMarshalEntry
internal struct FieldMarshalEntry
{
readonly MetadataFile metadataFile;
readonly FieldMarshal fieldMarshal;
public int RID { get; }
public int Token => 0x0D000000 | RID;
public int Offset { get; }
[ColumnInfo("X8", Kind = ColumnKind.Token)]
@ -104,15 +83,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -104,15 +83,13 @@ namespace ICSharpCode.ILSpy.Metadata
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int NativeType => MetadataTokens.GetHeapOffset(fieldMarshal.NativeType);
public FieldMarshalEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row)
public FieldMarshalEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row, int blobHeapSize, int hasFieldMarshalRefSize)
{
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.FieldMarshal)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.FieldMarshal) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
int hasFieldMarshalRefSize = metadataFile.Metadata.ComputeCodedTokenSize(32768, TableMask.Field | TableMask.Param);
int blobHeapSize = metadataFile.Metadata.GetHeapSize(HeapIndex.Blob) < ushort.MaxValue ? 2 : 4;
this.fieldMarshal = new FieldMarshal(ptr.Slice(rowOffset), blobHeapSize, hasFieldMarshalRefSize);
this.parentTooltip = null;
}

39
ILSpy/Metadata/CorTables/FieldRVATableTreeNode.cs

@ -26,7 +26,7 @@ using ICSharpCode.Decompiler.Metadata; @@ -26,7 +26,7 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class FieldRVATableTreeNode : MetadataTableTreeNode
internal class FieldRVATableTreeNode : MetadataTableTreeNode<FieldRVATableTreeNode.FieldRVAEntry>
{
public FieldRVATableTreeNode(MetadataFile metadataFile)
: base(TableIndex.FieldRva, metadataFile)
@ -35,40 +35,20 @@ namespace ICSharpCode.ILSpy.Metadata @@ -35,40 +35,20 @@ namespace ICSharpCode.ILSpy.Metadata
public override object Text => $"1D FieldRVA ({metadataFile.Metadata.GetTableRowCount(TableIndex.FieldRva)})";
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<FieldRVAEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<FieldRVAEntry>();
FieldRVAEntry scrollTargetEntry = default;
var metadata = metadataFile.Metadata;
var length = metadata.GetTableRowCount(TableIndex.FieldRva);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int metadataOffset = metadataFile.MetadataOffset;
int fieldDefSize = metadata.GetTableRowCount(TableIndex.Field) < ushort.MaxValue ? 2 : 4;
for (int rid = 1; rid <= length; rid++)
{
FieldRVAEntry entry = new FieldRVAEntry(metadataFile, metadataOffset, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new FieldRVAEntry(metadataFile, metadataOffset, ptr, rid, fieldDefSize));
}
return true;
return list;
}
readonly struct FieldRVA
@ -83,15 +63,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -83,15 +63,13 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
struct FieldRVAEntry
internal struct FieldRVAEntry
{
readonly MetadataFile metadataFile;
readonly FieldRVA fieldRVA;
public int RID { get; }
public int Token => 0x1D000000 | RID;
public int Offset { get; }
[ColumnInfo("X8", Kind = ColumnKind.Token)]
@ -108,14 +86,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -108,14 +86,13 @@ namespace ICSharpCode.ILSpy.Metadata
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public int FieldOffset => fieldRVA.Offset;
public FieldRVAEntry(MetadataFile metadataFile, int metadataOffset, ReadOnlySpan<byte> ptr, int row)
public FieldRVAEntry(MetadataFile metadataFile, int metadataOffset, ReadOnlySpan<byte> ptr, int row, int fieldDefSize)
{
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.FieldRva)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.FieldRva) * (row - 1);
this.Offset = metadataOffset + rowOffset;
int fieldDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.Field) < ushort.MaxValue ? 2 : 4;
this.fieldRVA = new FieldRVA(ptr.Slice(rowOffset), fieldDefSize);
this.fieldTooltip = null;
}

35
ILSpy/Metadata/CorTables/FieldTableTreeNode.cs

@ -27,47 +27,24 @@ using ICSharpCode.ILSpy.TreeNodes; @@ -27,47 +27,24 @@ using ICSharpCode.ILSpy.TreeNodes;
namespace ICSharpCode.ILSpy.Metadata
{
internal class FieldTableTreeNode : MetadataTableTreeNode
internal class FieldTableTreeNode : MetadataTableTreeNode<FieldTableTreeNode.FieldDefEntry>
{
public FieldTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.Field, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<FieldDefEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<FieldDefEntry>();
FieldDefEntry scrollTargetEntry = default;
foreach (var row in metadata.FieldDefinitions)
foreach (var row in metadataFile.Metadata.FieldDefinitions)
{
var entry = new FieldDefEntry(metadataFile, row);
if (scrollTarget == entry.RID)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new FieldDefEntry(metadataFile, row));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
struct FieldDefEntry : IMemberTreeNode
internal struct FieldDefEntry : IMemberTreeNode
{
readonly MetadataFile metadataFile;
readonly FieldDefinitionHandle handle;

36
ILSpy/Metadata/CorTables/FileTableTreeNode.cs

@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class FileTableTreeNode : MetadataTableTreeNode
class FileTableTreeNode : MetadataTableTreeNode<FileTableTreeNode.FileEntry>
{
public FileTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.File, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<FileEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<FileEntry>();
FileEntry scrollTargetEntry = default;
foreach (var row in metadata.AssemblyFiles)
foreach (var row in metadataFile.Metadata.AssemblyFiles)
{
FileEntry entry = new FileEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new FileEntry(metadataFile, row));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
struct FileEntry
internal struct FileEntry
{
readonly MetadataFile metadataFile;
readonly AssemblyFileHandle handle;
@ -106,6 +83,5 @@ namespace ICSharpCode.ILSpy.Metadata @@ -106,6 +83,5 @@ namespace ICSharpCode.ILSpy.Metadata
this.assemblyFile = metadataFile.Metadata.GetAssemblyFile(handle);
}
}
}
}

33
ILSpy/Metadata/CorTables/GenericParamConstraintTableTreeNode.cs

@ -26,46 +26,25 @@ using ICSharpCode.Decompiler.Metadata; @@ -26,46 +26,25 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class GenericParamConstraintTableTreeNode : MetadataTableTreeNode
internal class GenericParamConstraintTableTreeNode : MetadataTableTreeNode<GenericParamConstraintTableTreeNode.GenericParamConstraintEntry>
{
public GenericParamConstraintTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.GenericParamConstraint, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<GenericParamConstraintEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<GenericParamConstraintEntry>();
GenericParamConstraintEntry scrollTargetEntry = default;
var metadata = metadataFile.Metadata;
for (int row = 1; row <= metadata.GetTableRowCount(TableIndex.GenericParamConstraint); row++)
{
GenericParamConstraintEntry entry = new GenericParamConstraintEntry(metadataFile, MetadataTokens.GenericParameterConstraintHandle(row));
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new GenericParamConstraintEntry(metadataFile, MetadataTokens.GenericParameterConstraintHandle(row)));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
struct GenericParamConstraintEntry
internal struct GenericParamConstraintEntry
{
readonly MetadataFile metadataFile;
readonly GenericParameterConstraintHandle handle;

31
ILSpy/Metadata/CorTables/GenericParamTableTreeNode.cs

@ -25,45 +25,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,45 +25,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class GenericParamTableTreeNode : MetadataTableTreeNode
internal class GenericParamTableTreeNode : MetadataTableTreeNode<GenericParamTableTreeNode.GenericParamEntry>
{
public GenericParamTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.GenericParam, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<GenericParamEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<GenericParamEntry>();
GenericParamEntry scrollTargetEntry = default;
for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.GenericParam); row++)
{
GenericParamEntry entry = new GenericParamEntry(metadataFile, MetadataTokens.GenericParameterHandle(row));
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new GenericParamEntry(metadataFile, MetadataTokens.GenericParameterHandle(row)));
}
return true;
return list;
}
struct GenericParamEntry
internal struct GenericParamEntry
{
readonly MetadataFile metadataFile;
readonly GenericParameterHandle handle;

44
ILSpy/Metadata/CorTables/ImplMapTableTreeNode.cs

@ -28,46 +28,27 @@ using Mono.Cecil; @@ -28,46 +28,27 @@ using Mono.Cecil;
namespace ICSharpCode.ILSpy.Metadata
{
class ImplMapTableTreeNode : MetadataTableTreeNode
class ImplMapTableTreeNode : MetadataTableTreeNode<ImplMapTableTreeNode.ImplMapEntry>
{
public ImplMapTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.ImplMap, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<ImplMapEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<ImplMapEntry>();
ImplMapEntry scrollTargetEntry = default;
var metadata = metadataFile.Metadata;
var length = metadata.GetTableRowCount(TableIndex.ImplMap);
var span = metadata.AsReadOnlySpan();
int moduleRefSize = metadata.GetTableRowCount(TableIndex.ModuleRef) < ushort.MaxValue ? 2 : 4;
int memberForwardedTagRefSize = metadata.ComputeCodedTokenSize(32768, TableMask.MethodDef | TableMask.Field);
int stringHandleSize = metadata.GetHeapSize(HeapIndex.String) < ushort.MaxValue ? 2 : 4;
for (int rid = 1; rid <= length; rid++)
{
ImplMapEntry entry = new ImplMapEntry(metadataFile, span, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new ImplMapEntry(metadataFile, span, rid, moduleRefSize, memberForwardedTagRefSize, stringHandleSize));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
readonly struct ImplMap
@ -86,15 +67,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -86,15 +67,13 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
struct ImplMapEntry
internal struct ImplMapEntry
{
readonly MetadataFile metadataFile;
readonly ImplMap implMap;
public int RID { get; }
public int Token => 0x1C000000 | RID;
public int Offset { get; }
[ColumnInfo("X8", Kind = ColumnKind.Other)]
@ -134,16 +113,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -134,16 +113,13 @@ namespace ICSharpCode.ILSpy.Metadata
public string ImportNameTooltip => $"{MetadataTokens.GetHeapOffset(implMap.ImportName):X} \"{ImportName}\"";
public ImplMapEntry(MetadataFile metadataFile, ReadOnlySpan<byte> span, int row)
public ImplMapEntry(MetadataFile metadataFile, ReadOnlySpan<byte> span, int row, int moduleRefSize, int memberForwardedTagRefSize, int stringHandleSize)
{
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.ImplMap)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.ImplMap) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
int moduleRefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.ModuleRef) < ushort.MaxValue ? 2 : 4;
int memberForwardedTagRefSize = metadataFile.Metadata.ComputeCodedTokenSize(32768, TableMask.MethodDef | TableMask.Field);
int stringHandleSize = metadataFile.Metadata.GetHeapSize(HeapIndex.String) < ushort.MaxValue ? 2 : 4;
this.implMap = new ImplMap(span.Slice(rowOffset), moduleRefSize, memberForwardedTagRefSize, stringHandleSize);
this.importScopeTooltip = null;
this.memberForwardedTooltip = null;

38
ILSpy/Metadata/CorTables/InterfaceImplTableTreeNode.cs

@ -25,47 +25,23 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,47 +25,23 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class InterfaceImplTableTreeNode : MetadataTableTreeNode
internal class InterfaceImplTableTreeNode : MetadataTableTreeNode<InterfaceImplTableTreeNode.InterfaceImplEntry>
{
public InterfaceImplTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.InterfaceImpl, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<InterfaceImplEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<InterfaceImplEntry>();
InterfaceImplEntry scrollTargetEntry = default;
var length = metadata.GetTableRowCount(TableIndex.InterfaceImpl);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int metadataOffset = metadataFile.MetadataOffset;
var length = metadataFile.Metadata.GetTableRowCount(TableIndex.InterfaceImpl);
ReadOnlySpan<byte> ptr = metadataFile.Metadata.AsReadOnlySpan();
for (int rid = 1; rid <= length; rid++)
{
InterfaceImplEntry entry = new InterfaceImplEntry(metadataFile, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new InterfaceImplEntry(metadataFile, ptr, rid));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
readonly struct InterfaceImpl
@ -80,7 +56,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -80,7 +56,7 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
struct InterfaceImplEntry
internal struct InterfaceImplEntry
{
readonly MetadataFile metadataFile;
readonly InterfaceImpl interfaceImpl;

34
ILSpy/Metadata/CorTables/ManifestResourceTableTreeNode.cs

@ -25,47 +25,25 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,47 +25,25 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class ManifestResourceTableTreeNode : MetadataTableTreeNode
class ManifestResourceTableTreeNode : MetadataTableTreeNode<ManifestResourceTableTreeNode.ManifestResourceEntry>
{
public ManifestResourceTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.ManifestResource, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<ManifestResourceEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<ManifestResourceEntry>();
ManifestResourceEntry scrollTargetEntry = default;
var metadata = metadataFile.Metadata;
foreach (var row in metadata.ManifestResources)
{
ManifestResourceEntry entry = new ManifestResourceEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new ManifestResourceEntry(metadataFile, row));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
struct ManifestResourceEntry
internal struct ManifestResourceEntry
{
readonly MetadataFile metadataFile;
readonly ManifestResourceHandle handle;

35
ILSpy/Metadata/CorTables/MemberRefTableTreeNode.cs

@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class MemberRefTableTreeNode : MetadataTableTreeNode
internal class MemberRefTableTreeNode : MetadataTableTreeNode<MemberRefTableTreeNode.MemberRefEntry>
{
public MemberRefTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.MemberRef, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<MemberRefEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<MemberRefEntry>();
MemberRefEntry scrollTargetEntry = default;
foreach (var row in metadata.MemberReferences)
foreach (var row in metadataFile.Metadata.MemberReferences)
{
MemberRefEntry entry = new MemberRefEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new MemberRefEntry(metadataFile, row));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
struct MemberRefEntry
internal struct MemberRefEntry
{
readonly MetadataFile metadataFile;
readonly MemberReferenceHandle handle;

32
ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs

@ -24,46 +24,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -24,46 +24,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class MethodImplTableTreeNode : MetadataTableTreeNode
internal class MethodImplTableTreeNode : MetadataTableTreeNode<MethodImplTableTreeNode.MethodImplEntry>
{
public MethodImplTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.MethodImpl, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<MethodImplEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<MethodImplEntry>();
MethodImplEntry scrollTargetEntry = default;
for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.MethodImpl); row++)
{
MethodImplEntry entry = new MethodImplEntry(metadataFile, MetadataTokens.MethodImplementationHandle(row));
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new MethodImplEntry(metadataFile, MetadataTokens.MethodImplementationHandle(row)));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
struct MethodImplEntry
internal struct MethodImplEntry
{
readonly MetadataFile metadataFile;
readonly MethodImplementationHandle handle;

32
ILSpy/Metadata/CorTables/MethodSemanticsTableTreeNode.cs

@ -25,46 +25,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,46 +25,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class MethodSemanticsTableTreeNode : MetadataTableTreeNode
internal class MethodSemanticsTableTreeNode : MetadataTableTreeNode<MethodSemanticsTableTreeNode.MethodSemanticsEntry>
{
public MethodSemanticsTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.MethodSemantics, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<MethodSemanticsEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<MethodSemanticsEntry>();
MethodSemanticsEntry scrollTargetEntry = default;
foreach (var row in metadataFile.Metadata.GetMethodSemantics())
{
MethodSemanticsEntry entry = new MethodSemanticsEntry(metadataFile, row.Handle, row.Semantics, row.Method, row.Association);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new MethodSemanticsEntry(metadataFile, row.Handle, row.Semantics, row.Method, row.Association));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
struct MethodSemanticsEntry
internal struct MethodSemanticsEntry
{
readonly MetadataFile metadataFile;
readonly Handle handle;

35
ILSpy/Metadata/CorTables/MethodSpecTableTreeNode.cs

@ -26,47 +26,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -26,47 +26,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class MethodSpecTableTreeNode : MetadataTableTreeNode
internal class MethodSpecTableTreeNode : MetadataTableTreeNode<MethodSpecTableTreeNode.MethodSpecEntry>
{
public MethodSpecTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.MethodSpec, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<MethodSpecEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<MethodSpecEntry>();
MethodSpecEntry scrollTargetEntry = default;
foreach (var row in metadata.GetMethodSpecifications())
{
MethodSpecEntry entry = new MethodSpecEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
foreach (var row in metadataFile.Metadata.GetMethodSpecifications())
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new MethodSpecEntry(metadataFile, row));
}
return true;
return list;
}
struct MethodSpecEntry
internal struct MethodSpecEntry
{
readonly MetadataFile metadataFile;
readonly MethodSpecificationHandle handle;

34
ILSpy/Metadata/CorTables/MethodTableTreeNode.cs

@ -28,46 +28,24 @@ using ICSharpCode.ILSpy.TreeNodes; @@ -28,46 +28,24 @@ using ICSharpCode.ILSpy.TreeNodes;
namespace ICSharpCode.ILSpy.Metadata
{
internal class MethodTableTreeNode : MetadataTableTreeNode
internal class MethodTableTreeNode : MetadataTableTreeNode<MethodTableTreeNode.MethodDefEntry>
{
public MethodTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.MethodDef, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<MethodDefEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<MethodDefEntry>();
MethodDefEntry scrollTargetEntry = default;
foreach (var row in metadata.MethodDefinitions)
foreach (var row in metadataFile.Metadata.MethodDefinitions)
{
MethodDefEntry entry = new MethodDefEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new MethodDefEntry(metadataFile, row));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
struct MethodDefEntry : IMemberTreeNode
internal struct MethodDefEntry : IMemberTreeNode
{
readonly MetadataFile metadataFile;
readonly MethodDefinitionHandle handle;

35
ILSpy/Metadata/CorTables/ModuleRefTableTreeNode.cs

@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class ModuleRefTableTreeNode : MetadataTableTreeNode
internal class ModuleRefTableTreeNode : MetadataTableTreeNode<ModuleRefTableTreeNode.ModuleRefEntry>
{
public ModuleRefTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.ModuleRef, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<ModuleRefEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<ModuleRefEntry>();
ModuleRefEntry scrollTargetEntry = default;
foreach (var row in metadata.GetModuleReferences())
foreach (var row in metadataFile.Metadata.GetModuleReferences())
{
ModuleRefEntry entry = new ModuleRefEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new ModuleRefEntry(metadataFile, row));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
struct ModuleRefEntry
internal struct ModuleRefEntry
{
readonly MetadataFile metadataFile;
readonly ModuleReferenceHandle handle;

27
ILSpy/Metadata/CorTables/ModuleTableTreeNode.cs

@ -24,38 +24,19 @@ using ICSharpCode.Decompiler.Metadata; @@ -24,38 +24,19 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class ModuleTableTreeNode : MetadataTableTreeNode
internal class ModuleTableTreeNode : MetadataTableTreeNode<ModuleTableTreeNode.ModuleEntry>
{
public ModuleTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.Module, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<ModuleEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<ModuleEntry>();
ModuleEntry scrollTargetEntry = default;
list.Add(new ModuleEntry(metadataFile, EntityHandle.ModuleDefinition));
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return [new ModuleEntry(metadataFile, EntityHandle.ModuleDefinition)];
}
struct ModuleEntry
internal struct ModuleEntry
{
readonly MetadataFile metadataFile;
readonly ModuleDefinitionHandle handle;

44
ILSpy/Metadata/CorTables/NestedClassTableTreeNode.cs

@ -25,46 +25,25 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,46 +25,25 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class NestedClassTableTreeNode : MetadataTableTreeNode
class NestedClassTableTreeNode : MetadataTableTreeNode<NestedClassTableTreeNode.NestedClassEntry>
{
public NestedClassTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.NestedClass, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<NestedClassEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<NestedClassEntry>();
NestedClassEntry scrollTargetEntry = default;
var metadata = metadataFile.Metadata;
var length = metadata.GetTableRowCount(TableIndex.NestedClass);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int typeDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4;
for (int rid = 1; rid <= length; rid++)
{
NestedClassEntry entry = new NestedClassEntry(metadataFile, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new NestedClassEntry(metadataFile, ptr, rid, typeDefSize));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
readonly struct NestedClass
@ -79,47 +58,40 @@ namespace ICSharpCode.ILSpy.Metadata @@ -79,47 +58,40 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
struct NestedClassEntry
internal struct NestedClassEntry
{
readonly MetadataFile metadataFile;
readonly NestedClass nestedClass;
public int RID { get; }
public int Token => 0x29000000 | RID;
public int Offset { get; }
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int NestedClass => MetadataTokens.GetToken(nestedClass.Nested);
public void OnNestedClassClick()
{
MessageBus.Send(this, new NavigateToReferenceEventArgs(new EntityReference(metadataFile, nestedClass.Nested, protocol: "metadata")));
}
string nestedClassTooltip;
public string NestedClassTooltip => GenerateTooltip(ref nestedClassTooltip, metadataFile, nestedClass.Nested);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int EnclosingClass => MetadataTokens.GetToken(nestedClass.Enclosing);
public void OnEnclosingClassClick()
{
MessageBus.Send(this, new NavigateToReferenceEventArgs(new EntityReference(metadataFile, nestedClass.Enclosing, protocol: "metadata")));
}
string enclosingClassTooltip;
public string EnclosingClassTooltip => GenerateTooltip(ref enclosingClassTooltip, metadataFile, nestedClass.Enclosing);
public NestedClassEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row)
public NestedClassEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row, int typeDefSize)
{
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.NestedClass)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.NestedClass) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
int typeDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4;
this.nestedClass = new NestedClass(ptr.Slice(rowOffset), typeDefSize);
this.nestedClassTooltip = null;
this.enclosingClassTooltip = null;

32
ILSpy/Metadata/CorTables/ParamTableTreeNode.cs

@ -25,46 +25,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,46 +25,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class ParamTableTreeNode : MetadataTableTreeNode
internal class ParamTableTreeNode : MetadataTableTreeNode<ParamTableTreeNode.ParamEntry>
{
public ParamTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.Param, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<ParamEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<ParamEntry>();
ParamEntry scrollTargetEntry = default;
for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.Param); row++)
{
ParamEntry entry = new ParamEntry(metadataFile, MetadataTokens.ParameterHandle(row));
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new ParamEntry(metadataFile, MetadataTokens.ParameterHandle(row)));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
struct ParamEntry
internal struct ParamEntry
{
readonly MetadataFile metadataFile;
readonly ParameterHandle handle;

42
ILSpy/Metadata/CorTables/PropertyMapTableTreeNode.cs

@ -25,46 +25,26 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,46 +25,26 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class PropertyMapTableTreeNode : MetadataTableTreeNode
class PropertyMapTableTreeNode : MetadataTableTreeNode<PropertyMapTableTreeNode.PropertyMapEntry>
{
public PropertyMapTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.PropertyMap, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<PropertyMapEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<PropertyMapEntry>();
PropertyMapEntry scrollTargetEntry = default;
var metadata = metadataFile.Metadata;
var length = metadata.GetTableRowCount(TableIndex.PropertyMap);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int typeDefSize = metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4;
int propertyDefSize = metadata.GetTableRowCount(TableIndex.Property) < ushort.MaxValue ? 2 : 4;
for (int rid = 1; rid <= length; rid++)
{
PropertyMapEntry entry = new PropertyMapEntry(metadataFile, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new PropertyMapEntry(metadataFile, ptr, rid, typeDefSize, propertyDefSize));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
readonly struct PropertyMap
@ -79,15 +59,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -79,15 +59,13 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
struct PropertyMapEntry
internal struct PropertyMapEntry
{
readonly MetadataFile metadataFile;
readonly PropertyMap propertyMap;
public int RID { get; }
public int Token => 0x15000000 | RID;
public int Offset { get; }
[ColumnInfo("X8", Kind = ColumnKind.Token)]
@ -112,15 +90,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -112,15 +90,13 @@ namespace ICSharpCode.ILSpy.Metadata
string propertyListTooltip;
public string PropertyListTooltip => GenerateTooltip(ref propertyListTooltip, metadataFile, propertyMap.PropertyList);
public PropertyMapEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row)
public PropertyMapEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row, int typeDefSize, int propertyDefSize)
{
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.PropertyMap)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.PropertyMap) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
int typeDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4;
int propertyDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.Property) < ushort.MaxValue ? 2 : 4;
this.propertyMap = new PropertyMap(ptr.Slice(rowOffset), typeDefSize, propertyDefSize);
this.propertyListTooltip = null;
this.parentTooltip = null;

34
ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs

@ -27,47 +27,25 @@ using ICSharpCode.ILSpy.TreeNodes; @@ -27,47 +27,25 @@ using ICSharpCode.ILSpy.TreeNodes;
namespace ICSharpCode.ILSpy.Metadata
{
internal class PropertyTableTreeNode : MetadataTableTreeNode
internal class PropertyTableTreeNode : MetadataTableTreeNode<PropertyTableTreeNode.PropertyDefEntry>
{
public PropertyTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.Property, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<PropertyDefEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<PropertyDefEntry>();
PropertyDefEntry scrollTargetEntry = default;
foreach (var row in metadata.PropertyDefinitions)
{
PropertyDefEntry entry = new PropertyDefEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
foreach (var row in metadataFile.Metadata.PropertyDefinitions)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new PropertyDefEntry(metadataFile, row));
}
return true;
return list;
}
struct PropertyDefEntry : IMemberTreeNode
internal struct PropertyDefEntry : IMemberTreeNode
{
readonly MetadataFile metadataFile;
readonly PropertyDefinitionHandle handle;

33
ILSpy/Metadata/CorTables/PtrTableTreeNode.cs

@ -25,7 +25,7 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,7 +25,7 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class PtrTableTreeNode : MetadataTableTreeNode
class PtrTableTreeNode : MetadataTableTreeNode<PtrTableTreeNode.PtrEntry>
{
readonly TableIndex referencedTableKind;
@ -47,17 +47,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -47,17 +47,11 @@ namespace ICSharpCode.ILSpy.Metadata
};
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<PtrEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<PtrEntry>();
PtrEntry scrollTargetEntry = default;
var metadata = metadataFile.Metadata;
var length = metadata.GetTableRowCount(Kind);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
@ -65,24 +59,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -65,24 +59,9 @@ namespace ICSharpCode.ILSpy.Metadata
for (int rid = 1; rid <= length; rid++)
{
var entry = new PtrEntry(metadataFile, Kind, referencedTableKind, handleDefSize, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new PtrEntry(metadataFile, Kind, referencedTableKind, handleDefSize, ptr, rid));
}
return true;
return list;
}
readonly struct HandlePtr
@ -95,7 +74,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -95,7 +74,7 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
struct PtrEntry
internal struct PtrEntry
{
readonly MetadataFile metadataFile;
readonly HandlePtr handlePtr;

31
ILSpy/Metadata/CorTables/StandAloneSigTableTreeNode.cs

@ -24,46 +24,25 @@ using ICSharpCode.Decompiler.Metadata; @@ -24,46 +24,25 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class StandAloneSigTableTreeNode : MetadataTableTreeNode
class StandAloneSigTableTreeNode : MetadataTableTreeNode<StandAloneSigTableTreeNode.StandAloneSigEntry>
{
public StandAloneSigTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.StandAloneSig, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<StandAloneSigEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<StandAloneSigEntry>();
StandAloneSigEntry scrollTargetEntry = default;
for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.StandAloneSig); row++)
{
StandAloneSigEntry entry = new StandAloneSigEntry(metadataFile, MetadataTokens.StandaloneSignatureHandle(row));
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new StandAloneSigEntry(metadataFile, MetadataTokens.StandaloneSignatureHandle(row)));
}
return true;
return list;
}
struct StandAloneSigEntry
internal struct StandAloneSigEntry
{
readonly MetadataFile metadataFile;
readonly StandaloneSignatureHandle handle;

35
ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs

@ -30,47 +30,24 @@ using ICSharpCode.ILSpy.TreeNodes; @@ -30,47 +30,24 @@ using ICSharpCode.ILSpy.TreeNodes;
namespace ICSharpCode.ILSpy.Metadata
{
internal class TypeDefTableTreeNode : MetadataTableTreeNode
internal class TypeDefTableTreeNode : MetadataTableTreeNode<TypeDefTableTreeNode.TypeDefEntry>
{
public TypeDefTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.TypeDef, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<TypeDefEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<TypeDefEntry>();
TypeDefEntry scrollTargetEntry = default;
foreach (var row in metadata.TypeDefinitions)
{
TypeDefEntry entry = new TypeDefEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
foreach (var row in metadataFile.Metadata.TypeDefinitions)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new TypeDefEntry(metadataFile, row));
}
return true;
return list;
}
struct TypeDefEntry : IMemberTreeNode
internal struct TypeDefEntry : IMemberTreeNode
{
readonly MetadataFile metadataFile;
readonly TypeDefinitionHandle handle;

35
ILSpy/Metadata/CorTables/TypeRefTableTreeNode.cs

@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -24,47 +24,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class TypeRefTableTreeNode : MetadataTableTreeNode
internal class TypeRefTableTreeNode : MetadataTableTreeNode<TypeRefTableTreeNode.TypeRefEntry>
{
public TypeRefTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.TypeRef, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<TypeRefEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<TypeRefEntry>();
TypeRefEntry scrollTargetEntry = default;
foreach (var row in metadata.TypeReferences)
foreach (var row in metadataFile.Metadata.TypeReferences)
{
TypeRefEntry entry = new TypeRefEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
list.Add(new TypeRefEntry(metadataFile, row));
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
}
return true;
return list;
}
struct TypeRefEntry
internal struct TypeRefEntry
{
readonly MetadataFile metadataFile;
readonly TypeReferenceHandle handle;

35
ILSpy/Metadata/CorTables/TypeSpecTableTreeNode.cs

@ -26,47 +26,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -26,47 +26,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class TypeSpecTableTreeNode : MetadataTableTreeNode
internal class TypeSpecTableTreeNode : MetadataTableTreeNode<TypeSpecTableTreeNode.TypeSpecEntry>
{
public TypeSpecTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.TypeSpec, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<TypeSpecEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = metadataFile.Metadata;
var list = new List<TypeSpecEntry>();
TypeSpecEntry scrollTargetEntry = default;
foreach (var row in metadata.GetTypeSpecifications())
{
TypeSpecEntry entry = new TypeSpecEntry(metadataFile, row);
if (scrollTarget.Equals(row))
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
foreach (var row in metadataFile.Metadata.GetTypeSpecifications())
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new TypeSpecEntry(metadataFile, row));
}
return true;
return list;
}
struct TypeSpecEntry
internal struct TypeSpecEntry
{
readonly int metadataOffset;
readonly MetadataFile module;

39
ILSpy/Metadata/DebugTables/CustomDebugInformationTableTreeNode.cs

@ -29,46 +29,27 @@ using ICSharpCode.Decompiler.Metadata; @@ -29,46 +29,27 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class CustomDebugInformationTableTreeNode : DebugMetadataTableTreeNode
internal class CustomDebugInformationTableTreeNode : DebugMetadataTableTreeNode<CustomDebugInformationTableTreeNode.CustomDebugInformationEntry>
{
public CustomDebugInformationTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.CustomDebugInformation, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<CustomDebugInformationEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
view.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected;
view.RowDetailsTemplateSelector = new CustomDebugInformationDetailsTemplateSelector();
var list = new List<CustomDebugInformationEntry>();
CustomDebugInformationEntry scrollTargetEntry = default;
foreach (var row in metadataFile.Metadata.CustomDebugInformation)
{
CustomDebugInformationEntry entry = new CustomDebugInformationEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry?.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new CustomDebugInformationEntry(metadataFile, row));
}
return list;
}
return true;
protected override void ConfigureDataGrid(DataGrid view)
{
view.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected;
view.RowDetailsTemplateSelector = new CustomDebugInformationDetailsTemplateSelector();
}
class CustomDebugInformationDetailsTemplateSelector : DataTemplateSelector
@ -89,7 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -89,7 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
class CustomDebugInformationEntry
internal struct CustomDebugInformationEntry
{
readonly int? offset;
readonly MetadataFile metadataFile;

30
ILSpy/Metadata/DebugTables/DocumentTableTreeNode.cs

@ -26,45 +26,25 @@ using ICSharpCode.Decompiler.Metadata; @@ -26,45 +26,25 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class DocumentTableTreeNode : DebugMetadataTableTreeNode
internal class DocumentTableTreeNode : DebugMetadataTableTreeNode<DocumentTableTreeNode.DocumentEntry>
{
public DocumentTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.Document, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<DocumentEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<DocumentEntry>();
DocumentEntry scrollTargetEntry = default;
foreach (var row in metadataFile.Metadata.Documents)
{
DocumentEntry entry = new DocumentEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new DocumentEntry(metadataFile, row));
}
return true;
return list;
}
readonly struct DocumentEntry
internal readonly struct DocumentEntry
{
readonly int? offset;
readonly MetadataFile metadataFile;

31
ILSpy/Metadata/DebugTables/ImportScopeTableTreeNode.cs

@ -24,45 +24,24 @@ using ICSharpCode.Decompiler.Metadata; @@ -24,45 +24,24 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class ImportScopeTableTreeNode : DebugMetadataTableTreeNode
internal class ImportScopeTableTreeNode : DebugMetadataTableTreeNode<ImportScopeTableTreeNode.ImportScopeEntry>
{
public ImportScopeTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.ImportScope, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<ImportScopeEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<ImportScopeEntry>();
ImportScopeEntry scrollTargetEntry = default;
foreach (var row in metadataFile.Metadata.ImportScopes)
{
ImportScopeEntry entry = new ImportScopeEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new ImportScopeEntry(metadataFile, row));
}
return true;
return list;
}
readonly struct ImportScopeEntry
internal readonly struct ImportScopeEntry
{
readonly int? offset;
readonly MetadataFile metadataFile;

29
ILSpy/Metadata/DebugTables/LocalConstantTableTreeNode.cs

@ -24,45 +24,26 @@ using ICSharpCode.Decompiler.Metadata; @@ -24,45 +24,26 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class LocalConstantTableTreeNode : DebugMetadataTableTreeNode
internal class LocalConstantTableTreeNode : DebugMetadataTableTreeNode<LocalConstantTableTreeNode.LocalConstantEntry>
{
public LocalConstantTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.LocalConstant, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<LocalConstantEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<LocalConstantEntry>();
LocalConstantEntry scrollTargetEntry = default;
foreach (var row in metadataFile.Metadata.LocalConstants)
{
LocalConstantEntry entry = new LocalConstantEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new LocalConstantEntry(metadataFile, row));
}
return true;
return list;
}
struct LocalConstantEntry
internal readonly struct LocalConstantEntry
{
readonly int? offset;
readonly MetadataFile metadataFile;

29
ILSpy/Metadata/DebugTables/LocalScopeTableTreeNode.cs

@ -25,45 +25,26 @@ using ICSharpCode.Decompiler.Metadata; @@ -25,45 +25,26 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class LocalScopeTableTreeNode : DebugMetadataTableTreeNode
internal class LocalScopeTableTreeNode : DebugMetadataTableTreeNode<LocalScopeTableTreeNode.LocalScopeEntry>
{
public LocalScopeTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.LocalScope, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<LocalScopeEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<LocalScopeEntry>();
LocalScopeEntry scrollTargetEntry = default;
foreach (var row in metadataFile.Metadata.LocalScopes)
{
LocalScopeEntry entry = new LocalScopeEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new LocalScopeEntry(metadataFile, row));
}
return true;
return list;
}
struct LocalScopeEntry
internal struct LocalScopeEntry
{
readonly int? offset;
readonly MetadataFile metadataFile;

29
ILSpy/Metadata/DebugTables/LocalVariableTableTreeNode.cs

@ -24,45 +24,26 @@ using ICSharpCode.Decompiler.Metadata; @@ -24,45 +24,26 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class LocalVariableTableTreeNode : DebugMetadataTableTreeNode
internal class LocalVariableTableTreeNode : DebugMetadataTableTreeNode<LocalVariableTableTreeNode.LocalVariableEntry>
{
public LocalVariableTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.LocalVariable, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<LocalVariableEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<LocalVariableEntry>();
LocalVariableEntry scrollTargetEntry = default;
foreach (var row in metadataFile.Metadata.LocalVariables)
{
LocalVariableEntry entry = new LocalVariableEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new LocalVariableEntry(metadataFile, row));
}
return true;
return list;
}
struct LocalVariableEntry
internal struct LocalVariableEntry
{
readonly int? offset;
readonly MetadataFile metadataFile;

30
ILSpy/Metadata/DebugTables/MethodDebugInformationTableTreeNode.cs

@ -27,45 +27,25 @@ using ICSharpCode.Decompiler.Metadata; @@ -27,45 +27,25 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class MethodDebugInformationTableTreeNode : DebugMetadataTableTreeNode
internal class MethodDebugInformationTableTreeNode : DebugMetadataTableTreeNode<MethodDebugInformationTableTreeNode.MethodDebugInformationEntry>
{
public MethodDebugInformationTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.MethodDebugInformation, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<MethodDebugInformationEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<MethodDebugInformationEntry>();
MethodDebugInformationEntry scrollTargetEntry = default;
foreach (var row in metadataFile.Metadata.MethodDebugInformation)
{
MethodDebugInformationEntry entry = new MethodDebugInformationEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new MethodDebugInformationEntry(metadataFile, row));
}
return true;
return list;
}
struct MethodDebugInformationEntry
internal struct MethodDebugInformationEntry
{
readonly int? offset;
readonly MetadataFile metadataFile;

31
ILSpy/Metadata/DebugTables/StateMachineMethodTableTreeNode.cs

@ -24,48 +24,28 @@ using ICSharpCode.Decompiler.Metadata; @@ -24,48 +24,28 @@ using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class StateMachineMethodTableTreeNode : DebugMetadataTableTreeNode
internal class StateMachineMethodTableTreeNode : DebugMetadataTableTreeNode<StateMachineMethodTableTreeNode.StateMachineMethodEntry>
{
public StateMachineMethodTableTreeNode(MetadataFile metadataFile)
: base(TableIndex.StateMachineMethod, metadataFile)
{
}
public override bool View(ViewModels.TabPageModel tabPage)
protected override IReadOnlyList<StateMachineMethodEntry> LoadTable()
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<StateMachineMethodEntry>();
StateMachineMethodEntry scrollTargetEntry = default;
var length = metadataFile.Metadata.GetTableRowCount(TableIndex.StateMachineMethod);
var reader = metadataFile.Metadata.AsBlobReader();
reader.Offset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.StateMachineMethod);
for (int rid = 1; rid <= length; rid++)
{
StateMachineMethodEntry entry = new StateMachineMethodEntry(metadataFile, ref reader, rid);
if (scrollTarget == rid)
{
scrollTargetEntry = entry;
}
list.Add(entry);
}
view.ItemsSource = list;
tabPage.Content = view;
if (scrollTargetEntry.RID > 0)
{
ScrollItemIntoView(view, scrollTargetEntry);
list.Add(new StateMachineMethodEntry(metadataFile, ref reader, rid));
}
return true;
return list;
}
struct StateMachineMethodEntry
internal struct StateMachineMethodEntry
{
readonly int? offset;
readonly MetadataFile metadataFile;
@ -114,7 +94,6 @@ namespace ICSharpCode.ILSpy.Metadata @@ -114,7 +94,6 @@ namespace ICSharpCode.ILSpy.Metadata
this.kickoffMethodTooltip = null;
this.moveNextMethodTooltip = null;
}
}
}
}

51
ILSpy/Metadata/MetadataTableTreeNode.cs

@ -16,7 +16,7 @@ @@ -16,7 +16,7 @@
// 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.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Windows.Controls;
@ -26,6 +26,7 @@ using ICSharpCode.Decompiler; @@ -26,6 +26,7 @@ using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.ViewModels;
namespace ICSharpCode.ILSpy.Metadata
{
@ -51,10 +52,18 @@ namespace ICSharpCode.ILSpy.Metadata @@ -51,10 +52,18 @@ namespace ICSharpCode.ILSpy.Metadata
this.scrollTarget = metadataFile.Metadata.GetRowNumber((EntityHandle)handle);
}
protected void ScrollItemIntoView(DataGrid view, object item)
protected void ScrollRowIntoView(DataGrid view, int row)
{
view.Loaded += View_Loaded;
view.Dispatcher.BeginInvoke((Action)(() => view.SelectItem(item)), DispatcherPriority.Background);
if (!view.IsLoaded)
{
view.Loaded += View_Loaded;
}
else
{
View_Loaded(view, new System.Windows.RoutedEventArgs());
}
if (view.Items.Count > row && row >= 0)
view.Dispatcher.BeginInvoke(() => view.SelectItem(view.Items[row]), DispatcherPriority.Background);
}
private void View_Loaded(object sender, System.Windows.RoutedEventArgs e)
@ -138,7 +147,39 @@ namespace ICSharpCode.ILSpy.Metadata @@ -138,7 +147,39 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
internal abstract class DebugMetadataTableTreeNode : MetadataTableTreeNode
internal abstract class MetadataTableTreeNode<TEntry> : MetadataTableTreeNode
where TEntry : struct
{
public MetadataTableTreeNode(TableIndex kind, MetadataFile metadataFile)
: base(kind, metadataFile)
{
}
protected abstract IReadOnlyList<TEntry> LoadTable();
protected virtual void ConfigureDataGrid(DataGrid view)
{
}
public override bool View(TabPageModel tabPage)
{
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
ConfigureDataGrid(view);
view.ItemsSource = LoadTable();
tabPage.Content = view;
ScrollRowIntoView(view, scrollTarget);
return true;
}
}
internal abstract class DebugMetadataTableTreeNode<TEntry> : MetadataTableTreeNode<TEntry>
where TEntry : struct
{
public DebugMetadataTableTreeNode(TableIndex kind, MetadataFile metadataFile)
: base(kind, metadataFile)

Loading…
Cancel
Save