Browse Source

Reimplement all StringHandle columns.

pull/1716/head
Siegfried Pammer 6 years ago
parent
commit
fcc6b57875
  1. 9
      ILSpy/Metadata/CorTables/AssemblyRefTableTreeNode.cs
  2. 8
      ILSpy/Metadata/CorTables/AssemblyTableTreeNode.cs
  3. 7
      ILSpy/Metadata/CorTables/EventTableTreeNode.cs
  4. 10
      ILSpy/Metadata/CorTables/ExportedTypeTableTreeNode.cs
  5. 2
      ILSpy/Metadata/CorTables/FieldLayoutTableTreeNode.cs
  6. 10
      ILSpy/Metadata/CorTables/FieldTableTreeNode.cs
  7. 4
      ILSpy/Metadata/CorTables/FileTableTreeNode.cs
  8. 8
      ILSpy/Metadata/CorTables/GenericParamTableTreeNode.cs
  9. 9
      ILSpy/Metadata/CorTables/ManifestResourceTableTreeNode.cs
  10. 4
      ILSpy/Metadata/CorTables/MemberRefTableTreeNode.cs
  11. 12
      ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs
  12. 1
      ILSpy/Metadata/CorTables/MethodTableTreeNode.cs
  13. 4
      ILSpy/Metadata/CorTables/ModuleRefTableTreeNode.cs
  14. 4
      ILSpy/Metadata/CorTables/ModuleTableTreeNode.cs
  15. 8
      ILSpy/Metadata/CorTables/ParamTableTreeNode.cs
  16. 9
      ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs
  17. 13
      ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs
  18. 7
      ILSpy/Metadata/CorTables/TypeRefTableTreeNode.cs
  19. 4
      ILSpy/Metadata/DataGridCustomTextColumn.cs
  20. 83
      ILSpy/Metadata/Helpers.cs
  21. 29
      ILSpy/Metadata/MetadataTableViews.xaml

9
ILSpy/Metadata/CorTables/AssemblyRefTableTreeNode.cs

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Windows.Controls;
@ -78,9 +79,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -78,9 +79,9 @@ namespace ICSharpCode.ILSpy.Metadata
public Version Version => assemblyRef.Version;
public int Flags => (int)assemblyRef.Flags;
public AssemblyFlags Flags => assemblyRef.Flags;
public string FlagsTooltip => null;// Helpers.AttributesToString(assemblyRef.Flags);
public object FlagsTooltip => new FlagsTooltip((int)assemblyRef.Flags, typeof(AssemblyFlags));
public int PublicKeyOrToken => MetadataTokens.GetHeapOffset(assemblyRef.PublicKeyOrToken);
@ -93,11 +94,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -93,11 +94,11 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public int NameStringHandle => MetadataTokens.GetHeapOffset(assemblyRef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(assemblyRef.Name):X} \"{Name}\"";
public string Name => metadata.GetString(assemblyRef.Name);
public int CultureStringHandle => MetadataTokens.GetHeapOffset(assemblyRef.Culture);
public string CultureTooltip => $"{MetadataTokens.GetHeapOffset(assemblyRef.Culture):X} \"{Culture}\"";
public string Culture => metadata.GetString(assemblyRef.Culture);

8
ILSpy/Metadata/CorTables/AssemblyTableTreeNode.cs

@ -83,17 +83,17 @@ namespace ICSharpCode.ILSpy.Metadata @@ -83,17 +83,17 @@ namespace ICSharpCode.ILSpy.Metadata
public string HashAlgorithmTooltip => assembly.HashAlgorithm.ToString();
public int Flags => (int)assembly.Flags;
public AssemblyFlags Flags => assembly.Flags;
public string FlagsTooltip => null;// Helpers.AttributesToString(assembly.Flags);
public object FlagsTooltip => new FlagsTooltip((int)assembly.Flags, typeof(AssemblyFlags));
public Version Version => assembly.Version;
public int NameStringHandle => MetadataTokens.GetHeapOffset(assembly.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(assembly.Name):X} \"{Name}\"";
public string Name => metadata.GetString(assembly.Name);
public int CultureStringHandle => MetadataTokens.GetHeapOffset(assembly.Culture);
public string CultureTooltip => $"{MetadataTokens.GetHeapOffset(assembly.Culture):X} \"{Culture}\"";
public string Culture => metadata.GetString(assembly.Culture);

7
ILSpy/Metadata/CorTables/EventTableTreeNode.cs

