diff --git a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitStmt.cs b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitStmt.cs index ad33b94a..05168db6 100644 --- a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitStmt.cs +++ b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitStmt.cs @@ -454,7 +454,16 @@ private void VisitDoStmt(DoStmt doStmt) private void VisitExplicitCastExpr(ExplicitCastExpr explicitCastExpr) { + if (IsPrevContextDecl(out var _) && explicitCastExpr.Type is EnumType enumType) + { + _outputBuilder.Write('('); + var enumUnderlyingTypeName = GetRemappedTypeName(explicitCastExpr, context: null, enumType.Decl.IntegerType, out _); + _outputBuilder.Write(enumUnderlyingTypeName); + _outputBuilder.Write(')'); + } + var type = explicitCastExpr.Type; + var typeName = GetRemappedTypeName(explicitCastExpr, context: null, type, out var nativeTypeName); _outputBuilder.Write('('); diff --git a/tests/ClangSharp.PInvokeGenerator.UnitTests/EnumDeclarationTest.cs b/tests/ClangSharp.PInvokeGenerator.UnitTests/EnumDeclarationTest.cs index 9c314bd3..b8f5e43c 100644 --- a/tests/ClangSharp.PInvokeGenerator.UnitTests/EnumDeclarationTest.cs +++ b/tests/ClangSharp.PInvokeGenerator.UnitTests/EnumDeclarationTest.cs @@ -391,6 +391,67 @@ public enum MyEnum2 await ValidateGeneratedBindingsAsync(inputContents, expectedOutputContents, withUsings: withNamespaces); } + [Fact] + public async Task WithCastToEnumType() + { + var inputContents = @"enum MyEnum : int +{ + MyEnum_Value0 = (MyEnum) 10, + MyEnum_Value1 = (MyEnum) MyEnum_Value0, + MyEnum_Value2 = ((MyEnum) 10) + MyEnum_Value1, +}; +"; + + var expectedOutputContents = @"namespace ClangSharp.Test +{ + public enum MyEnum + { + MyEnum_Value0 = (int)(MyEnum)(10), + MyEnum_Value1 = (int)(MyEnum)(MyEnum_Value0), + MyEnum_Value2 = ((int)(MyEnum)(10)) + MyEnum_Value1, + } +} +"; + + await ValidateGeneratedBindingsAsync(inputContents, expectedOutputContents); + } + + + [Fact] + public async Task WithMultipleEnumsTest() + { + var inputContents = @"enum MyEnum1 : int +{ + MyEnum1_Value0 = 10, +}; + +enum MyEnum2 : int +{ + MyEnum2_Value0 = MyEnum1_Value0, + MyEnum2_Value1 = MyEnum1_Value0 + (MyEnum1) 10, +}; +"; + + var expectedOutputContents = @"using static ClangSharp.Test.MyEnum1; + +namespace ClangSharp.Test +{ + public enum MyEnum1 + { + MyEnum1_Value0 = 10, + } + + public enum MyEnum2 + { + MyEnum2_Value0 = MyEnum1_Value0, + MyEnum2_Value1 = MyEnum1_Value0 + (int)(MyEnum1)(10), + } +} +"; + + await ValidateGeneratedBindingsAsync(inputContents, expectedOutputContents); + } + [Fact] public async Task WithImplicitConversionTest() {