Browse Source

Ensure valid C# for default args assigned secondary bases

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1635/head
Dimitar Dobrev 4 years ago
parent
commit
385c5e9387
  1. 15
      src/Generator/Generators/CSharp/CSharpExpressionPrinter.cs
  2. 1
      tests/CSharp/CSharp.Tests.cs
  3. 8
      tests/CSharp/CSharp.cpp
  4. 2
      tests/CSharp/CSharp.h

15
src/Generator/Generators/CSharp/CSharpExpressionPrinter.cs

@ -31,19 +31,8 @@ namespace CppSharp.Generators.CSharp
return $"({desugared.Visit(typePrinter)}) {expression}"; return $"({desugared.Visit(typePrinter)}) {expression}";
var finalType = (desugared.GetFinalPointee() ?? desugared).Desugar(); var finalType = (desugared.GetFinalPointee() ?? desugared).Desugar();
if (finalType.TryGetClass(out var @class) && @class.IsInterface) if (finalType.TryGetClass(out var @class) && @class.IsInterface)
{ return $@"({@class.Visit(typePrinter)}) ({
string cast; @class.OriginalClass.Visit(typePrinter)}) {expression}";
if (parameter.DefaultArgument.Declaration is Method method &&
method.IsConstructor && method.Namespace == @class.OriginalClass)
{
cast = string.Empty;
}
else
{
cast = $"({@class.OriginalClass.Visit(typePrinter)}) ";
}
return cast + expression;
}
return expression; return expression;
} }

1
tests/CSharp/CSharp.Tests.cs

@ -342,6 +342,7 @@ public unsafe class CSharpTests
methodsWithDefaultValues.DefaultWithFreeConstantInNameSpace(); methodsWithDefaultValues.DefaultWithFreeConstantInNameSpace();
methodsWithDefaultValues.DefaultWithStdNumericLimits(10, 5); methodsWithDefaultValues.DefaultWithStdNumericLimits(10, 5);
methodsWithDefaultValues.DefaultWithSpecialization(); methodsWithDefaultValues.DefaultWithSpecialization();
methodsWithDefaultValues.DefaultOverloadedImplicitCtor();
methodsWithDefaultValues.DefaultWithParamNamedSameAsMethod(5); methodsWithDefaultValues.DefaultWithParamNamedSameAsMethod(5);
} }
} }

8
tests/CSharp/CSharp.cpp

@ -822,6 +822,14 @@ void MethodsWithDefaultValues::defaultWithSpecialization(IndependentFields<int>
{ {
} }
void MethodsWithDefaultValues::defaultOverloadedImplicitCtor(P p)
{
}
void MethodsWithDefaultValues::defaultOverloadedImplicitCtor(Qux q)
{
}
int MethodsWithDefaultValues::DefaultWithParamNamedSameAsMethod(int DefaultWithParamNamedSameAsMethod, const Foo& defaultArg) int MethodsWithDefaultValues::DefaultWithParamNamedSameAsMethod(int DefaultWithParamNamedSameAsMethod, const Foo& defaultArg)
{ {
return 1; return 1;

2
tests/CSharp/CSharp.h

@ -483,6 +483,8 @@ public:
void defaultWithStdNumericLimits(double d = 1.0, int i = std::numeric_limits<double>::infinity()); void defaultWithStdNumericLimits(double d = 1.0, int i = std::numeric_limits<double>::infinity());
void defaultWithParamRequiringRename(_ClassWithLeadingUnderscore* ptr = nullptr); void defaultWithParamRequiringRename(_ClassWithLeadingUnderscore* ptr = nullptr);
void defaultWithSpecialization(IndependentFields<int> specialization = IndependentFields<int>()); void defaultWithSpecialization(IndependentFields<int> specialization = IndependentFields<int>());
void defaultOverloadedImplicitCtor(P p);
void defaultOverloadedImplicitCtor(Qux q = Qux());
int DefaultWithParamNamedSameAsMethod(int DefaultWithParamNamedSameAsMethod, const Foo& defaultArg = Foo()); int DefaultWithParamNamedSameAsMethod(int DefaultWithParamNamedSameAsMethod, const Foo& defaultArg = Foo());
int getA(); int getA();
private: private:

Loading…
Cancel
Save