diff --git a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs index bc9cb503..55b73055 100644 --- a/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs +++ b/sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs @@ -2514,6 +2514,20 @@ private string GetCursorName(NamedDecl namedDecl) { name = namedDecl.Name.NormalizePath(); + // strip the prefix + if (name.StartsWith("enum ")) + { + name = name[5..]; + } + else if (name.StartsWith("struct ")) + { + name = name[7..]; + } + else if (name.StartsWith("union ")) + { + name = name[6..]; + } + if (namedDecl is CXXConstructorDecl cxxConstructorDecl) { var parent = cxxConstructorDecl.Parent; @@ -2534,7 +2548,8 @@ private string GetCursorName(NamedDecl namedDecl) name.StartsWith("(anonymous union at ") || name.StartsWith("(unnamed enum at ") || name.StartsWith("(unnamed struct at ") || - name.StartsWith("(unnamed union at ")); + name.StartsWith("(unnamed union at ") || + name.StartsWith("(unnamed at ")); Debug.Assert(name.EndsWith(')')); } #endif diff --git a/tests/ClangSharp.PInvokeGenerator.UnitTests/CTest.cs b/tests/ClangSharp.PInvokeGenerator.UnitTests/CTest.cs index f5f2df17..c16f20ce 100644 --- a/tests/ClangSharp.PInvokeGenerator.UnitTests/CTest.cs +++ b/tests/ClangSharp.PInvokeGenerator.UnitTests/CTest.cs @@ -79,8 +79,25 @@ typedef struct _MyOtherStruct MyStruct _field1; MyStruct* _field2; } MyOtherStruct; + +typedef struct _MyStructWithAnonymousStruct +{ + struct { + int _field; + } _anonymousStructField1; +} MyStructWithAnonymousStruct; + +typedef struct _MyStructWithAnonymousUnion +{ + union { + int _field1; + int* _field2; + } union1; +} MyStructWithAnonymousUnion; "; - var expectedOutputContents = @"namespace ClangSharp.Test + var expectedOutputContents = @"using System.Runtime.InteropServices; + +namespace ClangSharp.Test { public partial struct _MyStruct { @@ -95,6 +112,33 @@ public unsafe partial struct _MyOtherStruct [NativeTypeName(""MyStruct *"")] public _MyStruct* _field2; } + + public partial struct _MyStructWithAnonymousStruct + { + [NativeTypeName(""__AnonymousRecord_ClangUnsavedFile_L14_C5"")] + public __anonymousStructField1_e__Struct _anonymousStructField1; + + public partial struct __anonymousStructField1_e__Struct + { + public int _field; + } + } + + public partial struct _MyStructWithAnonymousUnion + { + [NativeTypeName(""__AnonymousRecord_ClangUnsavedFile_L21_C5"")] + public _union1_e__Union union1; + + [StructLayout(LayoutKind.Explicit)] + public unsafe partial struct _union1_e__Union + { + [FieldOffset(0)] + public int _field1; + + [FieldOffset(0)] + public int* _field2; + } + } } "; return ValidateGeneratedCSharpLatestWindowsBindingsAsync(inputContents, expectedOutputContents, commandlineArgs: DefaultCClangCommandLineArgs, language: "c", languageStandard: DefaultCStandard);