Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ensure that C incomplete arrays are correctly handled by the generator #372

Merged
merged 2 commits into from
Aug 12, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2758,7 +2758,7 @@ private string GetTypeName(Cursor cursor, Cursor context, Type rootType, Type ty
{
result.typeName = GetTypeName(cursor, context, rootType, arrayType.ElementType, ignoreTransparentStructsWhereRequired, out _);

if (cursor is FunctionDecl or ParmVarDecl)
if ((cursor is FunctionDecl or ParmVarDecl) || (arrayType is IncompleteArrayType))
{
result.typeName = GetRemappedName(result.typeName, cursor, tryRemapOperatorName: false, out _, skipUsing: true);
result.typeName += '*';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ namespace ClangSharp.UnitTests
{
public abstract class StructDeclarationTest : PInvokeGeneratorTest
{
[TestCase("double", "double*")]
[TestCase("short", "short*")]
[TestCase("int", "int*")]
[TestCase("float", "float*")]
public Task ArrayUnknownSizeTest(string nativeType, string expectedManagedType) => ArrayUnknownSizeTestImpl(nativeType, expectedManagedType);

[TestCase("double", "double")]
[TestCase("short", "short")]
[TestCase("int", "int")]
Expand Down Expand Up @@ -200,6 +206,8 @@ public abstract class StructDeclarationTest : PInvokeGeneratorTest
[Test]
public Task SourceLocationAttributeTest() => SourceLocationAttributeTestImpl();

protected abstract Task ArrayUnknownSizeTestImpl(string nativeType, string expectedManagedType);

protected abstract Task BasicTestImpl(string nativeType, string expectedManagedType);

protected abstract Task BasicTestInCModeImpl(string nativeType, string expectedManagedType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,27 @@ namespace ClangSharp.UnitTests
{
public sealed class CSharpCompatibleUnix_StructDeclarationTest : StructDeclarationTest
{
protected override Task ArrayUnknownSizeTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
{{
{nativeType} x[];
}};
";

var expectedOutputContents = $@"namespace ClangSharp.Test
{{
public unsafe partial struct MyStruct
{{
[NativeTypeName(""{nativeType}[]"")]
public {expectedManagedType} x;
}}
}}
";

return ValidateGeneratedCSharpCompatibleUnixBindingsAsync(inputContents, expectedOutputContents);
}

protected override Task BasicTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,27 @@ namespace ClangSharp.UnitTests
{
public sealed class CSharpCompatibleWindows_StructDeclarationTest : StructDeclarationTest
{
protected override Task ArrayUnknownSizeTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
{{
{nativeType} x[];
}};
";

var expectedOutputContents = $@"namespace ClangSharp.Test
{{
public unsafe partial struct MyStruct
{{
[NativeTypeName(""{nativeType}[]"")]
public {expectedManagedType} x;
}}
}}
";

return ValidateGeneratedCSharpCompatibleWindowsBindingsAsync(inputContents, expectedOutputContents);
}

protected override Task BasicTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,27 @@ namespace ClangSharp.UnitTests
{
public sealed class CSharpLatestUnix_StructDeclarationTest : StructDeclarationTest
{
protected override Task ArrayUnknownSizeTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
{{
{nativeType} x[];
}};
";

var expectedOutputContents = $@"namespace ClangSharp.Test
{{
public unsafe partial struct MyStruct
{{
[NativeTypeName(""{nativeType}[]"")]
public {expectedManagedType} x;
}}
}}
";

return ValidateGeneratedCSharpLatestUnixBindingsAsync(inputContents, expectedOutputContents);
}

protected override Task BasicTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,27 @@ namespace ClangSharp.UnitTests
{
public sealed class CSharpLatestWindows_StructDeclarationTest : StructDeclarationTest
{
protected override Task ArrayUnknownSizeTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
{{
{nativeType} x[];
}};
";

var expectedOutputContents = $@"namespace ClangSharp.Test
{{
public unsafe partial struct MyStruct
{{
[NativeTypeName(""{nativeType}[]"")]
public {expectedManagedType} x;
}}
}}
";

return ValidateGeneratedCSharpLatestWindowsBindingsAsync(inputContents, expectedOutputContents);
}

protected override Task BasicTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,29 @@ namespace ClangSharp.UnitTests
{
public sealed class XmlCompatibleUnix_StructDeclarationTest : StructDeclarationTest
{
protected override Task ArrayUnknownSizeTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
{{
{nativeType} x[];
}};
";

var expectedOutputContents = $@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?>
<bindings>
<namespace name=""ClangSharp.Test"">
<struct name=""MyStruct"" access=""public"" unsafe=""true"">
<field name=""x"" access=""public"">
<type native=""{nativeType}[]"">{expectedManagedType}</type>
</field>
</struct>
</namespace>
</bindings>
";

return ValidateGeneratedXmlCompatibleUnixBindingsAsync(inputContents, expectedOutputContents);
}

protected override Task BasicTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,29 @@ namespace ClangSharp.UnitTests
{
public sealed class XmlCompatibleWindows_StructDeclarationTest : StructDeclarationTest
{
protected override Task ArrayUnknownSizeTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
{{
{nativeType} x[];
}};
";

var expectedOutputContents = $@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?>
<bindings>
<namespace name=""ClangSharp.Test"">
<struct name=""MyStruct"" access=""public"" unsafe=""true"">
<field name=""x"" access=""public"">
<type native=""{nativeType}[]"">{expectedManagedType}</type>
</field>
</struct>
</namespace>
</bindings>
";

return ValidateGeneratedXmlCompatibleWindowsBindingsAsync(inputContents, expectedOutputContents);
}

protected override Task BasicTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,29 @@ namespace ClangSharp.UnitTests
{
public sealed class XmlLatestUnix_StructDeclarationTest : StructDeclarationTest
{
protected override Task ArrayUnknownSizeTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
{{
{nativeType} x[];
}};
";

var expectedOutputContents = $@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?>
<bindings>
<namespace name=""ClangSharp.Test"">
<struct name=""MyStruct"" access=""public"" unsafe=""true"">
<field name=""x"" access=""public"">
<type native=""{nativeType}[]"">{expectedManagedType}</type>
</field>
</struct>
</namespace>
</bindings>
";

return ValidateGeneratedXmlLatestUnixBindingsAsync(inputContents, expectedOutputContents);
}

protected override Task BasicTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,29 @@ namespace ClangSharp.UnitTests
{
public sealed class XmlLatestWindows_StructDeclarationTest : StructDeclarationTest
{
protected override Task ArrayUnknownSizeTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
{{
{nativeType} x[];
}};
";

var expectedOutputContents = $@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?>
<bindings>
<namespace name=""ClangSharp.Test"">
<struct name=""MyStruct"" access=""public"" unsafe=""true"">
<field name=""x"" access=""public"">
<type native=""{nativeType}[]"">{expectedManagedType}</type>
</field>
</struct>
</namespace>
</bindings>
";

return ValidateGeneratedXmlLatestWindowsBindingsAsync(inputContents, expectedOutputContents);
}

protected override Task BasicTestImpl(string nativeType, string expectedManagedType)
{
var inputContents = $@"struct MyStruct
Expand Down