diff --git a/ICSharpCode.Decompiler/Ast/AstBuilder.cs b/ICSharpCode.Decompiler/Ast/AstBuilder.cs
index e87322481..66508ddff 100644
--- a/ICSharpCode.Decompiler/Ast/AstBuilder.cs
+++ b/ICSharpCode.Decompiler/Ast/AstBuilder.cs
@@ -161,6 +161,7 @@ namespace Decompiler
if (typeDef.IsEnum) {
+ long expectedEnumMemberValue = 0;
foreach (FieldDefinition field in typeDef.Fields) {
if (field.IsRuntimeSpecialName) {
// the value__ field
@@ -168,6 +169,11 @@ namespace Decompiler
} else {
EnumMemberDeclaration enumMember = new EnumMemberDeclaration();
enumMember.Name = CleanName(field.Name);
+ long memberValue = (long)CSharpPrimitiveCast.Cast(TypeCode.Int64, field.Constant, false);
+ if (memberValue != expectedEnumMemberValue) {
+ enumMember.AddChild(new PrimitiveExpression(field.Constant), EnumMemberDeclaration.InitializerRole);
+ }
+ expectedEnumMemberValue = memberValue + 1;
astType.AddChild(enumMember, TypeDeclaration.MemberRole);
}
}
diff --git a/ICSharpCode.Decompiler/Tests/Types/EnumSamples.cs b/ICSharpCode.Decompiler/Tests/Types/EnumSamples.cs
index b1cc54128..4d08d8a98 100644
--- a/ICSharpCode.Decompiler/Tests/Types/EnumSamples.cs
+++ b/ICSharpCode.Decompiler/Tests/Types/EnumSamples.cs
@@ -37,3 +37,68 @@ public class TS_UnknownNumericValue
return (AttributeTargets)1000000;
}
}
+//$$ AllValue
+public class TS_AllValue
+{
+ public AttributeTargets Method()
+ {
+ return AttributeTargets.All;
+ }
+}
+//$$ ZeroValue
+public class TS_ZeroValue
+{
+ public AttributeTargets Method()
+ {
+ return (AttributeTargets)0;
+ }
+}
+//$$ PreservingTypeWhenBoxed
+public class TS_PreservingTypeWhenBoxed
+{
+ public object Method()
+ {
+ return AttributeTargets.Delegate;
+ }
+}
+//$$ PreservingTypeWhenBoxedTwoEnum
+public class TS_PreservingTypeWhenBoxedTwoEnum
+{
+ public object Method()
+ {
+ return AttributeTargets.Class | AttributeTargets.Delegate;
+ }
+}
+//$$ DeclarationSimpleEnum
+public enum TS_DeclarationSimpleEnum
+{
+ Item1,
+ Item2
+}
+//$$ DeclarationLongBasedEnum
+public enum TS_DeclarationLongBasedEnum : long
+{
+ Item1,
+ Item2
+}
+//$$ DeclarationLongWithInitializers
+public enum TS_DeclarationLongWithInitializers : long
+{
+ Item1,
+ Item2 = 20L,
+ Item3
+}
+//$$ DeclarationShortWithInitializers
+public enum TS_DeclarationShortWithInitializers : short
+{
+ Item1,
+ Item2 = 20,
+ Item3
+}
+//$$ DeclarationByteWithInitializers
+public enum TS_DeclarationByteWithInitializers : byte
+{
+ Item1,
+ Item2 = 20,
+ Item3
+}
diff --git a/NRefactory/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs b/NRefactory/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs
index 4e3111458..ec0ad4b92 100644
--- a/NRefactory/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs
+++ b/NRefactory/ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs
@@ -146,13 +146,14 @@ namespace ICSharpCode.NRefactory.CSharp
/// Writes a comma.
///
/// The next node after the comma.
- void Comma(AstNode nextNode)
+ /// When set prevents printing a space after comma.
+ void Comma(AstNode nextNode, bool noSpacesAfterComma = false)
{
WriteSpecialsUpToRole(AstNode.Roles.Comma, nextNode);
Space(policy.SpacesBeforeComma);
formatter.WriteToken(",");
lastWritten = LastWritten.Other;
- Space(policy.SpacesAfterComma);
+ Space(!noSpacesAfterComma && policy.SpacesAfterComma);
}
void WriteCommaSeparatedList(IEnumerable list)
@@ -1187,7 +1188,7 @@ namespace ICSharpCode.NRefactory.CSharp
if (first) {
first = false;
} else {
- Comma(member);
+ Comma(member, noSpacesAfterComma: true);
NewLine();
}
member.AcceptVisitor(this, data);