Skip to content

Commit 0a9a10a

Browse files
committed
Abstract some ASTConverterCodeGenerator code
1 parent 8b06502 commit 0a9a10a

File tree

4 files changed

+117
-62
lines changed

4 files changed

+117
-62
lines changed

src/CppParser/Bootstrap/Bootstrap.cs

Lines changed: 19 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -752,11 +752,14 @@ private void GenerateVisitorInterface()
752752

753753
internal abstract class ASTConverterCodeGenerator : ManagedParserCodeGenerator
754754
{
755-
readonly Enumeration StmtClassEnum;
756-
protected ASTConverterCodeGenerator(BindingContext context, IEnumerable<Declaration> declarations, Enumeration stmtClassEnum)
755+
public abstract string BaseTypeName { get; }
756+
public string ParamName => BaseTypeName.ToLowerInvariant();
757+
758+
public abstract bool IsAbstractASTNode(Class kind);
759+
760+
protected ASTConverterCodeGenerator(BindingContext context, IEnumerable<Declaration> declarations)
757761
: base(context, declarations)
758762
{
759-
StmtClassEnum = stmtClassEnum;
760763
}
761764

762765
public override void Process()
@@ -765,6 +768,7 @@ public override void Process()
765768
NewLine();
766769

767770
WriteLine("using CppSharp.Parser.AST;");
771+
NewLine();
768772
WriteLine("using static CppSharp.ConversionUtils;");
769773
NewLine();
770774

@@ -779,11 +783,9 @@ public override void Process()
779783
UnindentAndWriteCloseBrace();
780784
}
781785

782-
public virtual string BaseTypeName { get; }
786+
protected abstract void GenerateVisitorSwitch(IEnumerable<string> classes);
783787