@ -31,6 +31,7 @@ using ICSharpCode.Decompiler.Metadata; @@ -31,6 +31,7 @@ using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.ILSpy.TextView;
using ICSharpCode.ILSpy.TreeNodes;
using System.Reflection;
namespace ICSharpCode.ILSpy.Metadata
{
@ -82,11 +83,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -82,11 +83,11 @@ namespace ICSharpCode.ILSpy.Metadata
+ metadata.GetTableMetadataOffset(TableIndex.Event)
+ metadata.GetTableRowSize(TableIndex.Event) * (RID - 1);
public int Attributes => (int)eventDef.Attributes;
public EventAttributes Attributes => eventDef.Attributes;
public string AttributesTooltip => null; //Helpers.AttributesToString(EventDef.Attributes);
public object AttributesTooltip => new FlagsTooltip((int)eventDef.Attributes, typeof(EventAttributes));
public int NameStringHandle => MetadataTokens.GetHeapOffset(eventDef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(eventDef.Name):X} \"{Name}\"";
public string Name => metadata.GetString(eventDef.Name);

10
ILSpy/Metadata/CorTables/ExportedTypeTableTreeNode.cs

@ -82,19 +82,19 @@ namespace ICSharpCode.ILSpy.Metadata @@ -82,19 +82,19 @@ namespace ICSharpCode.ILSpy.Metadata
+ metadata.GetTableMetadataOffset(TableIndex.ExportedType)
+ metadata.GetTableRowSize(TableIndex.ExportedType) * (RID-1);
public int Attributes => (int)type.Attributes;
public TypeAttributes Attributes => type.Attributes;
public string AttributesTooltip => Helpers.AttributesToString(type.Attributes);
public object AttributesTooltip => new FlagsTooltip((int)type.Attributes, typeof(TypeAttributes));
public int TypeDefId => type.GetTypeDefinitionId();
public int TypeNameStringHandle => MetadataTokens.GetHeapOffset(type.Name);
public string TypeNameTooltip => $"{MetadataTokens.GetHeapOffset(type.Name):X} \"{TypeName}\"";
public string TypeName => metadata.GetString(type.Name);
public int TypeNamespaceStringHandle => MetadataTokens.GetHeapOffset(type.Namespace);
public string TypeNamespaceTooltip => $"{MetadataTokens.GetHeapOffset(type.Name):X} \"{TypeNamespace}\"";
public string TypeNamespace => metadata.GetString(type.Namespace);
public string TypeNamespace => metadata.GetString(type.Name);
public int Implementation => MetadataTokens.GetToken(type.Implementation);

2
ILSpy/Metadata/CorTables/FieldLayoutTableTreeNode.cs

@ -87,7 +87,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -87,7 +87,7 @@ namespace ICSharpCode.ILSpy.Metadata
//public int Attributes => (int)fieldDef.Attributes;
//public string AttributesTooltip => null; //Helpers.AttributesToString(fieldDef.Attributes);
//public object AttributesTooltip => new FlagsTooltip((int)eventDef.Attributes, typeof(EventAttributes));
//public int NameStringHandle => MetadataTokens.GetHeapOffset(fieldDef.Name);

10
ILSpy/Metadata/CorTables/FieldTableTreeNode.cs

@ -19,6 +19,7 @@ @@ -19,6 +19,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Text;
@ -82,16 +83,17 @@ namespace ICSharpCode.ILSpy.Metadata @@ -82,16 +83,17 @@ namespace ICSharpCode.ILSpy.Metadata
+ metadata.GetTableMetadataOffset(TableIndex.Field)
+ metadata.GetTableRowSize(TableIndex.Field) * (RID - 1);
public int Attributes => (int)fieldDef.Attributes;
public FieldAttributes Attributes => fieldDef.Attributes;
public string AttributesTooltip => null; //Helpers.AttributesToString(fieldDef.Attributes);
public int NameStringHandle => MetadataTokens.GetHeapOffset(fieldDef.Name);
public object AttributesTooltip => new FlagsTooltip((int)fieldDef.Attributes, typeof(FieldAttributes));
public string Name => metadata.GetString(fieldDef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(fieldDef.Name):X} \"{Name}\"";
IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemOrNull()?.MainModule).GetDefinition(handle);
[StringFormat("X8")]
public int Signature => MetadataTokens.GetHeapOffset(fieldDef.Signature);
public string SignatureTooltip {

4
ILSpy/Metadata/CorTables/FileTableTreeNode.cs

@ -86,10 +86,10 @@ namespace ICSharpCode.ILSpy.Metadata @@ -86,10 +86,10 @@ namespace ICSharpCode.ILSpy.Metadata
public string AttributesTooltip => assemblyFile.ContainsMetadata ? "ContainsMetaData" : "ContainsNoMetaData";
public int NameStringHandle => MetadataTokens.GetHeapOffset(assemblyFile.Name);
public string Name => metadata.GetString(assemblyFile.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(assemblyFile.Name):X} \"{Name}\"";
public int HashValue => MetadataTokens.GetHeapOffset(assemblyFile.HashValue);
public string HashValueTooltip {

8
ILSpy/Metadata/CorTables/GenericParamTableTreeNode.cs

@ -87,9 +87,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -87,9 +87,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Number => genericParam.Index;
public int Attributes => (int)genericParam.Attributes;
public GenericParameterAttributes Attributes => genericParam.Attributes;
public string AttributesTooltip => null; // TODO
public object AttributesTooltip => new FlagsTooltip((int)genericParam.Attributes, typeof(GenericParameterAttributes));
public int OwnerHandle => MetadataTokens.GetToken(genericParam.Parent);
@ -101,10 +101,10 @@ namespace ICSharpCode.ILSpy.Metadata @@ -101,10 +101,10 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public int NameStringHandle => MetadataTokens.GetHeapOffset(genericParam.Name);
public string Name => metadata.GetString(genericParam.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(genericParam.Name):X} \"{Name}\"";
public GenericParamEntry(PEFile module, GenericParameterHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;

9
ILSpy/Metadata/CorTables/ManifestResourceTableTreeNode.cs

@ -19,6 +19,7 @@ @@ -19,6 +19,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Text;
@ -82,14 +83,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -82,14 +83,14 @@ namespace ICSharpCode.ILSpy.Metadata
+ metadata.GetTableMetadataOffset(TableIndex.ManifestResource)
+ metadata.GetTableRowSize(TableIndex.ManifestResource) * (RID - 1);
public int Attributes => (int)manifestResource.Attributes;
public ManifestResourceAttributes Attributes => manifestResource.Attributes;
public string AttributesTooltip => null; // TODO : Helpers.AttributesToString(manifestResource.Attributes);
public int NameStringHandle => MetadataTokens.GetHeapOffset(manifestResource.Name);
public object AttributesTooltip => new FlagsTooltip((int)manifestResource.Attributes, typeof(ManifestResourceAttributes));
public string Name => metadata.GetString(manifestResource.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(manifestResource.Name):X} \"{Name}\"";
public int ImplementationHandle => MetadataTokens.GetToken(manifestResource.Implementation);
public string ImplementationTooltip {

4
ILSpy/Metadata/CorTables/MemberRefTableTreeNode.cs

@ -92,10 +92,10 @@ namespace ICSharpCode.ILSpy.Metadata @@ -92,10 +92,10 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public int NameStringHandle => MetadataTokens.GetHeapOffset(memberRef.Name);
public string Name => metadata.GetString(memberRef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(memberRef.Name):X} \"{Name}\"";
public int Signature => MetadataTokens.GetHeapOffset(memberRef.Signature);
public string SignatureTooltip {

12
ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs

@ -84,9 +84,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -84,9 +84,9 @@ namespace ICSharpCode.ILSpy.Metadata
+ metadata.GetTableMetadataOffset(TableIndex.MethodDef)
+ metadata.GetTableRowSize(TableIndex.MethodDef) * (RID - 1);
public int MethodDeclarationHandle => MetadataTokens.GetToken(methodImpl.MethodDeclaration);
public int MethodDeclaration => MetadataTokens.GetToken(methodImpl.MethodDeclaration);
public string MethodDeclaration {
public string MethodDeclarationTooltip {
get {
ITextOutput output = new PlainTextOutput();
methodImpl.MethodDeclaration.WriteTo(module, output, Decompiler.Metadata.GenericContext.Empty);
@ -94,9 +94,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -94,9 +94,9 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public int MethodBodyHandle => MetadataTokens.GetToken(methodImpl.MethodBody);
public int MethodBody => MetadataTokens.GetToken(methodImpl.MethodBody);
public string MethodBody {
public string MethodBodyTooltip {
get {
ITextOutput output = new PlainTextOutput();
methodImpl.MethodBody.WriteTo(module, output, Decompiler.Metadata.GenericContext.Empty);
@ -104,9 +104,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -104,9 +104,9 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public int TypeHandle => MetadataTokens.GetToken(methodImpl.Type);
public int Type => MetadataTokens.GetToken(methodImpl.Type);
public string Type {
public string TypeTooltip {
get {
ITextOutput output = new PlainTextOutput();
((EntityHandle)methodImpl.Type).WriteTo(module, output, Decompiler.Metadata.GenericContext.Empty);

1
ILSpy/Metadata/CorTables/MethodTableTreeNode.cs

@ -97,6 +97,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -97,6 +97,7 @@ namespace ICSharpCode.ILSpy.Metadata
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(methodDef.Name):X} \"{Name}\"";
[StringFormat("X8")]
public int Signature => MetadataTokens.GetHeapOffset(methodDef.Signature);
string signatureTooltip;

4
ILSpy/Metadata/CorTables/ModuleRefTableTreeNode.cs

@ -83,10 +83,10 @@ namespace ICSharpCode.ILSpy.Metadata @@ -83,10 +83,10 @@ namespace ICSharpCode.ILSpy.Metadata
+ metadata.GetTableMetadataOffset(TableIndex.ModuleRef)
+ metadata.GetTableRowSize(TableIndex.ModuleRef) * (RID-1);
public int NameStringHandle => MetadataTokens.GetHeapOffset(moduleRef.Name);
public string Name => metadata.GetString(moduleRef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(moduleRef.Name):X} \"{Name}\"";
public ModuleRefEntry(PEFile module, ModuleReferenceHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;

4
ILSpy/Metadata/CorTables/ModuleTableTreeNode.cs

@ -84,10 +84,10 @@ namespace ICSharpCode.ILSpy.Metadata @@ -84,10 +84,10 @@ namespace ICSharpCode.ILSpy.Metadata
public int Generation => moduleDef.Generation;
public int NameStringHandle => MetadataTokens.GetHeapOffset(moduleDef.Name);
public string Name => metadata.GetString(moduleDef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(moduleDef.Name):X} \"{Name}\"";
public int Mvid => MetadataTokens.GetHeapOffset(moduleDef.Mvid);
public string MvidTooltip => metadata.GetGuid(moduleDef.Mvid).ToString();

8
ILSpy/Metadata/CorTables/ParamTableTreeNode.cs

@ -86,14 +86,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -86,14 +86,14 @@ namespace ICSharpCode.ILSpy.Metadata
+ metadata.GetTableMetadataOffset(TableIndex.Param)
+ metadata.GetTableRowSize(TableIndex.Param) * (RID-1);
public int Attributes => (int)param.Attributes;
public ParameterAttributes Attributes => param.Attributes;
public string AttributesTooltip => null; //Helpers.AttributesToString(param.Attributes);
public int NameStringHandle => MetadataTokens.GetHeapOffset(param.Name);
public object AttributesTooltip => new FlagsTooltip((int)param.Attributes, typeof(ParameterAttributes));
public string Name => metadata.GetString(param.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(param.Name):X} \"{Name}\"";
public int Sequence => param.SequenceNumber;
public ParamEntry(PEFile module, ParameterHandle handle)

9
ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs

@ -31,6 +31,7 @@ using ICSharpCode.Decompiler.Metadata; @@ -31,6 +31,7 @@ using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.ILSpy.TextView;
using ICSharpCode.ILSpy.TreeNodes;
using System.Reflection;
namespace ICSharpCode.ILSpy.Metadata
{
@ -82,14 +83,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -82,14 +83,14 @@ namespace ICSharpCode.ILSpy.Metadata
+ metadata.GetTableMetadataOffset(TableIndex.Property)
+ metadata.GetTableRowSize(TableIndex.Property) * (RID - 1);
public int Attributes => (int)propertyDef.Attributes;
public PropertyAttributes Attributes => propertyDef.Attributes;
public string AttributesTooltip => null; //Helpers.AttributesToString(PropertyDef.Attributes);
public int NameStringHandle => MetadataTokens.GetHeapOffset(propertyDef.Name);
public object AttributesTooltip => new FlagsTooltip((int)propertyDef.Attributes, typeof(PropertyAttributes));
public string Name => metadata.GetString(propertyDef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(propertyDef.Name):X} \"{Name}\"";
IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemOrNull()?.MainModule).GetDefinition(handle);
public int Signature => MetadataTokens.GetHeapOffset(propertyDef.Signature);

13
ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs

@ -86,21 +86,22 @@ namespace ICSharpCode.ILSpy.Metadata @@ -86,21 +86,22 @@ namespace ICSharpCode.ILSpy.Metadata
+ metadata.GetTableMetadataOffset(TableIndex.TypeDef)
+ metadata.GetTableRowSize(TableIndex.TypeDef) * (RID-1);
public int Attributes => (int)typeDef.Attributes;
public TypeAttributes Attributes => typeDef.Attributes;
public string AttributesTooltip => Helpers.AttributesToString(typeDef.Attributes);
public object AttributesTooltip => new FlagsTooltip((int)typeDef.Attributes, typeof(TypeAttributes));
public int NameStringHandle => MetadataTokens.GetHeapOffset(typeDef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(typeDef.Name):X} \"{Name}\"";
public string Name => metadata.GetString(typeDef.Name);
public int NamespaceStringHandle => MetadataTokens.GetHeapOffset(typeDef.Namespace);
public string NamespaceTooltip => $"{MetadataTokens.GetHeapOffset(typeDef.Namespace):X} \"{Namespace}\"";
public string Namespace => metadata.GetString(typeDef.Namespace);
[StringFormat("X8")]
public int BaseType => MetadataTokens.GetToken(typeDef.BaseType);
public string BaseTypeSignature {
public string BaseTypeTooltip {
get {
var output = new PlainTextOutput();
var provider = new DisassemblerSignatureTypeProvider(module, output);
@ -122,8 +123,10 @@ namespace ICSharpCode.ILSpy.Metadata @@ -122,8 +123,10 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
[StringFormat("X8")]
public int FieldList => MetadataTokens.GetToken(typeDef.GetFields().FirstOrDefault());
[StringFormat("X8")]
public int MethodList => MetadataTokens.GetToken(typeDef.GetMethods().FirstOrDefault());
IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemOrNull()?.MainModule).GetDefinition(handle);

7
ILSpy/Metadata/CorTables/TypeRefTableTreeNode.cs

@ -84,9 +84,10 @@ namespace ICSharpCode.ILSpy.Metadata @@ -84,9 +84,10 @@ namespace ICSharpCode.ILSpy.Metadata
+ metadata.GetTableMetadataOffset(TableIndex.TypeRef)
+ metadata.GetTableRowSize(TableIndex.TypeRef) * (RID-1);
[StringFormat("X8")]
public int ResolutionScope => MetadataTokens.GetToken(typeRef.ResolutionScope);
public string ResolutionScopeSignature {
public string ResolutionScopeTooltip {
get {
if (typeRef.ResolutionScope.IsNil)
return null;
@ -111,11 +112,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -111,11 +112,11 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public int NameStringHandle => MetadataTokens.GetHeapOffset(typeRef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(typeRef.Name):X} \"{Name}\"";
public string Name => metadata.GetString(typeRef.Name);
public int NamespaceStringHandle => MetadataTokens.GetHeapOffset(typeRef.Namespace);
public string NamespaceTooltip => $"{MetadataTokens.GetHeapOffset(typeRef.Namespace):X} \"{Namespace}\"";
public string Namespace => metadata.GetString(typeRef.Namespace);

4
ILSpy/Metadata/DataGridCustomTextColumn.cs

@ -31,7 +31,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -31,7 +31,9 @@ namespace ICSharpCode.ILSpy.Metadata
{
TextBox textBox = new TextBox() { Style = (Style)MetadataTableViews.Instance["DataGridCustomTextColumnTextBoxStyle"] };
BindingOperations.SetBinding(textBox, TextBox.TextProperty, Binding);
BindingOperations.SetBinding(textBox, TextBox.ToolTipProperty, ToolTipBinding);
if (ToolTipBinding != null) {
BindingOperations.SetBinding(textBox, TextBox.ToolTipProperty, ToolTipBinding);
}
return textBox;
}
}

83
ILSpy/Metadata/Helpers.cs

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Reflection;
@ -86,17 +87,16 @@ namespace ICSharpCode.ILSpy.Metadata @@ -86,17 +87,16 @@ namespace ICSharpCode.ILSpy.Metadata
switch (e.PropertyName) {
case "RID":
e.Column.SetTemplate((ControlTemplate)MetadataTableViews.Instance["DefaultFilter"]);
((DataGridCustomTextColumn)e.Column).ToolTipBinding = null;
break;
case "Token":
case "Offset":
case "RVA":
case "Signature":
binding.StringFormat = "X8";
e.Column.SetTemplate((ControlTemplate)MetadataTableViews.Instance["HexFilter"]);
((DataGridCustomTextColumn)e.Column).ToolTipBinding = null;
break;
case "Name":
e.Column.SetTemplate((ControlTemplate)MetadataTableViews.Instance["DefaultFilter"]);
break;
case "Flags":
case "Attributes":
case "ImplAttributes":
binding.Converter = new UnderlyingEnumValueConverter();
@ -105,8 +105,25 @@ namespace ICSharpCode.ILSpy.Metadata @@ -105,8 +105,25 @@ namespace ICSharpCode.ILSpy.Metadata
break;
default:
e.Cancel = e.PropertyName.Contains("Tooltip");
if (!e.Cancel) {
e.Column.SetTemplate((ControlTemplate)MetadataTableViews.Instance["DefaultFilter"]);
}
break;
}
if (!e.Cancel) {
ApplyAttributes((PropertyDescriptor)e.PropertyDescriptor, binding, e.Column);
}
}
static void ApplyAttributes(PropertyDescriptor descriptor, BindingBase binding, DataGridColumn column)
{
var stringFormat = descriptor.Attributes.OfType<StringFormatAttribute>().FirstOrDefault();
if (stringFormat != null) {
binding.StringFormat = stringFormat.Format;
if (stringFormat.Format.StartsWith("X", StringComparison.OrdinalIgnoreCase)) {
column.SetTemplate((ControlTemplate)MetadataTableViews.Instance["HexFilter"]);
}
}
}
class UnderlyingEnumValueConverter : IValueConverter
@ -127,61 +144,15 @@ namespace ICSharpCode.ILSpy.Metadata @@ -127,61 +144,15 @@ namespace ICSharpCode.ILSpy.Metadata
throw new NotImplementedException();
}
}
}
public static string AttributesToString(TypeAttributes attributes)
{
const TypeAttributes allMasks = TypeAttributes.ClassSemanticsMask | TypeAttributes.CustomFormatMask | TypeAttributes.LayoutMask | TypeAttributes.ReservedMask | TypeAttributes.StringFormatMask | TypeAttributes.VisibilityMask;
StringBuilder sb = new StringBuilder();
var visibility = attributes & TypeAttributes.VisibilityMask;
sb.AppendLine("Visibility: " + (visibility == 0 ? "NotPublic" : typeof(TypeAttributes).GetEnumName(visibility)));
var layout = attributes & TypeAttributes.LayoutMask;
sb.AppendLine("Class layout: " + (layout == 0 ? "AutoLayout" : typeof(TypeAttributes).GetEnumName(layout)));
var semantics = attributes & TypeAttributes.ClassSemanticsMask;
sb.AppendLine("Class semantics: " + (semantics == 0 ? "Class" : typeof(TypeAttributes).GetEnumName(semantics)));
var stringFormat = attributes & TypeAttributes.StringFormatMask;
sb.AppendLine("String format: " + (stringFormat == 0 ? "AnsiClass" : typeof(TypeAttributes).GetEnumName(stringFormat)));
var customStringFormat = attributes & TypeAttributes.CustomFormatMask;
sb.AppendLine("Custom string format: 0x" + customStringFormat.ToString("x"));
var reserved = attributes & TypeAttributes.ReservedMask;
sb.AppendLine("Reserved attributes: " + (reserved == 0 ? "" : reserved.ToString()));
var additional = attributes & ~allMasks;
sb.Append("Additional attributes: ");
AdditionalAttributes(sb, (int)additional);
if (sb.Length == 0)
return null;
return sb.ToString();
}
public static string AttributesToString(MethodAttributes attributes)
{
const MethodAttributes allMasks = MethodAttributes.MemberAccessMask | MethodAttributes.ReservedMask | MethodAttributes.VtableLayoutMask;
StringBuilder sb = new StringBuilder();
var visibility = attributes & MethodAttributes.MemberAccessMask;
sb.AppendLine("MemberAccess: " + (visibility == 0 ? "CompilerControlled" : typeof(MethodAttributes).GetEnumName(visibility)));
var layout = attributes & MethodAttributes.VtableLayoutMask;
sb.AppendLine("V-Table layout: " + (layout == 0 ? "ReuseSlot" : typeof(MethodAttributes).GetEnumName(layout)));
var reserved = attributes & MethodAttributes.ReservedMask;
sb.AppendLine("Reserved attributes: " + (reserved == 0 ? "" : reserved.ToString()));
var additional = attributes & ~allMasks;
sb.Append("Additional attributes: ");
AdditionalAttributes(sb, (int)additional);
if (sb.Length == 0)
return null;
return sb.ToString();
}
class StringFormatAttribute : Attribute
{
public string Format { get; }
static void AdditionalAttributes(StringBuilder sb, int attributes)
public StringFormatAttribute(string format)
{
bool first = true;
for (int bit = 0; bit < 32; bit++) {
var value = 1 << bit;
if ((attributes & value) != 0) {
if (!first)
sb.Append(", ");
first = false;
sb.Append(typeof(TypeAttributes).GetEnumName(value));
}
}
this.Format = format;
}
}
}

29
ILSpy/Metadata/MetadataTableViews.xaml

@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
xmlns:controls="clr-namespace:ICSharpCode.ILSpy.Controls"
xmlns:local="clr-namespace:ICSharpCode.ILSpy.Metadata"
xmlns:reflection="clr-namespace:System.Reflection;assembly=mscorlib"
xmlns:srm="clr-namespace:System.Reflection;assembly=System.Reflection.Metadata"
xmlns:dgx="urn:tom-englert.de/DataGridExtensions">
<Style x:Key="DataGridCustomTextColumnTextBoxStyle" TargetType="TextBox">
@ -42,6 +43,10 @@ @@ -42,6 +43,10 @@
<local:HexFilterControl Filter="{Binding Path=Filter, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dgx:DataGridFilterColumnControl}}" />
</ControlTemplate>
<ControlTemplate x:Key="AssemblyFlagsFilter">
<local:FlagsFilterControl FlagsType="{x:Type srm:AssemblyFlags}" Filter="{Binding Path=Filter, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dgx:DataGridFilterColumnControl}}" />
</ControlTemplate>
<ControlTemplate x:Key="MethodAttributesFilter">
<local:FlagsFilterControl FlagsType="{x:Type reflection:MethodAttributes}" Filter="{Binding Path=Filter, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dgx:DataGridFilterColumnControl}}" />
</ControlTemplate>
@ -50,6 +55,30 @@ @@ -50,6 +55,30 @@
<local:FlagsFilterControl FlagsType="{x:Type reflection:MethodImplAttributes}" Filter="{Binding Path=Filter, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dgx:DataGridFilterColumnControl}}" />
</ControlTemplate>
<ControlTemplate x:Key="TypeAttributesFilter">
<local:FlagsFilterControl FlagsType="{x:Type reflection:TypeAttributes}" Filter="{Binding Path=Filter, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dgx:DataGridFilterColumnControl}}" />
</ControlTemplate>
<ControlTemplate x:Key="PropertyAttributesFilter">
<local:FlagsFilterControl FlagsType="{x:Type reflection:PropertyAttributes}" Filter="{Binding Path=Filter, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dgx:DataGridFilterColumnControl}}" />
</ControlTemplate>
<ControlTemplate x:Key="EventAttributesFilter">
<local:FlagsFilterControl FlagsType="{x:Type reflection:EventAttributes}" Filter="{Binding Path=Filter, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dgx:DataGridFilterColumnControl}}" />
</ControlTemplate>
<ControlTemplate x:Key="FieldAttributesFilter">
<local:FlagsFilterControl FlagsType="{x:Type reflection:FieldAttributes}" Filter="{Binding Path=Filter, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dgx:DataGridFilterColumnControl}}" />
</ControlTemplate>
<ControlTemplate x:Key="ManifestResourceAttributesFilter">
<local:FlagsFilterControl FlagsType="{x:Type srm:ManifestResourceAttributes}" Filter="{Binding Path=Filter, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dgx:DataGridFilterColumnControl}}" />
</ControlTemplate>
<ControlTemplate x:Key="GenericParameterAttributesFilter">
<local:FlagsFilterControl FlagsType="{x:Type reflection:GenericParameterAttributes}" Filter="{Binding Path=Filter, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=dgx:DataGridFilterColumnControl}}" />
</ControlTemplate>
<Style x:Key="ItemContainerStyle" TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>

Loading…
Cancel
Save