Browse Source

Fixed the generated C# when an abstract function has no default args but its overrides do.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/696/head
Dimitar Dobrev 9 years ago
parent
commit
a04c752b33
  1. 11
      src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs
  2. 9
      tests/CSharp/CSharp.Tests.cs
  3. 12
      tests/CSharp/CSharp.cpp
  4. 11
      tests/CSharp/CSharp.h

11
src/Generator/Passes/FixDefaultParamValuesOfOverridesPass.cs

@ -11,10 +11,15 @@ namespace CppSharp.Passes
Method rootBaseMethod = ((Class) method.Namespace).GetBaseMethod(method); Method rootBaseMethod = ((Class) method.Namespace).GetBaseMethod(method);
for (int i = 0; i < method.Parameters.Count; i++) for (int i = 0; i < method.Parameters.Count; i++)
{ {
if (rootBaseMethod.Parameters[i].DefaultArgument != null) var rootBaseParameter = rootBaseMethod.Parameters[i];
var parameter = method.Parameters[i];
if (rootBaseParameter.DefaultArgument == null)
{ {
method.Parameters[i].DefaultArgument = parameter.DefaultArgument = null;
rootBaseMethod.Parameters[i].DefaultArgument.Clone(); }
else
{
parameter.DefaultArgument = rootBaseParameter.DefaultArgument.Clone();
} }
} }
} }

9
tests/CSharp/CSharp.Tests.cs

@ -44,6 +44,11 @@ public unsafe class CSharpTests : GeneratorTestFixture
var isNoParams = foo.IsNoParams; var isNoParams = foo.IsNoParams;
foo.SetNoParams(); foo.SetNoParams();
foo.Width = 5; foo.Width = 5;
using (var hasSecondaryBaseWithAbstractWithDefaultArg = new HasSecondaryBaseWithAbstractWithDefaultArg())
{
hasSecondaryBaseWithAbstractWithDefaultArg.Abstract();
hasSecondaryBaseWithAbstractWithDefaultArg.AbstractWithNoDefaultArg(foo);
}
} }
using (var hasOverride = new HasOverrideOfHasPropertyWithDerivedType()) using (var hasOverride = new HasOverrideOfHasPropertyWithDerivedType())
hasOverride.CauseRenamingError(); hasOverride.CauseRenamingError();
@ -58,10 +63,6 @@ public unsafe class CSharpTests : GeneratorTestFixture
{ {
int i = typeMappedWithOperator | 5; int i = typeMappedWithOperator | 5;
} }
using (var hasSecondaryBaseWithAbstractWithDefaultArg = new HasSecondaryBaseWithAbstractWithDefaultArg())
{
hasSecondaryBaseWithAbstractWithDefaultArg.Abstract();
}
} }
[Test] [Test]

12
tests/CSharp/CSharp.cpp

@ -1142,6 +1142,14 @@ TestString::~TestString()
{ {
} }
PrimaryBaseWithAbstractWithDefaultArg::PrimaryBaseWithAbstractWithDefaultArg()
{
}
PrimaryBaseWithAbstractWithDefaultArg::~PrimaryBaseWithAbstractWithDefaultArg()
{
}
SecondaryBaseWithAbstractWithDefaultArg::SecondaryBaseWithAbstractWithDefaultArg() SecondaryBaseWithAbstractWithDefaultArg::SecondaryBaseWithAbstractWithDefaultArg()
{ {
} }
@ -1161,3 +1169,7 @@ HasSecondaryBaseWithAbstractWithDefaultArg::~HasSecondaryBaseWithAbstractWithDef
void HasSecondaryBaseWithAbstractWithDefaultArg::abstract(const Foo& foo) void HasSecondaryBaseWithAbstractWithDefaultArg::abstract(const Foo& foo)
{ {
} }
void HasSecondaryBaseWithAbstractWithDefaultArg::abstractWithNoDefaultArg(const Foo& foo)
{
}

11
tests/CSharp/CSharp.h

@ -1031,6 +1031,14 @@ void decltypeFunctionPointer();
using funcPtr = decltype(&decltypeFunctionPointer); using funcPtr = decltype(&decltypeFunctionPointer);
void usesDecltypeFunctionPointer(funcPtr func); void usesDecltypeFunctionPointer(funcPtr func);
class DLL_API PrimaryBaseWithAbstractWithDefaultArg
{
public:
PrimaryBaseWithAbstractWithDefaultArg();
~PrimaryBaseWithAbstractWithDefaultArg();
virtual void abstractWithNoDefaultArg(const Foo& foo) = 0;
};
class DLL_API SecondaryBaseWithAbstractWithDefaultArg class DLL_API SecondaryBaseWithAbstractWithDefaultArg
{ {
public: public:
@ -1039,10 +1047,11 @@ public:
virtual void abstract(const Foo& foo = Foo()) = 0; virtual void abstract(const Foo& foo = Foo()) = 0;
}; };
class DLL_API HasSecondaryBaseWithAbstractWithDefaultArg : public Foo, public SecondaryBaseWithAbstractWithDefaultArg class DLL_API HasSecondaryBaseWithAbstractWithDefaultArg : public PrimaryBaseWithAbstractWithDefaultArg, public SecondaryBaseWithAbstractWithDefaultArg
{ {
public: public:
HasSecondaryBaseWithAbstractWithDefaultArg(); HasSecondaryBaseWithAbstractWithDefaultArg();
~HasSecondaryBaseWithAbstractWithDefaultArg(); ~HasSecondaryBaseWithAbstractWithDefaultArg();
virtual void abstract(const Foo& foo = Foo()); virtual void abstract(const Foo& foo = Foo());
virtual void abstractWithNoDefaultArg(const Foo& foo = Foo());
}; };

Loading…
Cancel
Save