@@ -1339,10 +1339,6 @@ EntityDeclaration DoDecompile(ITypeDefinition typeDef, DecompileRun decompileRun
13391339 }
13401340 }
13411341
1342- decompileRun . EnumValueDisplayMode = typeDef . Kind == TypeKind . Enum
1343- ? DetectBestEnumValueDisplayMode ( typeDef , module . PEFile )
1344- : null ;
1345-
13461342 // With C# 9 records, the relative order of fields and properties matters:
13471343 IEnumerable < IMember > fieldsAndProperties = recordDecompiler ? . FieldsAndProperties
13481344 ?? typeDef . Fields . Concat < IMember > ( typeDef . Properties ) ;
@@ -1406,7 +1402,9 @@ EntityDeclaration DoDecompile(ITypeDefinition typeDef, DecompileRun decompileRun
14061402 }
14071403 if ( typeDecl . ClassType == ClassType . Enum )
14081404 {
1409- switch ( decompileRun . EnumValueDisplayMode )
1405+ Debug . Assert ( typeDef . Kind == TypeKind . Enum ) ;
1406+ EnumValueDisplayMode displayMode = DetectBestEnumValueDisplayMode ( typeDef , module . PEFile ) ;
1407+ switch ( displayMode )
14101408 {
14111409 case EnumValueDisplayMode . FirstOnly :
14121410 foreach ( var enumMember in typeDecl . Members . OfType < EnumMemberDeclaration > ( ) . Skip ( 1 ) )
@@ -1425,13 +1423,33 @@ EntityDeclaration DoDecompile(ITypeDefinition typeDef, DecompileRun decompileRun
14251423 }
14261424 break ;
14271425 case EnumValueDisplayMode . All :
1428- case EnumValueDisplayMode . AllHex :
14291426 // nothing needs to be changed.
14301427 break ;
1428+ case EnumValueDisplayMode . AllHex :
1429+ foreach ( var enumMember in typeDecl . Members . OfType < EnumMemberDeclaration > ( ) )
1430+ {
1431+ var constantValue = ( enumMember . GetSymbol ( ) as IField ) . GetConstantValue ( ) ;
1432+ if ( constantValue == null || enumMember . Initializer is not PrimitiveExpression pe )
1433+ {
1434+ continue ;
1435+ }
1436+ long initValue = ( long ) CSharpPrimitiveCast . Cast ( TypeCode . Int64 , constantValue , false ) ;
1437+ if ( initValue >= 10 )
1438+ {
1439+ pe . Format = LiteralFormat . HexadecimalNumber ;
1440+ }
1441+ }
1442+ break ;
14311443 default :
14321444 throw new ArgumentOutOfRangeException ( ) ;
14331445 }
1434- decompileRun . EnumValueDisplayMode = null ;
1446+ foreach ( var item in typeDecl . Members )
1447+ {
1448+ if ( item is not EnumMemberDeclaration )
1449+ {
1450+ typeDecl . InsertChildBefore ( item , new Comment ( " error: nested types are not permitted in C#." ) , Roles . Comment ) ;
1451+ }
1452+ }
14351453 }
14361454 return typeDecl ;
14371455 }
@@ -1927,13 +1945,7 @@ EntityDeclaration DoDecompile(IField field, DecompileRun decompileRun, ITypeReso
19271945 object constantValue = field . GetConstantValue ( ) ;
19281946 if ( constantValue != null )
19291947 {
1930- long initValue = ( long ) CSharpPrimitiveCast . Cast ( TypeCode . Int64 , constantValue , false ) ;
19311948 enumDec . Initializer = typeSystemAstBuilder . ConvertConstantValue ( decompilationContext . CurrentTypeDefinition . EnumUnderlyingType , constantValue ) ;
1932- if ( enumDec . Initializer is PrimitiveExpression primitive
1933- && initValue >= 10 && decompileRun . EnumValueDisplayMode == EnumValueDisplayMode . AllHex )
1934- {
1935- primitive . Format = LiteralFormat . HexadecimalNumber ;
1936- }
19371949 }
19381950 enumDec . Attributes . AddRange ( field . GetAttributes ( ) . Select ( a => new AttributeSection ( typeSystemAstBuilder . ConvertAttribute ( a ) ) ) ) ;
19391951 enumDec . AddAnnotation ( new MemberResolveResult ( null , field ) ) ;
0 commit comments