Browse Source

Generate valid C# for static object-typed fields

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1641/head
Dimitar Dobrev 4 years ago
parent
commit
c8c415b977
  1. 1
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  2. 7
      src/Generator/Generators/CSharp/CSharpSources.cs
  3. 2
      tests/Common/Common.Tests.cs
  4. 2
      tests/Common/Common.cpp
  5. 2
      tests/Common/Common.h

1
src/Generator/Generators/CSharp/CSharpMarshal.cs

@ -286,6 +286,7 @@ namespace CppSharp.Generators.CSharp @@ -286,6 +286,7 @@ namespace CppSharp.Generators.CSharp
{
if (Context.MarshalKind == MarshalKind.NativeField ||
Context.MarshalKind == MarshalKind.Variable ||
Context.MarshalKind == MarshalKind.ReturnVariableArray ||
!originalClass.HasNonTrivialDestructor)
{
Context.Return.Write($"{qualifiedClass}.{Helpers.CreateInstanceIdentifier}({Context.ReturnVarName})");

7
src/Generator/Generators/CSharp/CSharpSources.cs

@ -1294,9 +1294,12 @@ namespace CppSharp.Generators.CSharp @@ -1294,9 +1294,12 @@ namespace CppSharp.Generators.CSharp
ctx.PushMarshalKind(MarshalKind.ReturnVariableArray);
var arrayType = var.Type.Desugar() as ArrayType;
var isRefTypeArray = arrayType != null && var.Namespace is Class @class && @class.IsRefType;
var isRefTypeArray = arrayType != null && var.Namespace is Class context && context.IsRefType;
var elementType = arrayType?.Type.Desugar();
if (!isRefTypeArray && elementType == null)
Type type = (var.QualifiedType.Type.GetFinalPointee() ?? var.QualifiedType.Type).Desugar();
if (type.TryGetClass(out Class @class) && @class.IsRefType)
ctx.ReturnVarName = $"new {TypePrinter.IntPtrType}({ptr})";
else if (!isRefTypeArray && elementType == null)
ctx.ReturnVarName = $"*{ptr}";
else if (elementType == null || elementType.IsPrimitiveType() ||
arrayType.SizeType == ArrayType.ArraySize.Constant)

2
tests/Common/Common.Tests.cs

@ -914,6 +914,8 @@ public class CommonTests @@ -914,6 +914,8 @@ public class CommonTests
Assert.That(Foo.ReadWrite, Is.EqualTo(15));
Foo.ReadWrite = 25;
Assert.That(Foo.ReadWrite, Is.EqualTo(25));
Foo.StaticField.A = 20;
Assert.That(Foo.StaticField.A, Is.EqualTo(20));
}
[Test]

2
tests/Common/Common.cpp

@ -60,6 +60,8 @@ char16_t Foo::returnChar16() @@ -60,6 +60,8 @@ char16_t Foo::returnChar16()
return 'a';
}
Foo Foo::staticField;
Foo2::Foo2() {}
Foo2::Foo2(const Foo2& other) : Foo(other), C(other.C), valueTypeField(other.valueTypeField) {}

2
tests/Common/Common.h

@ -105,6 +105,8 @@ public: @@ -105,6 +105,8 @@ public:
int fooPtr();
char16_t returnChar16();
static Foo staticField;
};
struct DLL_API Bar

Loading…
Cancel
Save