Browse Source

Fix #1394: Fields marked 'specialname' are excluded from the type system

pull/1409/head
Siegfried Pammer 7 years ago
parent
commit
9d19b33ec0
  1. 10
      ICSharpCode.Decompiler.Tests/TypeSystem/TypeSystemLoaderTests.cs
  2. 4
      ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs
  3. 2
      ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs
  4. 12
      ILSpy/TreeNodes/TypeTreeNode.cs

10
ICSharpCode.Decompiler.Tests/TypeSystem/TypeSystemLoaderTests.cs

@ -488,9 +488,17 @@ namespace ICSharpCode.Decompiler.Tests.TypeSystem @@ -488,9 +488,17 @@ namespace ICSharpCode.Decompiler.Tests.TypeSystem
public void EnumFieldsTest()
{
var e = GetTypeDefinition(typeof(MyEnum));
IField[] fields = e.Fields.ToArray();
IField valueField = e.Fields.First();
IField[] fields = e.Fields.Skip(1).ToArray();
Assert.AreEqual(5, fields.Length);
Assert.AreEqual("value__", valueField.Name);
Assert.AreEqual(GetTypeDefinition(typeof(short)), valueField.Type);
Assert.AreEqual(Accessibility.Public, valueField.Accessibility);
Assert.AreEqual(null, valueField.GetConstantValue());
Assert.IsFalse(valueField.IsConst);
Assert.IsFalse(valueField.IsStatic);
foreach (IField f in fields) {
Assert.IsTrue(f.IsStatic);
Assert.IsTrue(f.IsConst);

4
ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

@ -951,6 +951,8 @@ namespace ICSharpCode.Decompiler.CSharp @@ -951,6 +951,8 @@ namespace ICSharpCode.Decompiler.CSharp
}
foreach (var field in typeDef.Fields) {
if (!field.MetadataToken.IsNil && !MemberIsHidden(module.PEFile, field.MetadataToken, settings)) {
if (typeDef.Kind == TypeKind.Enum && !field.IsConst)
continue;
var memberDecl = DoDecompile(field, decompileRun, decompilationContext.WithCurrentMember(field));
typeDecl.Members.Add(memberDecl);
}
@ -1262,7 +1264,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1262,7 +1264,7 @@ namespace ICSharpCode.Decompiler.CSharp
Debug.Assert(decompilationContext.CurrentMember == field);
try {
var typeSystemAstBuilder = CreateAstBuilder(decompilationContext);
if (decompilationContext.CurrentTypeDefinition.Kind == TypeKind.Enum) {
if (decompilationContext.CurrentTypeDefinition.Kind == TypeKind.Enum && field.IsConst) {
var enumDec = new EnumMemberDeclaration { Name = field.Name };
object constantValue = field.GetConstantValue();
if (constantValue != null) {

2
ICSharpCode.Decompiler/TypeSystem/Implementation/MetadataTypeDefinition.cs

@ -162,7 +162,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation @@ -162,7 +162,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
foreach (FieldDefinitionHandle h in fieldCollection) {
var field = metadata.GetFieldDefinition(h);
var attr = field.Attributes;
if (module.IsVisible(attr) && (attr & FieldAttributes.SpecialName) == 0) {
if (module.IsVisible(attr)) {
fieldList.Add(module.GetDefinition(h));
}
}

12
ILSpy/TreeNodes/TypeTreeNode.cs

@ -79,10 +79,16 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -79,10 +79,16 @@ namespace ICSharpCode.ILSpy.TreeNodes
foreach (var nestedType in TypeDefinition.NestedTypes.OrderBy(t => t.Name, NaturalStringComparer.Instance)) {
this.Children.Add(new TypeTreeNode(nestedType, ParentAssemblyNode));
}
foreach (var field in TypeDefinition.Fields.OrderBy(f => f.Name, NaturalStringComparer.Instance)) {
this.Children.Add(new FieldTreeNode(field));
if (TypeDefinition.Kind == TypeKind.Enum) {
// if the type is an enum, it's better to not sort by field name.
foreach (var field in TypeDefinition.Fields) {
this.Children.Add(new FieldTreeNode(field));
}
} else {
foreach (var field in TypeDefinition.Fields.OrderBy(f => f.Name, NaturalStringComparer.Instance)) {
this.Children.Add(new FieldTreeNode(field));
}
}
foreach (var property in TypeDefinition.Properties.OrderBy(p => p.Name, NaturalStringComparer.Instance)) {
this.Children.Add(new PropertyTreeNode(property));
}

Loading…
Cancel
Save