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
(parameter.DefaultArgument.Declaration != null || (parameter.DefaultArgument.Declaration != null ||
parameter.DefaultArgument.Class == StatementClass.BinaryOperator)) parameter.DefaultArgument.Class == StatementClass.BinaryOperator))
return $"({desugared.Visit(typePrinter)}) {expression}"; 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; return expression;
} }

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

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

Loading…
Cancel
Save