Skip to content

Commit 55a31b0

Browse files
committed
CppTypePrinter now takes a BindingContext for further usage in type maps handling.
1 parent 3e67c1f commit 55a31b0

17 files changed

+59
-47
lines changed

src/CppParser/Bootstrap/Bootstrap.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ public void Preprocess(Driver driver, ASTContext ctx)
116116
exprCxxUnit.Visit(exprSubclassVisitor);
117117
ExprClasses = exprSubclassVisitor.Classes;
118118

119+
CodeGeneratorHelpers.CppTypePrinter = new CppTypePrinter(driver.Context)
120+
{ ScopeKind = TypePrintScopeKind.Local };
121+
119122
GenerateStmt(driver.Context);
120123
GenerateExpr(driver.Context);
121124
}
@@ -1492,8 +1495,7 @@ public bool IsInheritedClass(Class @class)
14921495

14931496
static class CodeGeneratorHelpers
14941497
{
1495-
internal static CppTypePrinter CppTypePrinter =
1496-
new CppTypePrinter { ScopeKind = TypePrintScopeKind.Local };
1498+
internal static CppTypePrinter CppTypePrinter;
14971499

14981500
public static bool IsAbstractStmt(Class @class) => IsAbstractStmt(@class.Name);
14991501

src/Generator.Tests/AST/TestAST.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Linq;
33
using CppSharp.AST;
44
using CppSharp.AST.Extensions;
5+
using CppSharp.Generators;
56
using CppSharp.Generators.C;
67
using CppSharp.Generators.CSharp;
78
using CppSharp.Passes;
@@ -12,9 +13,14 @@ namespace CppSharp.Generator.Tests.AST
1213
[TestFixture]
1314
public class TestAST : ASTTestFixture
1415
{
16+
private BindingContext Context;
17+
1518
[OneTimeSetUp]
1619
public void Init()
1720
{
21+
Context = new BindingContext(new DriverOptions());
22+
Context.TypeMaps = new Types.TypeMapDatabase(Context);
23+
1824
CppSharp.AST.Type.TypePrinterDelegate = type =>
1925
{
2026
PrimitiveType primitiveType;
@@ -473,7 +479,7 @@ public void TestOriginalNamesOfSpecializations()
473479
[Test]
474480
public void TestPrintingConstPointerWithConstType()
475481
{
476-
var cppTypePrinter = new CppTypePrinter { ScopeKind = TypePrintScopeKind.Qualified };
482+
var cppTypePrinter = new CppTypePrinter(Context) { ScopeKind = TypePrintScopeKind.Qualified };
477483
var builtin = new BuiltinType(PrimitiveType.Char);
478484
var pointee = new QualifiedType(builtin, new TypeQualifiers { IsConst = true });
479485
var pointer = new QualifiedType(new PointerType(pointee), new TypeQualifiers { IsConst = true });
@@ -485,7 +491,7 @@ public void TestPrintingConstPointerWithConstType()
485491
public void TestPrintingSpecializationWithConstValue()
486492
{
487493
var template = AstContext.FindDecl<ClassTemplate>("TestSpecializationArguments").First();
488-
var cppTypePrinter = new CppTypePrinter { ScopeKind = TypePrintScopeKind.Qualified };
494+
var cppTypePrinter = new CppTypePrinter(Context) { ScopeKind = TypePrintScopeKind.Qualified };
489495
Assert.That(template.Specializations.Last().Visit(cppTypePrinter).Type,
490496
Is.EqualTo("TestSpecializationArguments<const TestASTEnumItemByName>"));
491497
}
@@ -537,7 +543,7 @@ public void TestFunctionSpecializationInfo()
537543
[Test]
538544
public void TestVolatile()
539545
{
540-
var cppTypePrinter = new CppTypePrinter { ScopeKind = TypePrintScopeKind.Qualified };
546+
var cppTypePrinter = new CppTypePrinter(Context) { ScopeKind = TypePrintScopeKind.Qualified };
541547
var builtin = new BuiltinType(PrimitiveType.Char);
542548
var pointee = new QualifiedType(builtin, new TypeQualifiers { IsConst = true, IsVolatile = true });
543549
var type = pointee.Visit(cppTypePrinter).Type;
@@ -555,7 +561,7 @@ public void TestFindFunctionInNamespace()
555561
public void TestPrintNestedInSpecialization()
556562
{
557563
var template = AstContext.FindDecl<ClassTemplate>("TestTemplateClass").First();
558-
var cppTypePrinter = new CppTypePrinter { ScopeKind = TypePrintScopeKind.Qualified };
564+
var cppTypePrinter = new CppTypePrinter(Context) { ScopeKind = TypePrintScopeKind.Qualified };
559565
Assert.That(template.Specializations[3].Classes.First().Visit(cppTypePrinter).Type,
560566
Is.EqualTo("TestTemplateClass<Math::Complex>::NestedInTemplate"));
561567
}
@@ -564,7 +570,7 @@ public void TestPrintNestedInSpecialization()
564570
public void TestPrintQualifiedSpecialization()
565571
{
566572
var functionWithSpecializationArg = AstContext.FindFunction("functionWithSpecializationArg").First();
567-
var cppTypePrinter = new CppTypePrinter { ScopeKind = TypePrintScopeKind.Qualified };
573+
var cppTypePrinter = new CppTypePrinter(Context) { ScopeKind = TypePrintScopeKind.Qualified };
568574
Assert.That(functionWithSpecializationArg.Parameters[0].Visit(cppTypePrinter).Type,
569575
Is.EqualTo("const TestTemplateClass<int>"));
570576
}

src/Generator/Generators/C/CCodeGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public CCodeGenerator(BindingContext context,
3232
: base(context, units)
3333
{
3434
VisitOptions.VisitPropertyAccessors = true;
35-
typePrinter = new CppTypePrinter();
35+
typePrinter = new CppTypePrinter(context);
3636
}
3737

3838
public abstract override string FileExtension { get; }

src/Generator/Generators/C/CppGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class CppGenerator : Generator
1414

1515
public CppGenerator(BindingContext context) : base(context)
1616
{
17-
typePrinter = new CppTypePrinter();
17+
typePrinter = new CppTypePrinter(Context);
1818
}
1919

2020
public override List<CodeGenerator> Generate(IEnumerable<TranslationUnit> units)

src/Generator/Generators/C/CppMarshal.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
7777
if (pointer.GetFinalQualifiedPointee().Qualifiers.IsConst !=
7878
Context.ReturnType.Qualifiers.IsConst)
7979
{
80-
var nativeTypePrinter = new CppTypePrinter { PrintTypeQualifiers = false };
80+
var nativeTypePrinter = new CppTypePrinter(Context.Context)
81+
{ PrintTypeQualifiers = false };
8182
var returnType = Context.ReturnType.Type.Desugar();
8283
var constlessPointer = new PointerType()
8384
{
@@ -98,7 +99,7 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
9899
Modifier = pointer.Modifier,
99100
QualifiedPointee = new QualifiedType(pointee)
100101
};
101-
var nativeTypePrinter = new CppTypePrinter();
102+
var nativeTypePrinter = new CppTypePrinter(Context.Context);
102103
var nativeTypeName = desugaredPointer.Visit(nativeTypePrinter, quals);
103104
Context.Return.Write("reinterpret_cast<{0}>({1})", nativeTypeName,
104105
returnVarName);
@@ -300,7 +301,7 @@ public override bool VisitTypedefDecl(TypedefDecl typedef)
300301

301302
public override bool VisitEnumDecl(Enumeration @enum)
302303
{
303-
var typePrinter = new CppTypePrinter();
304+
var typePrinter = new CppTypePrinter(Context.Context);
304305
var typeName = typePrinter.VisitDeclaration(@enum);
305306
Context.Return.Write($"({typeName}){Context.ReturnVarName}");
306307

@@ -393,7 +394,7 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
393394

394395
if (pointee is FunctionType)
395396
{
396-
var cppTypePrinter = new CppTypePrinter();
397+
var cppTypePrinter = new CppTypePrinter(Context.Context);
397398
var cppTypeName = pointer.Visit(cppTypePrinter, quals);
398399

399400
return VisitDelegateType(cppTypeName);
@@ -422,7 +423,7 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
422423
var finalPointee = pointer.GetFinalPointee();
423424
if (finalPointee.IsPrimitiveType())
424425
{
425-
var cppTypePrinter = new CppTypePrinter();
426+
var cppTypePrinter = new CppTypePrinter(Context.Context);
426427
var cppTypeName = pointer.Visit(cppTypePrinter, quals);
427428

428429
Context.Return.Write($"({cppTypeName})");
@@ -485,14 +486,14 @@ public override bool VisitTypedefType(TypedefType typedef, TypeQualifiers quals)
485486
FunctionType func;
486487
if (decl.Type.IsPointerTo(out func))
487488
{
489+
var typePrinter = new CppTypePrinter(Context.Context);
488490
// Use the original typedef name if available, otherwise just use the function pointer type
489491
string cppTypeName;
490492
if (!decl.IsSynthetized)
491493
cppTypeName = "::" + typedef.Declaration.QualifiedOriginalName;
492494
else
493495
{
494-
var cppTypePrinter = new CppTypePrinter();
495-
cppTypeName = decl.Type.Visit(cppTypePrinter, quals);
496+
cppTypeName = decl.Type.Visit(typePrinter, quals);
496497
}
497498

498499
VisitDelegateType(cppTypeName);

src/Generator/Generators/C/CppSources.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -591,8 +591,7 @@ private ParamMarshal GenerateFunctionParamMarshal(Parameter param, int paramInde
591591

592592
if (isRef)
593593
{
594-
var typePrinter = new CppTypePrinter();
595-
var type = paramType.Visit(typePrinter);
594+
var type = paramType.Visit(CTypePrinter);
596595

597596
if (param.IsInOut)
598597
{

src/Generator/Generators/C/CppTypePrinter.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using CppSharp.AST;
55
using CppSharp.AST.Extensions;
6+
using CppSharp.Types;
67

78
namespace CppSharp.Generators.C
89
{
@@ -21,14 +22,19 @@ public class CppTypePrinter : TypePrinter
2122
public bool PrintTypeModifiers { get; set; }
2223
public bool PrintVariableArrayAsPointers { get; set; }
2324

24-
public CppTypePrinter() : base(TypePrinterContextKind.Managed)
25+
public CppTypePrinter(BindingContext context) : base(TypePrinterContextKind.Managed)
2526
{
27+
Context = context;
2628
PrintFlavorKind = CppTypePrintFlavorKind.Cpp;
2729
ScopeKind = TypePrintScopeKind.GlobalQualified;
2830
PrintTypeQualifiers = true;
2931
PrintTypeModifiers = true;
3032
}
3133

34+
public BindingContext Context { get; private set; }
35+
public TypeMapDatabase TypeMapDatabase => Context.TypeMaps;
36+
public DriverOptions Options => Context.Options;
37+
3238
public bool ResolveTypedefs { get; set; }
3339

3440
public override TypePrinterResult VisitTagType(TagType tag, TypeQualifiers quals)

src/Generator/Generators/CLI/CLIHeaders.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ public void GenerateClassEvents(Class @class)
465465
{
466466
if (!@event.IsGenerated) continue;
467467

468-
var cppTypePrinter = new CppTypePrinter();
468+
var cppTypePrinter = new CppTypePrinter(Context);
469469
var cppArgs = cppTypePrinter.VisitParameters(@event.Parameters, hasNames: true);
470470

471471
WriteLine("private:");

src/Generator/Generators/CLI/CLIMarshal.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
119119
if (pointer.GetFinalQualifiedPointee().Qualifiers.IsConst !=
120120
Context.ReturnType.Qualifiers.IsConst)
121121
{
122-
var nativeTypePrinter = new CppTypePrinter { PrintTypeQualifiers = false };
122+
var nativeTypePrinter = new CppTypePrinter(Context.Context) { PrintTypeQualifiers = false };
123123
var returnType = Context.ReturnType.Type.Desugar();
124124
var constlessPointer = new PointerType()
125125
{
@@ -139,7 +139,7 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
139139
Modifier = pointer.Modifier,
140140
QualifiedPointee = new QualifiedType(pointee)
141141
};
142-
var nativeTypePrinter = new CppTypePrinter();
142+
var nativeTypePrinter = new CppTypePrinter(Context.Context);
143143
var nativeTypeName = desugaredPointer.Visit(nativeTypePrinter, quals);
144144
Context.Return.Write("reinterpret_cast<{0}>({1})", nativeTypeName,
145145
returnVarName);
@@ -504,7 +504,7 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
504504

505505
if (pointee is FunctionType)
506506
{
507-
var cppTypePrinter = new CppTypePrinter();
507+
var cppTypePrinter = new CppTypePrinter(Context.Context);
508508
var cppTypeName = pointer.Visit(cppTypePrinter, quals);
509509

510510
return VisitDelegateType(cppTypeName);
@@ -533,7 +533,7 @@ public override bool VisitPointerType(PointerType pointer, TypeQualifiers quals)
533533
var finalPointee = pointer.GetFinalPointee();
534534
if (finalPointee.IsPrimitiveType())
535535
{
536-
var cppTypePrinter = new CppTypePrinter();
536+
var cppTypePrinter = new CppTypePrinter(Context.Context);
537537
var cppTypeName = pointer.Visit(cppTypePrinter, quals);
538538

539539
Context.Return.Write("({0})", cppTypeName);
@@ -602,7 +602,7 @@ public override bool VisitTypedefType(TypedefType typedef, TypeQualifiers quals)
602602
cppTypeName = "::" + typedef.Declaration.QualifiedOriginalName;
603603
else
604604
{
605-
var cppTypePrinter = new CppTypePrinter();
605+
var cppTypePrinter = new CppTypePrinter(Context.Context);
606606
cppTypeName = decl.Type.Visit(cppTypePrinter, quals);
607607
}
608608

src/Generator/Generators/CLI/CLISources.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ private void GenerateEventAdd(Event @event, Class @class)
528528
WriteLine("if (!{0}Instance)", delegateName);
529529
WriteOpenBraceAndIndent();
530530

531-
var typePrinter = new CppTypePrinter();
531+
var typePrinter = new CppTypePrinter(Context);
532532
var args = typePrinter.VisitParameters(@event.Parameters, hasNames: false);
533533

534534
WriteLine("{0}Instance = gcnew {0}(this, &{1}::_{2}Raise);",
@@ -578,7 +578,7 @@ private void GenerateEventRaise(Event @event, Class @class)
578578

579579
private void GenerateEventRaiseWrapper(Event @event, Class @class)
580580
{
581-
var typePrinter = new CppTypePrinter();
581+
var typePrinter = new CppTypePrinter(Context);
582582
var args = typePrinter.VisitParameters(@event.Parameters, hasNames: true);
583583

584584
WriteLine("void {0}::_{1}Raise({2})", QualifiedIdentifier(@class),
@@ -716,7 +716,7 @@ private bool GenerateClassConstructorBase(Class @class, Method method = null)
716716

717717
// We cast the value to the base clas type since otherwise there
718718
// could be ambiguous call to overloaded constructors.
719-
var cppTypePrinter = new CppTypePrinter();
719+
var cppTypePrinter = new CppTypePrinter(Context);
720720
var nativeTypeName = baseClass.Visit(cppTypePrinter);
721721
Write("({0}*)", nativeTypeName);
722722

@@ -968,7 +968,7 @@ public void GenerateFunctionCall(Function function, Class @class = null, Type pu
968968
function.OperatorKind == CXXOperatorKind.ExplicitConversion)
969969
{
970970
var method = function as Method;
971-
var typePrinter = new CppTypePrinter();
971+
var typePrinter = new CppTypePrinter(Context);
972972
var typeName = method.ConversionType.Visit(typePrinter);
973973
WriteLine("({0}) {1};", typeName, @params[0].Name);
974974
}
@@ -1179,7 +1179,7 @@ private ParamMarshal GenerateFunctionParamMarshal(Parameter param, int paramInde
11791179

11801180
if (isRef)
11811181
{
1182-
var typePrinter = new CppTypePrinter();
1182+
var typePrinter = new CppTypePrinter(Context);
11831183
var type = paramType.Visit(typePrinter);
11841184

11851185
if (param.IsInOut)

0 commit comments

Comments
 (0)