|
|
@ -984,6 +984,9 @@ namespace ICSharpCode.Decompiler.CSharp |
|
|
|
case EnumValueDisplayMode.None: |
|
|
|
case EnumValueDisplayMode.None: |
|
|
|
foreach (var enumMember in typeDecl.Members.OfType<EnumMemberDeclaration>()) { |
|
|
|
foreach (var enumMember in typeDecl.Members.OfType<EnumMemberDeclaration>()) { |
|
|
|
enumMember.Initializer = null; |
|
|
|
enumMember.Initializer = null; |
|
|
|
|
|
|
|
if (enumMember.GetSymbol() is IField f && f.ConstantValue == null) { |
|
|
|
|
|
|
|
typeDecl.InsertChildBefore(enumMember, new Comment(" error: enumerator has no value"), Roles.Comment); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case EnumValueDisplayMode.All: |
|
|
|
case EnumValueDisplayMode.All: |
|
|
@ -1010,7 +1013,7 @@ namespace ICSharpCode.Decompiler.CSharp |
|
|
|
bool first = true; |
|
|
|
bool first = true; |
|
|
|
long firstValue = 0, previousValue = 0; |
|
|
|
long firstValue = 0, previousValue = 0; |
|
|
|
foreach (var field in typeDef.Fields) { |
|
|
|
foreach (var field in typeDef.Fields) { |
|
|
|
if (MemberIsHidden(module, field.MetadataToken, settings)) continue; |
|
|
|
if (MemberIsHidden(module, field.MetadataToken, settings) || field.ConstantValue == null) continue; |
|
|
|
long currentValue = (long)CSharpPrimitiveCast.Cast(TypeCode.Int64, field.ConstantValue, false); |
|
|
|
long currentValue = (long)CSharpPrimitiveCast.Cast(TypeCode.Int64, field.ConstantValue, false); |
|
|
|
if (first) { |
|
|
|
if (first) { |
|
|
|
firstValue = currentValue; |
|
|
|
firstValue = currentValue; |
|
|
@ -1237,15 +1240,16 @@ 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 && field.ConstantValue != null) { |
|
|
|
if (decompilationContext.CurrentTypeDefinition.Kind == TypeKind.Enum) { |
|
|
|
var enumDec = new EnumMemberDeclaration { Name = field.Name }; |
|
|
|
var enumDec = new EnumMemberDeclaration { Name = field.Name }; |
|
|
|
long initValue = (long)CSharpPrimitiveCast.Cast(TypeCode.Int64, field.ConstantValue, false); |
|
|
|
if (field.ConstantValue != null) { |
|
|
|
enumDec.Initializer = typeSystemAstBuilder.ConvertConstantValue(decompilationContext.CurrentTypeDefinition.EnumUnderlyingType, field.ConstantValue); |
|
|
|
long initValue = (long)CSharpPrimitiveCast.Cast(TypeCode.Int64, field.ConstantValue, false); |
|
|
|
if (enumDec.Initializer is PrimitiveExpression primitive |
|
|
|
enumDec.Initializer = typeSystemAstBuilder.ConvertConstantValue(decompilationContext.CurrentTypeDefinition.EnumUnderlyingType, field.ConstantValue); |
|
|
|
&& initValue >= 0 && (decompilationContext.CurrentTypeDefinition.HasAttribute(KnownAttribute.Flags) |
|
|
|
if (enumDec.Initializer is PrimitiveExpression primitive |
|
|
|
|| (initValue > 9 && (unchecked(initValue & (initValue - 1)) == 0 || unchecked(initValue & (initValue + 1)) == 0)))) |
|
|
|
&& initValue >= 0 && (decompilationContext.CurrentTypeDefinition.HasAttribute(KnownAttribute.Flags) |
|
|
|
{ |
|
|
|
|| (initValue > 9 && (unchecked(initValue & (initValue - 1)) == 0 || unchecked(initValue & (initValue + 1)) == 0)))) { |
|
|
|
primitive.SetValue(initValue, $"0x{initValue:X}"); |
|
|
|
primitive.SetValue(initValue, $"0x{initValue:X}"); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
enumDec.Attributes.AddRange(field.GetAttributes().Select(a => new AttributeSection(typeSystemAstBuilder.ConvertAttribute(a)))); |
|
|
|
enumDec.Attributes.AddRange(field.GetAttributes().Select(a => new AttributeSection(typeSystemAstBuilder.ConvertAttribute(a)))); |
|
|
|
enumDec.AddAnnotation(new MemberResolveResult(null, field)); |
|
|
|
enumDec.AddAnnotation(new MemberResolveResult(null, field)); |
|
|
|