Browse Source

Fixed the generated C# when a default arg is assigned a specialisation also used as a secondary base.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1033/head
Dimitar Dobrev 8 years ago
parent
commit
08bebbb5eb
  1. 5
      src/Generator/Generators/CSharp/CSharpExpressionPrinter.cs
  2. 18
      src/Generator/Generators/CSharp/CSharpSources.cs

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

@ -29,6 +29,11 @@ namespace CppSharp.Generators.CSharp @@ -29,6 +29,11 @@ namespace CppSharp.Generators.CSharp
(parameter.DefaultArgument.Declaration != null ||
parameter.DefaultArgument.Class == StatementClass.BinaryOperator))
return $"({desugared.Visit(typePrinter)}) {expression}";
var finalType = (desugared.GetFinalPointee() ?? desugared).Desugar();
Class @class;
if (finalType.TryGetClass(out @class) && @class.IsInterface)
return $@"({@class.Visit(typePrinter)}) ({
@class.OriginalClass.Visit(typePrinter)}) {expression}";
return expression;
}

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

@ -2338,9 +2338,7 @@ namespace CppSharp.Generators.CSharp @@ -2338,9 +2338,7 @@ namespace CppSharp.Generators.CSharp
if (method.SynthKind == FunctionSynthKind.DefaultValueOverload)
{
if (!method.IsConstructor)
{
GenerateOverloadCall(method);
}
goto SkipImpl;
}
@ -2436,11 +2434,9 @@ namespace CppSharp.Generators.CSharp @@ -2436,11 +2434,9 @@ namespace CppSharp.Generators.CSharp
private string OverloadParamNameWithDefValue(Parameter p, ref int index)
{
Class @class;
return p.Type.IsPointerToPrimitiveType() && p.Usage == ParameterUsage.InOut && p.HasDefaultValue
? "ref param" + index++
: (( p.Type.TryGetClass(out @class) && @class.IsInterface) ? "param" + index++
: ExpressionPrinter.VisitParameter(p));
: ExpressionPrinter.VisitParameter(p);
}
private void GenerateOverloadCall(Function function)
@ -2454,16 +2450,8 @@ namespace CppSharp.Generators.CSharp @@ -2454,16 +2450,8 @@ namespace CppSharp.Generators.CSharp
parameter.Usage == ParameterUsage.InOut && parameter.HasDefaultValue)
{
var pointeeType = ((PointerType) parameter.Type).Pointee.ToString();
WriteLine("{0} param{1} = {2};", pointeeType, j++,
primitiveType == PrimitiveType.Bool ? "false" : "0");
}
Class @class;
if (parameter.Kind == ParameterKind.Regular && parameter.Ignore &&
parameter.Type.Desugar().TryGetClass(out @class) && @class.IsInterface &&
parameter.HasDefaultValue)
{
WriteLine("var param{0} = ({1}) {2};", j++, @class.OriginalClass.OriginalName,
ExpressionPrinter.VisitParameter(parameter));
WriteLine($@"{pointeeType} param{j++} = {
(primitiveType == PrimitiveType.Bool ? "false" : "0")};");
}
}

Loading…
Cancel
Save