diff --git a/src/Generator/Generators/C/CCodeGenerator.cs b/src/Generator/Generators/C/CCodeGenerator.cs index 3934848b..0ad6ce49 100644 --- a/src/Generator/Generators/C/CCodeGenerator.cs +++ b/src/Generator/Generators/C/CCodeGenerator.cs @@ -27,8 +27,9 @@ namespace CppSharp.Generators.C public abstract class CCodeGenerator : CodeGenerator { - public CCodeGenerator(BindingContext context) - : base(context) + public CCodeGenerator(BindingContext context, + IEnumerable units = null) + : base(context, units) { VisitOptions.VisitPropertyAccessors = true; } @@ -41,7 +42,7 @@ namespace CppSharp.Generators.C return decl.QualifiedName; } - private CppTypePrinter typePrinter = new CppTypePrinter(); + protected CppTypePrinter typePrinter = new CppTypePrinter(); public virtual CppTypePrinter CTypePrinter => typePrinter; public virtual void WriteHeaders() { } diff --git a/src/Generator/Generators/C/CppTypePrinter.cs b/src/Generator/Generators/C/CppTypePrinter.cs index a977b493..08c290f5 100644 --- a/src/Generator/Generators/C/CppTypePrinter.cs +++ b/src/Generator/Generators/C/CppTypePrinter.cs @@ -91,7 +91,13 @@ namespace CppSharp.Generators.C return $"{qual}{VisitPrimitiveType(builtin.Type)}"; } - public TypePrinterResult VisitPrimitiveType(PrimitiveType primitive) + public override TypePrinterResult VisitPrimitiveType(PrimitiveType primitive, TypeQualifiers quals) + { + var qual = GetStringQuals(quals); + return $"{qual}{VisitPrimitiveType(primitive)}"; + } + + public virtual TypePrinterResult VisitPrimitiveType(PrimitiveType primitive) { switch (primitive) { @@ -153,12 +159,6 @@ namespace CppSharp.Generators.C throw new NotSupportedException(); } - public override TypePrinterResult VisitPrimitiveType(PrimitiveType primitive, TypeQualifiers quals) - { - var qual = GetStringQuals(quals); - return $"{qual}{VisitPrimitiveType(primitive)}"; - } - public override TypePrinterResult VisitTypedefType(TypedefType typedef, TypeQualifiers quals) { FunctionType func; @@ -284,7 +284,7 @@ namespace CppSharp.Generators.C public override TypePrinterResult VisitDeclaration(Declaration decl, TypeQualifiers quals) { - throw new NotImplementedException(); + return VisitDeclaration(decl); } public override TypePrinterResult VisitFunctionType(FunctionType function, TypeQualifiers quals) diff --git a/src/Generator/Generators/CLI/CLIGenerator.cs b/src/Generator/Generators/CLI/CLIGenerator.cs index d66e7ad5..d5eb088a 100644 --- a/src/Generator/Generators/CLI/CLIGenerator.cs +++ b/src/Generator/Generators/CLI/CLIGenerator.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using CppSharp.AST; +using CppSharp.Generators.C; namespace CppSharp.Generators.CLI { @@ -9,7 +10,7 @@ namespace CppSharp.Generators.CLI /// public class CLIGenerator : Generator { - private readonly CLITypePrinter typePrinter; + private readonly CppTypePrinter typePrinter; public CLIGenerator(BindingContext context) : base(context) { @@ -35,6 +36,7 @@ namespace CppSharp.Generators.CLI { if (@class.IsStatic) return false; + return @class.IsRefType && (!@class.HasBase || !@class.HasRefBase()); } diff --git a/src/Generator/Generators/CLI/CLIHeaders.cs b/src/Generator/Generators/CLI/CLIHeaders.cs index 327e5c4f..2f1ca012 100644 --- a/src/Generator/Generators/CLI/CLIHeaders.cs +++ b/src/Generator/Generators/CLI/CLIHeaders.cs @@ -628,10 +628,10 @@ namespace CppSharp.Generators.CLI public void GenerateIndexer(Property property) { - var type = property.QualifiedType.Visit(TypePrinter); + var type = property.QualifiedType.Visit(CTypePrinter); var getter = property.GetMethod; var indexParameter = getter.Parameters[0]; - var indexParameterType = indexParameter.QualifiedType.Visit(TypePrinter); + var indexParameterType = indexParameter.QualifiedType.Visit(CTypePrinter); WriteLine("property {0} default[{1}]", type, indexParameterType); WriteOpenBraceAndIndent(); @@ -651,7 +651,7 @@ namespace CppSharp.Generators.CLI return; PushBlock(BlockKind.Property, property); - var type = property.QualifiedType.Visit(TypePrinter); + var type = property.QualifiedType.Visit(CTypePrinter); if (property.IsStatic) Write("static "); @@ -763,7 +763,7 @@ namespace CppSharp.Generators.CLI WriteLine("{0}{1};", !insideClass ? "public " : "", - string.Format(TypePrinter.VisitDelegate(functionType).ToString(), + string.Format(CTypePrinter.VisitDelegate(functionType).ToString(), typedef.Name)); PopBlock(NewLineKind.BeforeNextBlock); @@ -825,7 +825,7 @@ namespace CppSharp.Generators.CLI Write("enum struct {0}", @enum.Name); - var typeName = TypePrinter.VisitPrimitiveType(@enum.BuiltinType.Type, + var typeName = CTypePrinter.VisitPrimitiveType(@enum.BuiltinType.Type, new TypeQualifiers()); if (@enum.BuiltinType.Type != PrimitiveType.Int && diff --git a/src/Generator/Generators/CLI/CLISources.cs b/src/Generator/Generators/CLI/CLISources.cs index e633890c..d3486342 100644 --- a/src/Generator/Generators/CLI/CLISources.cs +++ b/src/Generator/Generators/CLI/CLISources.cs @@ -898,7 +898,7 @@ namespace CppSharp.Generators.CLI for (var i = 0; i < function.Parameters.Count; ++i) { var param = function.Parameters[i]; - Write("{0}", TypePrinter.VisitParameter(param)); + Write("{0}", CTypePrinter.VisitParameter(param)); if (i < function.Parameters.Count - 1) Write(", "); } @@ -1040,7 +1040,7 @@ namespace CppSharp.Generators.CLI if (needsReturn) { - var retTypeName = retType.Visit(TypePrinter).ToString(); + var retTypeName = retType.Visit(CTypePrinter).ToString(); var isIntPtr = retTypeName.Contains("IntPtr"); if (retType.Type.IsPointer() && (isIntPtr || retTypeName.EndsWith("^", StringComparison.Ordinal))) diff --git a/src/Generator/Generators/CLI/CLITemplate.cs b/src/Generator/Generators/CLI/CLITemplate.cs index 651b16c4..1d236e5a 100644 --- a/src/Generator/Generators/CLI/CLITemplate.cs +++ b/src/Generator/Generators/CLI/CLITemplate.cs @@ -10,16 +10,14 @@ namespace CppSharp.Generators.CLI /// for source (CLISources) and header (CLIHeaders) /// files. /// - public abstract class CLITemplate : CodeGenerator + public abstract class CLITemplate : CCodeGenerator { - public CLITypePrinter TypePrinter { get; set; } - public ISet Includes; protected CLITemplate(BindingContext context, IEnumerable units) : base(context, units) { - TypePrinter = new CLITypePrinter(context); + typePrinter = new CLITypePrinter(context); Includes = new HashSet(); } @@ -66,7 +64,7 @@ namespace CppSharp.Generators.CLI continue; var param = method.Parameters[i]; - Write("{0}", TypePrinter.VisitParameter(param)); + Write("{0}", CTypePrinter.VisitParameter(param)); if (i < method.Parameters.Count - 1) Write(", "); } @@ -76,7 +74,7 @@ namespace CppSharp.Generators.CLI { var types = new List(); foreach (var param in parameters) - types.Add(TypePrinter.VisitParameter(param).ToString()); + types.Add(CTypePrinter.VisitParameter(param).ToString()); return string.Join(", ", types); } diff --git a/src/Generator/Generators/CLI/CLITypePrinter.cs b/src/Generator/Generators/CLI/CLITypePrinter.cs index 9634b3cf..ad8c2392 100644 --- a/src/Generator/Generators/CLI/CLITypePrinter.cs +++ b/src/Generator/Generators/CLI/CLITypePrinter.cs @@ -2,13 +2,14 @@ using System.Collections.Generic; using CppSharp.AST; using CppSharp.AST.Extensions; +using CppSharp.Generators.C; using CppSharp.Generators.CSharp; using CppSharp.Types; using Type = CppSharp.AST.Type; namespace CppSharp.Generators.CLI { - public class CLITypePrinter : TypePrinter + public class CLITypePrinter : CppTypePrinter { public BindingContext Context { get; private set; } @@ -164,8 +165,17 @@ namespace CppSharp.Generators.CLI return pointer.QualifiedPointee.Visit(this); } - public override TypePrinterResult VisitPrimitiveType(PrimitiveType primitive, - TypeQualifiers quals) + public override TypePrinterResult VisitBuiltinType(BuiltinType builtin, TypeQualifiers quals) + { + return VisitPrimitiveType(builtin.Type); + } + + public override TypePrinterResult VisitPrimitiveType(PrimitiveType primitive, TypeQualifiers quals) + { + return VisitPrimitiveType(primitive); + } + + public override TypePrinterResult VisitPrimitiveType(PrimitiveType primitive) { switch (primitive) { @@ -335,6 +345,11 @@ namespace CppSharp.Generators.CLI return $"{@class.Name}{(@class.IsRefType ? "^" : string.Empty)}"; } + public override TypePrinterResult VisitClassTemplateDecl(ClassTemplate template) + { + return template.Name; + } + public override TypePrinterResult VisitTypedefDecl(TypedefDecl typedef) { return typedef.Name;