@@ -1339,10 +1339,6 @@ EntityDeclaration DoDecompile(ITypeDefinition typeDef, DecompileRun decompileRun
1339
1339
}
1340
1340
}
1341
1341
1342
- decompileRun . EnumValueDisplayMode = typeDef . Kind == TypeKind . Enum
1343
- ? DetectBestEnumValueDisplayMode ( typeDef , module . PEFile )
1344
- : null ;
1345
-
1346
1342
// With C# 9 records, the relative order of fields and properties matters:
1347
1343
IEnumerable < IMember > fieldsAndProperties = recordDecompiler ? . FieldsAndProperties
1348
1344
?? typeDef . Fields . Concat < IMember > ( typeDef . Properties ) ;
@@ -1406,7 +1402,9 @@ EntityDeclaration DoDecompile(ITypeDefinition typeDef, DecompileRun decompileRun
1406
1402
}
1407
1403
if ( typeDecl . ClassType == ClassType . Enum )
1408
1404
{
1409
- switch ( decompileRun . EnumValueDisplayMode )
1405
+ Debug . Assert ( typeDef . Kind == TypeKind . Enum ) ;
1406
+ EnumValueDisplayMode displayMode = DetectBestEnumValueDisplayMode ( typeDef , module . PEFile ) ;
1407
+ switch ( displayMode )
1410
1408
{
1411
1409
case EnumValueDisplayMode . FirstOnly :
1412
1410
foreach ( var enumMember in typeDecl . Members . OfType < EnumMemberDeclaration > ( ) . Skip ( 1 ) )
@@ -1425,13 +1423,33 @@ EntityDeclaration DoDecompile(ITypeDefinition typeDef, DecompileRun decompileRun
1425
1423
}
1426
1424
break ;
1427
1425
case EnumValueDisplayMode . All :
1428
- case EnumValueDisplayMode . AllHex :
1429
1426
// nothing needs to be changed.
1430
1427
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 ;
1431
1443
default :
1432
1444
throw new ArgumentOutOfRangeException ( ) ;
1433
1445
}
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
+ }
1435
1453
}
1436
1454
return typeDecl ;
1437
1455
}
@@ -1927,13 +1945,7 @@ EntityDeclaration DoDecompile(IField field, DecompileRun decompileRun, ITypeReso
1927
1945
object constantValue = field . GetConstantValue ( ) ;
1928
1946
if ( constantValue != null )
1929
1947
{
1930
- long initValue = ( long ) CSharpPrimitiveCast . Cast ( TypeCode . Int64 , constantValue , false ) ;
1931
1948
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
- }
1937
1949
}
1938
1950
enumDec . Attributes . AddRange ( field . GetAttributes ( ) . Select ( a => new AttributeSection ( typeSystemAstBuilder . ConvertAttribute ( a ) ) ) ) ;
1939
1951
enumDec . AddAnnotation ( new MemberResolveResult ( null , field ) ) ;
0 commit comments