Browse Source

Remove sequential values from enum members + display powers of two (- 1) as hex.

pull/925/merge
Siegfried Pammer 9 years ago
parent
commit
16c900ebfa
  1. 2
      ICSharpCode.Decompiler.Tests/CustomAttributes/S_CustomAttributes.cs
  2. 6
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/CompoundAssignmentTest.cs
  3. 8
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs
  4. 6
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/Switch.cs
  5. 18
      ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

2
ICSharpCode.Decompiler.Tests/CustomAttributes/S_CustomAttributes.cs

@ -26,7 +26,7 @@ namespace CustomAttributes
[Flags] [Flags]
public enum EnumWithFlag public enum EnumWithFlag
{ {
All = 15, All = 0xF,
None = 0, None = 0,
Item1 = 1, Item1 = 1,
Item2 = 2, Item2 = 2,

6
ICSharpCode.Decompiler.Tests/TestCases/Pretty/CompoundAssignmentTest.cs

@ -34,9 +34,9 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
public enum ShortEnum : short public enum ShortEnum : short
{ {
None = 0, None,
One = 1, One,
Two = 2, Two,
Four = 4 Four = 4
} }

8
ICSharpCode.Decompiler.Tests/TestCases/Pretty/InitializerTests.cs

@ -48,14 +48,14 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
private enum MyEnum private enum MyEnum
{ {
a = 0, a,
b = 1 b
} }
private enum MyEnum2 private enum MyEnum2
{ {
c = 0, c,
d = 1 d
} }
private class Data private class Data

6
ICSharpCode.Decompiler.Tests/TestCases/Pretty/Switch.cs

@ -41,9 +41,9 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
public enum State public enum State
{ {
False = 0, False,
True = 1, True,
Null = 2 Null
} }
public static State SwitchOverNullableBool(bool? value) public static State SwitchOverNullableBool(bool? value)

18
ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

@ -820,10 +820,20 @@ namespace ICSharpCode.Decompiler.CSharp
Debug.Assert(decompilationContext.CurrentMember == field); Debug.Assert(decompilationContext.CurrentMember == field);
var typeSystemAstBuilder = CreateAstBuilder(decompilationContext); var typeSystemAstBuilder = CreateAstBuilder(decompilationContext);
if (decompilationContext.CurrentTypeDefinition.Kind == TypeKind.Enum) { if (decompilationContext.CurrentTypeDefinition.Kind == TypeKind.Enum) {
var enumDec = new EnumMemberDeclaration { var index = decompilationContext.CurrentTypeDefinition.Members.IndexOf(field);
Name = field.Name, long previousValue = -1;
Initializer = typeSystemAstBuilder.ConvertConstantValue(decompilationContext.CurrentTypeDefinition.EnumUnderlyingType, field.ConstantValue), if (index > 0) {
}; var previousMember = (IField)decompilationContext.CurrentTypeDefinition.Members[index - 1];
previousValue = (long)CSharpPrimitiveCast.Cast(TypeCode.Int64, previousMember.ConstantValue, false);
}
long initValue = (long)CSharpPrimitiveCast.Cast(TypeCode.Int64, field.ConstantValue, false);
var enumDec = new EnumMemberDeclaration { Name = field.Name };
if (previousValue + 1 != initValue || decompilationContext.CurrentTypeDefinition.Attributes.Any(a => a.AttributeType.FullName == "System.FlagsAttribute")) {
enumDec.Initializer = typeSystemAstBuilder.ConvertConstantValue(decompilationContext.CurrentTypeDefinition.EnumUnderlyingType, field.ConstantValue);
if (enumDec.Initializer is PrimitiveExpression primitive && initValue > 9 && ((initValue & (initValue - 1)) == 0 || (initValue & (initValue + 1)) == 0)) {
primitive.SetValue(initValue, $"0x{initValue:X}");
}
}
enumDec.Attributes.AddRange(field.Attributes.Select(a => new AttributeSection(typeSystemAstBuilder.ConvertAttribute(a)))); enumDec.Attributes.AddRange(field.Attributes.Select(a => new AttributeSection(typeSystemAstBuilder.ConvertAttribute(a))));
enumDec.AddAnnotation(new Semantics.MemberResolveResult(null, field)); enumDec.AddAnnotation(new Semantics.MemberResolveResult(null, field));
return enumDec; return enumDec;

Loading…
Cancel
Save