784-
public string ParamName => BaseTypeName.ToLowerInvariant();
785-
786-
private void GenerateVisitor()
788+
protected virtual void GenerateVisitor()
787789
{
788790
var comment = new RawComment
789791
{
@@ -792,12 +794,13 @@ private void GenerateVisitor()
792794

793795
GenerateComment(comment);
794796

795-
WriteLine($"public abstract class {BaseTypeName}Visitor<TRet> where TRet : class");
797+
WriteLine($"public abstract class {BaseTypeName}Visitor<TRet>");
798+
WriteLineIndent("where TRet : class");
796799
WriteOpenBraceAndIndent();
797800

798801
var classes = Declarations
799802
.OfType<Class>()
800-
.Where(@class => !IsAbstractStmt(@class))
803+
.Where(@class => !IsAbstractASTNode(@class))
801804
.Select(@class => @class.Name)
802805
.ToArray();
803806

@@ -812,62 +815,24 @@ private void GenerateVisitor()
812815
WriteLineIndent("return default(TRet);");
813816
NewLine();
814817

815-
WriteLine($"switch({ParamName}.StmtClass)");
816-
WriteOpenBraceAndIndent();
817-
818-
var enumItems = StmtClassEnum != null ?
819-
StmtClassEnum.Items.Where(item => item.IsGenerated)
820-
.Select(item => RemoveFromEnd(item.Name, "Class"))
821-
.Where(@class => !IsAbstractStmt(@class))
822-
: new List<string>();
823-
824-
GenerateSwitchCases(StmtClassEnum != null ? enumItems : classes);
818+
GenerateVisitorSwitch(classes);
825819

826820
UnindentAndWriteCloseBrace();
827821
UnindentAndWriteCloseBrace();
828-
UnindentAndWriteCloseBrace();
829-
}
830-
831-
public virtual void GenerateSwitchCases(IEnumerable<string> classes)
832-
{
833-
foreach (var className in classes)
834-
{
835-
WriteLine($"case StmtClass.{className}:");
836-
WriteOpenBraceAndIndent();
837-
838-
WriteLine($"var _{ParamName} = {className}.__CreateInstance({ParamName}.__Instance);");
839-
840-
var isExpression = Declarations
841-
.OfType<Class>()
842-
.All(c => c.Name != className);
843-
844-
if (isExpression)
845-
WriteLine($"return VisitExpression(_{ParamName} as Expr) as TRet;");
846-
else
847-
WriteLine($"return Visit{className}(_{ParamName});");
848-
849-
UnindentAndWriteCloseBrace();
850-
}
851-
852-
WriteLine("default:");
853-
WriteLineIndent($"throw new System.NotImplementedException(" +
854-
$"{ParamName}.StmtClass.ToString());");
855822
}
856823

857824
private void GenerateConverter()
858825
{
859-
WriteLine("public unsafe class {0}Converter : {0}Visitor<AST.{0}>",
860-
BaseTypeName);
826+
WriteLine("public unsafe class {0}Converter : {0}Visitor<AST.{0}>", BaseTypeName);
861827
WriteOpenBraceAndIndent();
862828

863829
foreach (var @class in Declarations.OfType<Class>())
864830
{
865-
if (IsAbstractStmt(@class))
831+
if (IsAbstractASTNode(@class))
866832
continue;
867833

868834
PushBlock();
869-
WriteLine("public override AST.{0} Visit{1}({1} {2})",
870-
BaseTypeName, @class.Name, ParamName);
835+
WriteLine("public override AST.{0} Visit{1}({1} {2})", BaseTypeName, @class.Name, ParamName);
871836
WriteOpenBraceAndIndent();
872837

873838
var qualifiedName = $"{GetQualifiedName(@class)}";
@@ -923,8 +888,7 @@ public override bool VisitProperty(Property property)
923888
public override bool VisitMethodDecl(Method method)
924889
{
925890
var managedName = GetDeclName(method, GeneratorKind.CSharp);
926-
var nativeName = CaseRenamePass.ConvertCaseString(method,
927-
RenameCasePattern.LowerCamelCase);
891+
var nativeName = CaseRenamePass.ConvertCaseString(method, RenameCasePattern.LowerCamelCase);
928892

929893
WriteLine($"for (uint i = 0; i < {ParamName}.Get{nativeName}Count; i++)");
930894
WriteOpenBraceAndIndent();
@@ -942,7 +906,7 @@ public override bool VisitMethodDecl(Method method)
942906
return true;
943907
}
944908

945-
private void MarshalDecl(AST.Type type, string declTypeName, string bindingsName)
909+
protected virtual void MarshalDecl(AST.Type type, string declTypeName, string bindingsName)
946910
{
947911
var typeName = $"AST.{declTypeName}";
948912
if (type.TryGetEnum(out Enumeration @enum))
@@ -975,8 +939,7 @@ internal class NativeParserCodeGenerator : Generators.C.CCodeGenerator
975939
{
976940
internal readonly IEnumerable<Declaration> Declarations;
977941

978-
public NativeParserCodeGenerator(BindingContext context,
979-
IEnumerable<Declaration> declarations)
942+
public NativeParserCodeGenerator(BindingContext context, IEnumerable<Declaration> declarations)
980943
: base(context)
981944
{
982945
Declarations = declarations;

src/CppParser/Bootstrap/StmtCodeGenerators.cs

Lines changed: 92 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -445,13 +445,61 @@ public override bool VisitProperty(Property property)
445445

446446
internal class StmtASTConverterCodeGenerator : ASTConverterCodeGenerator
447447
{
448-
public StmtASTConverterCodeGenerator(BindingContext context,
449-
IEnumerable<Declaration> declarations, Enumeration stmtClassEnum)
450-
: base(context, declarations, stmtClassEnum)
448+
private readonly Enumeration StmtClassEnum;
449+
450+
public StmtASTConverterCodeGenerator(BindingContext context, IEnumerable<Declaration> declarations, Enumeration stmtClassEnum)
451+
: base(context, declarations)
451452
{
453+
StmtClassEnum = stmtClassEnum;
452454
}
453455

454456
public override string BaseTypeName => "Stmt";
457+
458+
public override bool IsAbstractASTNode(Class kind)
459+
{
460+
return CodeGeneratorHelpers.IsAbstractStmt(kind);
461+
}
462+
463+
protected override void GenerateVisitorSwitch(IEnumerable<string> classes)
464+
{
465+
WriteLine($"switch({ParamName}.StmtClass)");
466+
WriteOpenBraceAndIndent();
467+
468+
var enumItems = StmtClassEnum != null ?
469+
StmtClassEnum.Items.Where(item => item.IsGenerated)
470+
.Select(item => RemoveFromEnd(item.Name, "Class"))
471+
.Where(@class => !IsAbstractStmt(@class))
472+
: new List<string>();
473+
474+
GenerateSwitchCases(StmtClassEnum != null ? enumItems : classes);
475+
476+
UnindentAndWriteCloseBrace();
477+
}
478+
479+
private void GenerateSwitchCases(IEnumerable<string> classes)
480+
{
481+
foreach (var className in classes)
482+
{
483+
WriteLine($"case StmtClass.{className}:");
484+
WriteOpenBraceAndIndent();
485+
486+
WriteLine($"var _{ParamName} = {className}.__CreateInstance({ParamName}.__Instance);");
487+
488+
var isExpression = Declarations
489+
.OfType<Class>()
490+
.All(c => c.Name != className);
491+
492+
if (isExpression)
493+
WriteLine($"return VisitExpression(_{ParamName} as Expr) as TRet;");
494+
else
495+
WriteLine($"return Visit{className}(_{ParamName});");
496+
497+
UnindentAndWriteCloseBrace();
498+
}
499+
500+
WriteLine("default:");
501+
WriteLineIndent($"throw new System.NotImplementedException({ParamName}.StmtClass.ToString());");
502+
}
455503
}
456504

457505
internal class ExprDeclarationsCodeGenerator : StmtDeclarationsCodeGenerator
@@ -513,7 +561,7 @@ public override void GenerateIncludes()
513561
"AST::Expr* Parser::WalkExpression(const clang::Expr* Expr)";
514562
}
515563

516-
internal class ExprASTConverterCodeGenerator : ASTConverterCodeGenerator
564+
internal class ExprASTConverterCodeGenerator : StmtASTConverterCodeGenerator
517565
{
518566
public ExprASTConverterCodeGenerator(BindingContext context,
519567
IEnumerable<Declaration> declarations)
@@ -522,5 +570,45 @@ public ExprASTConverterCodeGenerator(BindingContext context,
522570
}
523571

524572
public override string BaseTypeName => "Expr";
573+
574+
public override bool IsAbstractASTNode(Class kind)
575+
{
576+
return CodeGeneratorHelpers.IsAbstractStmt(kind);
577+
}
578+
579+
protected override void GenerateVisitorSwitch(IEnumerable<string> classes)
580+
{
581+
WriteLine($"switch({ParamName}.StmtClass)");
582+
WriteOpenBraceAndIndent();
583+
584+
GenerateSwitchCases(classes);
585+
586+
UnindentAndWriteCloseBrace();
587+
}
588+
589+
private void GenerateSwitchCases(IEnumerable<string> classes)
590+
{
591+
foreach (var className in classes)
592+
{
593+
WriteLine($"case StmtClass.{className}:");
594+
WriteOpenBraceAndIndent();
595+
596+
WriteLine($"var _{ParamName} = {className}.__CreateInstance({ParamName}.__Instance);");
597+
598+
var isExpression = Declarations
599+
.OfType<Class>()
600+
.All(c => c.Name != className);
601+
602+
if (isExpression)
603+
WriteLine($"return VisitExpression(_{ParamName} as Expr) as TRet;");
604+
else
605+
WriteLine($"return Visit{className}(_{ParamName});");
606+
607+
UnindentAndWriteCloseBrace();
608+
}
609+
610+
WriteLine("default:");
611+
WriteLineIndent($"throw new System.NotImplementedException({ParamName}.StmtClass.ToString());");
612+
}
525613
}
526614
}

src/Parser/ASTConverter.Expr.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@
66
// ----------------------------------------------------------------------------
77

88
using CppSharp.Parser.AST;
9+
910
using static CppSharp.ConversionUtils;
1011

1112
namespace CppSharp
1213
{
1314
// <summary>
1415
// <para>Implements the visitor pattern for the generated expr bindings.</para>
1516
// </summary>
16-
public abstract class ExprVisitor<TRet> where TRet : class
17+
public abstract class ExprVisitor<TRet>
18+
where TRet : class
1719
{
1820
public abstract TRet VisitConstantExpr(ConstantExpr expr);
1921
public abstract TRet VisitOpaqueValueExpr(OpaqueValueExpr expr);

src/Parser/ASTConverter.Stmt.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@
66
// ----------------------------------------------------------------------------
77

88
using CppSharp.Parser.AST;
9+
910
using static CppSharp.ConversionUtils;
1011

1112
namespace CppSharp
1213
{
1314
// <summary>
1415
// <para>Implements the visitor pattern for the generated stmt bindings.</para>
1516
// </summary>
16-
public abstract class StmtVisitor<TRet> where TRet : class
17+
public abstract class StmtVisitor<TRet>
18+
where TRet : class
1719
{
1820
public abstract TRet VisitDeclStmt(DeclStmt stmt);
1921
public abstract TRet VisitNullStmt(NullStmt stmt);

0 commit comments

Comments
 (0)