Browse Source

CppTypePrinter now takes a BindingContext for further usage in type maps handling.

pull/1316/head
João Matos 6 years ago committed by João Matos
parent
commit
55a31b05bf
  1. 6
      src/CppParser/Bootstrap/Bootstrap.cs
  2. 16
      src/Generator.Tests/AST/TestAST.cs
  3. 2
      src/Generator/Generators/C/CCodeGenerator.cs
  4. 2
      src/Generator/Generators/C/CppGenerator.cs
  5. 15
      src/Generator/Generators/C/CppMarshal.cs
  6. 3
      src/Generator/Generators/C/CppSources.cs
  7. 8
      src/Generator/Generators/C/CppTypePrinter.cs
  8. 2
      src/Generator/Generators/CLI/CLIHeaders.cs
  9. 10
      src/Generator/Generators/CLI/CLIMarshal.cs
  10. 10
      src/Generator/Generators/CLI/CLISources.cs
  11. 8
      src/Generator/Generators/CLI/CLITypePrinter.cs
  12. 2
      src/Generator/Generators/CSharp/CSharpMarshal.cs
  13. 2
      src/Generator/Generators/CSharp/CSharpSourcesExtensions.cs
  14. 2
      src/Generator/Passes/CheckIgnoredDecls.cs
  15. 12
      src/Generator/Passes/SymbolsCodeGenerator.cs
  16. 2
      src/Generator/Types/Std/Stdlib.cs
  17. 4
      src/Generator/Types/TypeMapDatabase.cs

6
src/CppParser/Bootstrap/Bootstrap.cs

