Skip to content

Commit

Permalink
Fix using static behavior for anonymous enums
Browse files Browse the repository at this point in the history
  • Loading branch information
reflectronic committed Jan 11, 2021
1 parent da66f97 commit f179e33
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -391,9 +391,10 @@ private void VisitCXXUuidofExpr(CXXUuidofExpr cxxUuidofExpr)

private void VisitDeclRefExpr(DeclRefExpr declRefExpr)
{
if ((declRefExpr.Decl is EnumConstantDecl enumConstantDecl) && (declRefExpr.DeclContext != enumConstantDecl.DeclContext) && (enumConstantDecl.DeclContext is NamedDecl namedDecl))
if ((declRefExpr.Decl is EnumConstantDecl { DeclContext: NamedDecl namedDecl } enumConstantDecl) &&
(declRefExpr.DeclContext != (namedDecl.Name is "" ? declRefExpr.TranslationUnit.TranslationUnitDecl : enumConstantDecl.DeclContext)))
{
var enumName = GetRemappedCursorName(namedDecl);
var enumName = string.IsNullOrEmpty(namedDecl.Name) ? _config.MethodClassName : GetRemappedCursorName(namedDecl);
_outputBuilder.AddUsingDirective($"static {_config.Namespace}.{enumName}");
}

Expand Down
94 changes: 94 additions & 0 deletions tests/ClangSharp.PInvokeGenerator.UnitTests/EnumDeclarationTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,100 @@ public enum MyEnum2
await ValidateGeneratedBindingsAsync(inputContents, expectedOutputContents, withAttributes: withAttributes);
}

[Fact]
public async Task AutoUsingStaticTest()
{
var inputContents = @"enum MyEnum1 : int
{
MyEnum1_Value1 = 1,
};
enum MyEnum2 : int
{
MyEnum2_Value1 = MyEnum1_Value1,
};
";

var expectedOutputContents = @"using static ClangSharp.Test.MyEnum1;
namespace ClangSharp.Test
{
public enum MyEnum1
{
MyEnum1_Value1 = 1,
}
public enum MyEnum2
{
MyEnum2_Value1 = MyEnum1_Value1,
}
}
";

await ValidateGeneratedBindingsAsync(inputContents, expectedOutputContents);
}

[Fact]
public async Task AutoUsingStaticForAnonymousEnumTest()
{
var inputContents = @"enum
{
MyEnum1_Value1 = 1,
};
enum MyEnum2 : int
{
MyEnum2_Value1 = MyEnum1_Value1,
};
";

var expectedOutputContents = @"using static ClangSharp.Test.Methods;
namespace ClangSharp.Test
{
public enum MyEnum2
{
MyEnum2_Value1 = MyEnum1_Value1,
}
public static partial class Methods
{
public const int MyEnum1_Value1 = 1;
}
}
";

await ValidateGeneratedBindingsAsync(inputContents, expectedOutputContents);
}

[Fact]
public async Task NoUsingStaticForAnonymousEnumInSameFileTest()
{
var inputContents = @"enum
{
MyEnum1_Value1 = 1,
};
const int MyEnum2_Value1 = MyEnum1_Value1 + 1;
";

var expectedOutputContents = @"namespace ClangSharp.Test
{
public static partial class Methods
{
public const int MyEnum1_Value1 = 1;
[NativeTypeName(""const int"")]
public const int MyEnum2_Value1 = (int)(MyEnum1_Value1) + 1;
}
}
";

await ValidateGeneratedBindingsAsync(inputContents, expectedOutputContents);
}



[Fact]
public async Task WithNamespaceTest()
{
Expand Down

0 comments on commit f179e33

Please sign in to comment.