Browse Source

Fixed the generated C# when an template value is returned.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/890/head
Dimitar Dobrev 8 years ago
parent
commit
9fdb9a3dc2
  1. 13
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  2. 11
      tests/CSharp/CSharp.Tests.cs
  3. 7
      tests/CSharp/CSharpTemplates.h

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

@ -292,8 +292,12 @@ namespace CppSharp.Generators.CSharp @@ -292,8 +292,12 @@ namespace CppSharp.Generators.CSharp
if (returnType.IsAddress())
Context.Return.Write(HandleReturnedPointer(@class, qualifiedClass.Type));
else
Context.Return.Write("{0}.{1}({2})", qualifiedClass, Helpers.CreateInstanceIdentifier, Context.ReturnVarName);
Context.Return.Write($"{qualifiedClass}.{Helpers.CreateInstanceIdentifier}({Context.ReturnVarName})");
var finalType = (returnType.GetFinalPointee() ?? returnType).Desugar();
Class returnedClass;
if (finalType.TryGetClass(out returnedClass) && returnedClass.IsDependent)
Context.Return.Write($" as {returnedClass.Visit(typePrinter)}");
return true;
}
@ -373,13 +377,6 @@ namespace CppSharp.Generators.CSharp @@ -373,13 +377,6 @@ namespace CppSharp.Generators.CSharp
Context.Before.WriteLine("else {0} = {1}.{2}({3});", ret, qualifiedClass,
Helpers.CreateInstanceIdentifier, Context.ReturnVarName);
}
Class returnedClass;
var pointee = Context.ReturnType.Type.Desugar().GetFinalPointee().Desugar();
if (pointee.TryGetClass(out returnedClass) && returnedClass.IsDependent)
{
var result = returnedClass.Visit(typePrinter);
return $"{ret} as {result}{result.NameSuffix}";
}
return ret;
}

11
tests/CSharp/CSharp.Tests.cs

@ -788,6 +788,17 @@ public unsafe class CSharpTests : GeneratorTestFixture @@ -788,6 +788,17 @@ public unsafe class CSharpTests : GeneratorTestFixture
}
}
[Test]
public void TestReturnTemplateValue()
{
using (var dependentValueFields = new DependentValueFields<int>())
{
dependentValueFields.DependentValue = 10;
Assert.That(dependentValueFields.ReturnValue().DependentValue,
Is.EqualTo(dependentValueFields.DependentValue));
}
}
[Test]
public void TestAbstractImplementatonsInPrimaryAndSecondaryBases()
{

7
tests/CSharp/CSharpTemplates.h

@ -114,6 +114,7 @@ public: @@ -114,6 +114,7 @@ public:
DependentValueFields();
~DependentValueFields();
DependentValueFields& returnInjectedClass();
DependentValueFields returnValue();
T getDependentValue();
void setDependentValue(const T& value);
private:
@ -151,6 +152,12 @@ DependentValueFields<T>& DependentValueFields<T>::returnInjectedClass() @@ -151,6 +152,12 @@ DependentValueFields<T>& DependentValueFields<T>::returnInjectedClass()
return *this;
}
template <typename T>
DependentValueFields<T> DependentValueFields<T>::returnValue()
{
return *this;
}
template <typename T>
class DLL_API DependentPointerFields
{

Loading…
Cancel
Save