Skip to content

Commit 86ba626

Browse files
Merge pull request #467 from Summpot/main
Fixed anonymous type generation in C mode.
2 parents 641a0d2 + 5f9d7a9 commit 86ba626

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2514,6 +2514,20 @@ private string GetCursorName(NamedDecl namedDecl)
25142514
{
25152515
name = namedDecl.Name.NormalizePath();
25162516

2517+
// strip the prefix
2518+
if (name.StartsWith("enum "))
2519+
{
2520+
name = name[5..];
2521+
}
2522+
else if (name.StartsWith("struct "))
2523+
{
2524+
name = name[7..];
2525+
}
2526+
else if (name.StartsWith("union "))
2527+
{
2528+
name = name[6..];
2529+
}
2530+
25172531
if (namedDecl is CXXConstructorDecl cxxConstructorDecl)
25182532
{
25192533
var parent = cxxConstructorDecl.Parent;
@@ -2534,7 +2548,8 @@ private string GetCursorName(NamedDecl namedDecl)
25342548
name.StartsWith("(anonymous union at ") ||
25352549
name.StartsWith("(unnamed enum at ") ||
25362550
name.StartsWith("(unnamed struct at ") ||
2537-
name.StartsWith("(unnamed union at "));
2551+
name.StartsWith("(unnamed union at ") ||
2552+
name.StartsWith("(unnamed at "));
25382553
Debug.Assert(name.EndsWith(')'));
25392554
}
25402555
#endif

tests/ClangSharp.PInvokeGenerator.UnitTests/CTest.cs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,25 @@ typedef struct _MyOtherStruct
7979
MyStruct _field1;
8080
MyStruct* _field2;
8181
} MyOtherStruct;
82+
83+
typedef struct _MyStructWithAnonymousStruct
84+
{
85+
struct {
86+
int _field;
87+
} _anonymousStructField1;
88+
} MyStructWithAnonymousStruct;
89+
90+
typedef struct _MyStructWithAnonymousUnion
91+
{
92+
union {
93+
int _field1;
94+
int* _field2;
95+
} union1;
96+
} MyStructWithAnonymousUnion;
8297
";
83-
var expectedOutputContents = @"namespace ClangSharp.Test
98+
var expectedOutputContents = @"using System.Runtime.InteropServices;
99+
100+
namespace ClangSharp.Test
84101
{
85102
public partial struct _MyStruct
86103
{
@@ -95,6 +112,33 @@ public unsafe partial struct _MyOtherStruct
95112
[NativeTypeName(""MyStruct *"")]
96113
public _MyStruct* _field2;
97114
}
115+
116+
public partial struct _MyStructWithAnonymousStruct
117+
{
118+
[NativeTypeName(""__AnonymousRecord_ClangUnsavedFile_L14_C5"")]
119+
public __anonymousStructField1_e__Struct _anonymousStructField1;
120+
121+
public partial struct __anonymousStructField1_e__Struct
122+
{
123+
public int _field;
124+
}
125+
}
126+
127+
public partial struct _MyStructWithAnonymousUnion
128+
{
129+
[NativeTypeName(""__AnonymousRecord_ClangUnsavedFile_L21_C5"")]
130+
public _union1_e__Union union1;
131+
132+
[StructLayout(LayoutKind.Explicit)]
133+
public unsafe partial struct _union1_e__Union
134+
{
135+
[FieldOffset(0)]
136+
public int _field1;
137+
138+
[FieldOffset(0)]
139+
public int* _field2;
140+
}
141+
}
98142
}
99143
";
100144
return ValidateGeneratedCSharpLatestWindowsBindingsAsync(inputContents, expectedOutputContents, commandlineArgs: DefaultCClangCommandLineArgs, language: "c", languageStandard: DefaultCStandard);

0 commit comments

Comments
 (0)