@ -116,6 +116,9 @@ namespace CppSharp @@ -116,6 +116,9 @@ namespace CppSharp
exprCxxUnit.Visit(exprSubclassVisitor);
ExprClasses = exprSubclassVisitor.Classes;
CodeGeneratorHelpers.CppTypePrinter = new CppTypePrinter(driver.Context)
{ ScopeKind = TypePrintScopeKind.Local };
GenerateStmt(driver.Context);
GenerateExpr(driver.Context);
}
@ -1492,8 +1495,7 @@ namespace CppSharp @@ -1492,8 +1495,7 @@ namespace CppSharp
static class CodeGeneratorHelpers
{
internal static CppTypePrinter CppTypePrinter =
new CppTypePrinter { ScopeKind = TypePrintScopeKind.Local };
internal static CppTypePrinter CppTypePrinter;
public static bool IsAbstractStmt(Class @class) => IsAbstractStmt(@class.Name);

16
src/Generator.Tests/AST/TestAST.cs

@ -2,6 +2,7 @@ using System; @@ -2,6 +2,7 @@ using System;
using System.Linq;
using CppSharp.AST;
using CppSharp.AST.Extensions;
using CppSharp.Generators;
using CppSharp.Generators.C;
using CppSharp.Generators.CSharp;
using CppSharp.Passes;
@ -12,9 +13,14 @@ namespace CppSharp.Generator.Tests.AST @@ -12,9 +13,14 @@ namespace CppSharp.Generator.Tests.AST
[TestFixture]
public class TestAST : ASTTestFixture
{
private BindingContext Context;
[OneTimeSetUp]
public void Init()
{
Context = new BindingContext(new DriverOptions());
Context.TypeMaps = new Types.TypeMapDatabase(Context);
CppSharp.AST.Type.TypePrinterDelegate = type =>
{
PrimitiveType primitiveType;
@ -473,7 +479,7 @@ namespace CppSharp.Generator.Tests.AST @@ -473,7 +479,7 @@ namespace CppSharp.Generator.Tests.AST
[Test]
public void TestPrintingConstPointerWithConstType()
{
var cppTypePrinter = new CppTypePrinter { ScopeKind = TypePrintScopeKind.Qualified };
var cppTypePrinter = new CppTypePrinter(Context) { ScopeKind = TypePrintScopeKind.Qualified };
var builtin = new BuiltinType(PrimitiveType.Char);
var pointee = new QualifiedType(builtin, new TypeQualifiers { IsConst = true });
var pointer = new QualifiedType(new PointerType(pointee), new TypeQualifiers { IsConst = true });
@ -485,7 +491,7 @@ namespace CppSharp.Generator.Tests.AST @@ -485,7 +491,7 @@ namespace CppSharp.Generator.Tests.AST
public void TestPrintingSpecializationWithConstValue()
{
var template = AstContext.FindDecl<ClassTemplate>("TestSpecializationArguments").First();
var cppTypePrinter = new CppTypePrinter { ScopeKind = TypePrintScopeKind.Qualified };
var cppTypePrinter = new CppTypePrinter(Context) { ScopeKind = TypePrintScopeKind.Qualified };
Assert.That(template.Specializations.Last().Visit(cppTypePrinter).Type,
Is.EqualTo("TestSpecializationArguments<const TestASTEnumItemByName>"));
}
@ -537,7 +543,7 @@ namespace CppSharp.Generator.Tests.AST @@ -537,7 +543,7 @@ namespace CppSharp.Generator.Tests.AST
[Test]
public void TestVolatile()
{
var cppTypePrinter = new CppTypePrinter { ScopeKind = TypePrintScopeKind.Qualified };
var cppTypePrinter = new CppTypePrinter(Context) { ScopeKind = TypePrintScopeKind.Qualified };
var builtin = new BuiltinType(PrimitiveType.Char);
var pointee = new QualifiedType(builtin, new TypeQualifiers { IsConst = true, IsVolatile = true });
var type = pointee.Visit(cppTypePrinter).Type;
@ -555,7 +561,7 @@ namespace CppSharp.Generator.Tests.AST @@ -555,7 +561,7 @@ namespace CppSharp.Generator.Tests.AST
public void TestPrintNestedInSpecialization()
{
var template = AstContext.FindDecl<ClassTemplate>("TestTemplateClass").First();
var cppTypePrinter = new CppTypePrinter { ScopeKind = TypePrintScopeKind.Qualified };
var cppTypePrinter = new CppTypePrinter(Context) { ScopeKind = TypePrintScopeKind.Qualified };
Assert.That(template.Specializations[3].Classes.First().Visit(cppTypePrinter).Type,
Is.EqualTo("TestTemplateClass<Math::Complex>::NestedInTemplate"));
}
@ -564,7 +570,7 @@ namespace CppSharp.Generator.Tests.AST @@ -564,7 +570,7 @@ namespace CppSharp.Generator.Tests.AST
public void TestPrintQualifiedSpecialization()
{
var functionWithSpecializationArg = AstContext.FindFunction("functionWithSpecializationArg").First();
var cppTypePrinter = new CppTypePrinter { ScopeKind = TypePrintScopeKind.Qualified };
var cppTypePrinter = new CppTypePrinter(Context) { ScopeKind = TypePrintScopeKind.Qualified };
Assert.That(functionWithSpecializationArg.Parameters[0].Visit(cppTypePrinter).Type,
Is.EqualTo("const TestTemplateClass<int>"));
}

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

@ -32,7 +32,7 @@ namespace CppSharp.Generators.C @@ -32,7 +32,7 @@ namespace CppSharp.Generators.C
: base(context, units)
{
VisitOptions.VisitPropertyAccessors = true;
typePrinter = new CppTypePrinter();
typePrinter = new CppTypePrinter(context);
}
public abstract override string FileExtension { get; }

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

@ -14,7 +14,7 @@ namespace CppSharp.Generators.Cpp @@ -14,7 +14,7 @@ namespace CppSharp.Generators.Cpp
public CppGenerator(BindingContext context) : base(context)
{
typePrinter = new CppTypePrinter();
typePrinter = new CppTypePrinter(Context);
}
public override List<CodeGenerator> Generate(IEnumerable<TranslationUnit> units)

15
src/Generator/Generators/C/CppMarshal.cs

@ -77,7 +77,8 @@ namespace CppSharp.Generators.Cpp @@ -77,7 +77,8 @@ namespace CppSharp.Generators.Cpp
if (pointer.GetFinalQualifiedPointee().Qualifiers.IsConst !=
Context.ReturnType.Qualifiers.IsConst)
{
var nativeTypePrinter = new CppTypePrinter { PrintTypeQualifiers = false };
var nativeTypePrinter = new CppTypePrinter(Context.Context)
{ PrintTypeQualifiers = false };
var returnType = Context.ReturnType.Type.Desugar();
var constlessPointer = new PointerType()
{
@ -98,7 +99,7 @@ namespace CppSharp.Generators.Cpp @@ -98,7 +99,7 @@ namespace CppSharp.Generators.Cpp
Modifier = pointer.Modifier,
QualifiedPointee = new QualifiedType(pointee)
};
var nativeTypePrinter = new CppTypePrinter();
var nativeTypePrinter = new CppTypePrinter(Context.Context);
var nativeTypeName = desugaredPointer.Visit(nativeTypePrinter, quals);
Context.Return.Write("reinterpret_cast<{0}>({1})", nativeTypeName,
returnVarName);
@ -300,7 +301,7 @@ namespace CppSharp.Generators.Cpp @@ -300,7 +301,7 @@ namespace CppSharp.Generators.Cpp
public override bool VisitEnumDecl(Enumeration @enum)
{
var typePrinter = new CppTypePrinter();
var typePrinter = new CppTypePrinter(Context.Context);
var typeName = typePrinter.VisitDeclaration(@enum);
Context.Return.Write($"({typeName}){Context.ReturnVarName}");
@ -393,7 +394,7 @@ namespace CppSharp.Generators.Cpp @@ -393,7 +394,7 @@ namespace CppSharp.Generators.Cpp
if (pointee is FunctionType)
{
var cppTypePrinter = new CppTypePrinter();
var cppTypePrinter = new CppTypePrinter(Context.Context);
var cppTypeName = pointer.Visit(cppTypePrinter, quals);
return VisitDelegateType(cppTypeName);
@ -422,7 +423,7 @@ namespace CppSharp.Generators.Cpp @@ -422,7 +423,7 @@ namespace CppSharp.Generators.Cpp
var finalPointee = pointer.GetFinalPointee();
if (finalPointee.IsPrimitiveType())
{
var cppTypePrinter = new CppTypePrinter();
var cppTypePrinter = new CppTypePrinter(Context.Context);
var cppTypeName = pointer.Visit(cppTypePrinter, quals);
Context.Return.Write($"({cppTypeName})");
@ -485,14 +486,14 @@ namespace CppSharp.Generators.Cpp @@ -485,14 +486,14 @@ namespace CppSharp.Generators.Cpp
FunctionType func;
if (decl.Type.IsPointerTo(out func))
{
var typePrinter = new CppTypePrinter(Context.Context);
// Use the original typedef name if available, otherwise just use the function pointer type
string cppTypeName;
if (!decl.IsSynthetized)
cppTypeName = "::" + typedef.Declaration.QualifiedOriginalName;
else
{
var cppTypePrinter = new CppTypePrinter();
cppTypeName = decl.Type.Visit(cppTypePrinter, quals);
cppTypeName = decl.Type.Visit(typePrinter, quals);
}
VisitDelegateType(cppTypeName);

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

@ -591,8 +591,7 @@ namespace CppSharp.Generators.Cpp @@ -591,8 +591,7 @@ namespace CppSharp.Generators.Cpp
if (isRef)
{
var typePrinter = new CppTypePrinter();
var type = paramType.Visit(typePrinter);
var type = paramType.Visit(CTypePrinter);
if (param.IsInOut)
{

8
src/Generator/Generators/C/CppTypePrinter.cs

@ -3,6 +3,7 @@ using System.Collections.Generic; @@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using CppSharp.AST;
using CppSharp.AST.Extensions;
using CppSharp.Types;
namespace CppSharp.Generators.C
{
@ -21,14 +22,19 @@ namespace CppSharp.Generators.C @@ -21,14 +22,19 @@ namespace CppSharp.Generators.C
public bool PrintTypeModifiers { get; set; }
public bool PrintVariableArrayAsPointers { get; set; }
public CppTypePrinter() : base(TypePrinterContextKind.Managed)
public CppTypePrinter(BindingContext context) : base(TypePrinterContextKind.Managed)
{
Context = context;
PrintFlavorKind = CppTypePrintFlavorKind.Cpp;
ScopeKind = TypePrintScopeKind.GlobalQualified;
PrintTypeQualifiers = true;
PrintTypeModifiers = true;
}
public BindingContext Context { get; private set; }
public TypeMapDatabase TypeMapDatabase => Context.TypeMaps;
public DriverOptions Options => Context.Options;
public bool ResolveTypedefs { get; set; }
public override TypePrinterResult VisitTagType(TagType tag, TypeQualifiers quals)

2
src/Generator/Generators/CLI/CLIHeaders.cs

@ -465,7 +465,7 @@ namespace CppSharp.Generators.CLI @@ -465,7 +465,7 @@ namespace CppSharp.Generators.CLI
{
if (!@event.IsGenerated) continue;
var cppTypePrinter = new CppTypePrinter();
var cppTypePrinter = new CppTypePrinter(Context);
var cppArgs = cppTypePrinter.VisitParameters(@event.Parameters, hasNames: true);
WriteLine("private:");

10
src/Generator/Generators/CLI/CLIMarshal.cs

@ -119,7 +119,7 @@ namespace CppSharp.Generators.CLI @@ -119,7 +119,7 @@ namespace CppSharp.Generators.CLI
if (pointer.GetFinalQualifiedPointee().Qualifiers.IsConst !=
Context.ReturnType.Qualifiers.IsConst)
{
var nativeTypePrinter = new CppTypePrinter { PrintTypeQualifiers = false };
var nativeTypePrinter = new CppTypePrinter(Context.Context) { PrintTypeQualifiers = false };
var returnType = Context.ReturnType.Type.Desugar();
var constlessPointer = new PointerType()
{
@ -139,7 +139,7 @@ namespace CppSharp.Generators.CLI @@ -139,7 +139,7 @@ namespace CppSharp.Generators.CLI
Modifier = pointer.Modifier,
QualifiedPointee = new QualifiedType(pointee)
};
var nativeTypePrinter = new CppTypePrinter();
var nativeTypePrinter = new CppTypePrinter(Context.Context);
var nativeTypeName = desugaredPointer.Visit(nativeTypePrinter, quals);
Context.Return.Write("reinterpret_cast<{0}>({1})", nativeTypeName,
returnVarName);
@ -504,7 +504,7 @@ namespace CppSharp.Generators.CLI @@ -504,7 +504,7 @@ namespace CppSharp.Generators.CLI
if (pointee is FunctionType)
{
var cppTypePrinter = new CppTypePrinter();
var cppTypePrinter = new CppTypePrinter(Context.Context);
var cppTypeName = pointer.Visit(cppTypePrinter, quals);
return VisitDelegateType(cppTypeName);
@ -533,7 +533,7 @@ namespace CppSharp.Generators.CLI @@ -533,7 +533,7 @@ namespace CppSharp.Generators.CLI
var finalPointee = pointer.GetFinalPointee();
if (finalPointee.IsPrimitiveType())
{
var cppTypePrinter = new CppTypePrinter();
var cppTypePrinter = new CppTypePrinter(Context.Context);
var cppTypeName = pointer.Visit(cppTypePrinter, quals);
Context.Return.Write("({0})", cppTypeName);
@ -602,7 +602,7 @@ namespace CppSharp.Generators.CLI @@ -602,7 +602,7 @@ namespace CppSharp.Generators.CLI
cppTypeName = "::" + typedef.Declaration.QualifiedOriginalName;
else
{
var cppTypePrinter = new CppTypePrinter();
var cppTypePrinter = new CppTypePrinter(Context.Context);
cppTypeName = decl.Type.Visit(cppTypePrinter, quals);
}

10
src/Generator/Generators/CLI/CLISources.cs

@ -528,7 +528,7 @@ namespace CppSharp.Generators.CLI @@ -528,7 +528,7 @@ namespace CppSharp.Generators.CLI
WriteLine("if (!{0}Instance)", delegateName);
WriteOpenBraceAndIndent();
var typePrinter = new CppTypePrinter();
var typePrinter = new CppTypePrinter(Context);
var args = typePrinter.VisitParameters(@event.Parameters, hasNames: false);
WriteLine("{0}Instance = gcnew {0}(this, &{1}::_{2}Raise);",
@ -578,7 +578,7 @@ namespace CppSharp.Generators.CLI @@ -578,7 +578,7 @@ namespace CppSharp.Generators.CLI
private void GenerateEventRaiseWrapper(Event @event, Class @class)
{
var typePrinter = new CppTypePrinter();
var typePrinter = new CppTypePrinter(Context);
var args = typePrinter.VisitParameters(@event.Parameters, hasNames: true);
WriteLine("void {0}::_{1}Raise({2})", QualifiedIdentifier(@class),
@ -716,7 +716,7 @@ namespace CppSharp.Generators.CLI @@ -716,7 +716,7 @@ namespace CppSharp.Generators.CLI
// We cast the value to the base clas type since otherwise there
// could be ambiguous call to overloaded constructors.
var cppTypePrinter = new CppTypePrinter();
var cppTypePrinter = new CppTypePrinter(Context);
var nativeTypeName = baseClass.Visit(cppTypePrinter);
Write("({0}*)", nativeTypeName);
@ -968,7 +968,7 @@ namespace CppSharp.Generators.CLI @@ -968,7 +968,7 @@ namespace CppSharp.Generators.CLI
function.OperatorKind == CXXOperatorKind.ExplicitConversion)
{
var method = function as Method;
var typePrinter = new CppTypePrinter();
var typePrinter = new CppTypePrinter(Context);
var typeName = method.ConversionType.Visit(typePrinter);
WriteLine("({0}) {1};", typeName, @params[0].Name);
}
@ -1179,7 +1179,7 @@ namespace CppSharp.Generators.CLI @@ -1179,7 +1179,7 @@ namespace CppSharp.Generators.CLI
if (isRef)
{
var typePrinter = new CppTypePrinter();
var typePrinter = new CppTypePrinter(Context);
var type = paramType.Visit(typePrinter);
if (param.IsInOut)

8
src/Generator/Generators/CLI/CLITypePrinter.cs

@ -11,14 +11,8 @@ namespace CppSharp.Generators.CLI @@ -11,14 +11,8 @@ namespace CppSharp.Generators.CLI
{
public class CLITypePrinter : CppTypePrinter
{
public BindingContext Context { get; private set; }
public DriverOptions Options { get { return Context.Options; } }
public TypeMapDatabase TypeMapDatabase { get { return Context.TypeMaps; } }
public CLITypePrinter(BindingContext context)
public CLITypePrinter(BindingContext context) : base(context)
{
Context = context;
}
public override TypePrinterResult VisitTagType(TagType tag, TypeQualifiers quals)

2
src/Generator/Generators/CSharp/CSharpMarshal.cs

@ -588,7 +588,7 @@ namespace CppSharp.Generators.CSharp @@ -588,7 +588,7 @@ namespace CppSharp.Generators.CSharp
var local = Generator.GeneratedIdentifier($@"{
param.Name}{Context.ParameterIndex}");
string cast = isVoid ? $@"({pointee.Visit(
new CppTypePrinter { PrintTypeQualifiers = false })}) " : string.Empty;
new CppTypePrinter(Context.Context) { PrintTypeQualifiers = false })}) " : string.Empty;
Context.Before.WriteLine($"var {local} = {cast}{Context.Return};");
Context.Return.StringBuilder.Clear();
Context.Return.Write(local);

2
src/Generator/Generators/CSharp/CSharpSourcesExtensions.cs

@ -124,7 +124,7 @@ namespace CppSharp.Generators.CSharp @@ -124,7 +124,7 @@ namespace CppSharp.Generators.CSharp
var names = new List<string> { mapped.OriginalName };
foreach (TypePrintScopeKind kind in Enum.GetValues(typeof(TypePrintScopeKind)))
{
var cppTypePrinter = new CppTypePrinter { ScopeKind = kind };
var cppTypePrinter = new CppTypePrinter(context) { ScopeKind = kind };
names.Add(mapped.Visit(cppTypePrinter));
}
foreach (var name in names.Where(context.TypeMaps.TypeMaps.ContainsKey))

2
src/Generator/Passes/CheckIgnoredDecls.cs

@ -116,7 +116,7 @@ namespace CppSharp.Passes @@ -116,7 +116,7 @@ namespace CppSharp.Passes
var @class = (Class)field.Namespace;
var cppTypePrinter = new CppTypePrinter();
var cppTypePrinter = new CppTypePrinter(Context);
var typeName = field.Type.Visit(cppTypePrinter);
Diagnostics.Debug("Field '{0}::{1}' was ignored due to {2} type '{3}'",

12
src/Generator/Passes/SymbolsCodeGenerator.cs

@ -16,6 +16,11 @@ namespace CppSharp.Passes @@ -16,6 +16,11 @@ namespace CppSharp.Passes
public SymbolsCodeGenerator(BindingContext context, IEnumerable<TranslationUnit> units)
: base(context, units)
{
cppTypePrinter = new CppTypePrinter(Context)
{
ScopeKind = TypePrintScopeKind.Qualified,
ResolveTypedefs = true
};
}
public override void Process()
@ -349,11 +354,8 @@ namespace CppSharp.Passes @@ -349,11 +354,8 @@ namespace CppSharp.Passes
return parentsOpen;
}
private CppTypePrinter cppTypePrinter = new CppTypePrinter
{
ScopeKind = TypePrintScopeKind.Qualified,
ResolveTypedefs = true
};
private CppTypePrinter cppTypePrinter;
private int functionCount;
}
}

2
src/Generator/Types/Std/Stdlib.cs

@ -502,7 +502,7 @@ namespace CppSharp.Types.Std @@ -502,7 +502,7 @@ namespace CppSharp.Types.Std
var tmpVarName = "_tmp" + entryString;
var cppTypePrinter = new CppTypePrinter();
var cppTypePrinter = new CppTypePrinter(Context);
var nativeType = type.Type.Visit(cppTypePrinter);
ctx.Before.WriteLine("auto {0} = std::vector<{1}>();",

4
src/Generator/Types/TypeMapDatabase.cs

@ -11,9 +11,11 @@ namespace CppSharp.Types @@ -11,9 +11,11 @@ namespace CppSharp.Types
public class TypeMapDatabase : ITypeMapDatabase
{
public IDictionary<string, TypeMap> TypeMaps { get; set; }
private readonly BindingContext Context;
public TypeMapDatabase(BindingContext bindingContext)
{
Context = bindingContext;
TypeMaps = new Dictionary<string, TypeMap>();
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
@ -87,7 +89,7 @@ namespace CppSharp.Types @@ -87,7 +89,7 @@ namespace CppSharp.Types
bool printExtra = desugared.IsPrimitiveType() ||
(desugared.GetFinalPointee() ?? desugared).Desugar().IsPrimitiveType();
var typePrinter = new CppTypePrinter
var typePrinter = new CppTypePrinter(Context)
{
PrintTypeQualifiers = printExtra,
PrintTypeModifiers = printExtra,

Loading…
Cancel
Save