Browse Source

Rework constructor generation in C++ code generator.

pull/1543/head
Joao Matos 5 years ago committed by João Matos
parent
commit
eba1b83324
  1. 2
      src/Generator/Generators/C/CCodeGenerator.cs
  2. 2
      src/Generator/Generators/C/CppHeaders.cs
  3. 56
      src/Generator/Generators/C/CppSources.cs

2
src/Generator/Generators/C/CCodeGenerator.cs

@ -37,6 +37,8 @@ namespace CppSharp.Generators.C
public override string FileExtension { get; } = "h"; public override string FileExtension { get; } = "h";
public virtual string ClassCtorInstanceParamIdentifier => "instance";
public override void Process() public override void Process()
{ {

2
src/Generator/Generators/C/CppHeaders.cs

@ -409,7 +409,7 @@ namespace CppSharp.Generators.Cpp
var classNativeName = @class.Visit(CTypePrinter); var classNativeName = @class.Visit(CTypePrinter);
CTypePrinter.PopContext(); CTypePrinter.PopContext();
WriteLine($"{@class.Name}({classNativeName}* instance);"); WriteLine($"{@class.Name}({classNativeName}* {ClassCtorInstanceParamIdentifier}, bool ownNativeInstance = false);");
NewLine(); NewLine();
foreach (var ctor in @class.Constructors) foreach (var ctor in @class.Constructors)

56
src/Generator/Generators/C/CppSources.cs

@ -162,7 +162,7 @@ namespace CppSharp.Generators.Cpp
return; return;
// Output a default constructor that takes the native instance. // Output a default constructor that takes the native instance.
GenerateClassConstructor(@class); GenerateClassConstructor(@class, withOwnNativeInstanceParam: true);
if (@class.IsRefType) if (@class.IsRefType)
{ {
@ -290,15 +290,26 @@ namespace CppSharp.Generators.Cpp
return true; return true;
} }
public virtual string ClassCtorInstanceParamIdentifier => "instance"; public virtual void GenerateClassConstructor(Class @class, bool withOwnNativeInstanceParam = false)
public virtual void GenerateClassConstructor(Class @class)
{ {
Write($"{QualifiedIdentifier(@class)}::{@class.Name}("); Write($"{QualifiedIdentifier(@class)}::{@class.Name}(");
var nativeType = $"::{@class.QualifiedOriginalName}*"; var nativeType = $"::{@class.QualifiedOriginalName}*";
WriteLine($"{nativeType} {ClassCtorInstanceParamIdentifier})"); //WriteLine($"{nativeType} {ClassCtorInstanceParamIdentifier})");
GenerateClassConstructorBase(@class); WriteLine(!withOwnNativeInstanceParam ? $"{nativeType} {ClassCtorInstanceParamIdentifier})" :
$"{nativeType} {ClassCtorInstanceParamIdentifier}, bool ownNativeInstance)");
var hasBase = GenerateClassConstructorBase(@class, null, withOwnNativeInstanceParam);
if (CLIGenerator.ShouldGenerateClassNativeField(@class))
{
Indent();
Write(hasBase ? "," : ":");
Unindent();
WriteLine(!withOwnNativeInstanceParam ? " {0}(false)" : " {0}(ownNativeInstance)",
Helpers.OwnsNativeInstanceIdentifier);
}
WriteOpenBraceAndIndent(); WriteOpenBraceAndIndent();
@ -312,30 +323,29 @@ namespace CppSharp.Generators.Cpp
NewLine(); NewLine();
} }
private bool GenerateClassConstructorBase(Class @class, Method method = null) private bool GenerateClassConstructorBase(Class @class, Method method = null,
bool withOwnNativeInstanceParam = false)
{ {
var hasBase = @class.HasBase && @class.Bases[0].IsClass && @class.Bases[0].Class.IsGenerated; if (@class.IsValueType)
if (!hasBase) return true;
if (!@class.NeedsBase)
return false; return false;
if (!@class.IsValueType) Indent();
{
Indent();
var baseClass = @class.Bases[0].Class; Write($": {QualifiedIdentifier(@class.BaseClass)}(");
Write($": {QualifiedIdentifier(baseClass)}(");
// We cast the value to the base class type since otherwise there // We cast the value to the base class type since otherwise there
// could be ambiguous call to overloaded constructors. // could be ambiguous call to overloaded constructors.
CTypePrinter.PushContext(TypePrinterContextKind.Native); var cppTypePrinter = new CppTypePrinter(Context);
var nativeTypeName = baseClass.Visit(CTypePrinter); var nativeTypeName = @class.BaseClass.Visit(cppTypePrinter);
CTypePrinter.PopContext();
Write($"({nativeTypeName}*)");
WriteLine("{0})", method != null ? "nullptr" : ClassCtorInstanceParamIdentifier); Write($"({nativeTypeName}*)");
WriteLine("{0}{1})", method != null ? "nullptr" : ClassCtorInstanceParamIdentifier,
!withOwnNativeInstanceParam ? "" : ", ownNativeInstance");
Unindent(); Unindent();
}
return true; return true;
} }

Loading…
Cancel
Save