| Line | Branch | Exec | Source | 
|---|---|---|---|
| 1 | // Copyright (c) 2021-2025 ChilliBits. All rights reserved. | ||
| 2 | |||
| 3 | #pragma once | ||
| 4 | |||
| 5 | #include <SpiceLexer.h> | ||
| 6 | #include <SpiceVisitor.h> | ||
| 7 | |||
| 8 | #include <CompilerPass.h> | ||
| 9 | |||
| 10 | namespace spice::compiler { | ||
| 11 | |||
| 12 | /** | ||
| 13 | * Visitor for debug purposes (is only executed in the compiler debug mode and when explicitly enabling it via cli flag) | ||
| 14 | * | ||
| 15 | * Jobs: | ||
| 16 | * - Visualize CST | ||
| 17 | */ | ||
| 18 | class CSTVisualizer final : CompilerPass, public SpiceVisitor { | ||
| 19 | public: | ||
| 20 | // Constructors | ||
| 21 | 731 | CSTVisualizer(GlobalResourceManager &resourceManager, SourceFile *sourceFile, const SpiceLexer *lexer, | |
| 22 | const SpiceParser *parser) | ||
| 23 | 3/6✓ Branch 4 → 5 taken 731 times. ✗ Branch 4 → 9 not taken. ✓ Branch 5 → 6 taken 731 times. ✗ Branch 5 → 9 not taken. ✓ Branch 6 → 7 taken 731 times. ✗ Branch 6 → 9 not taken. | 731 | : CompilerPass(resourceManager, sourceFile), vocabulary(lexer->getVocabulary()), ruleNames(parser->getRuleNames()) {} | 
| 24 | |||
| 25 | // Visitor methods | ||
| 26 | 2/4✓ Branch 2 → 3 taken 731 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 731 times. ✗ Branch 3 → 8 not taken. | 731 | std::any visitEntry(SpiceParser::EntryContext *ctx) override { return buildRule(ctx); } | 
| 27 | 2/4✓ Branch 2 → 3 taken 8 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 8 times. ✗ Branch 3 → 8 not taken. | 8 | std::any visitMainFunctionDef(SpiceParser::MainFunctionDefContext *ctx) override { return buildRule(ctx); } | 
| 28 | 2/4✓ Branch 2 → 3 taken 7470 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 7470 times. ✗ Branch 3 → 8 not taken. | 7470 | std::any visitFunctionDef(SpiceParser::FunctionDefContext *ctx) override { return buildRule(ctx); } | 
| 29 | 2/4✓ Branch 2 → 3 taken 3692 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 3692 times. ✗ Branch 3 → 8 not taken. | 3692 | std::any visitProcedureDef(SpiceParser::ProcedureDefContext *ctx) override { return buildRule(ctx); } | 
| 30 | 2/4✓ Branch 2 → 3 taken 11162 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 11162 times. ✗ Branch 3 → 8 not taken. | 11162 | std::any visitFctName(SpiceParser::FctNameContext *ctx) override { return buildRule(ctx); } | 
| 31 | 2/4✓ Branch 2 → 3 taken 857 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 857 times. ✗ Branch 3 → 8 not taken. | 857 | std::any visitGenericTypeDef(SpiceParser::GenericTypeDefContext *ctx) override { return buildRule(ctx); } | 
| 32 | 2/4✓ Branch 2 → 3 taken 62 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 62 times. ✗ Branch 3 → 8 not taken. | 62 | std::any visitAliasDef(SpiceParser::AliasDefContext *ctx) override { return buildRule(ctx); } | 
| 33 | 2/4✓ Branch 2 → 3 taken 561 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 561 times. ✗ Branch 3 → 8 not taken. | 561 | std::any visitStructDef(SpiceParser::StructDefContext *ctx) override { return buildRule(ctx); } | 
| 34 | 2/4✓ Branch 2 → 3 taken 80 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 80 times. ✗ Branch 3 → 8 not taken. | 80 | std::any visitInterfaceDef(SpiceParser::InterfaceDefContext *ctx) override { return buildRule(ctx); } | 
| 35 | 2/4✓ Branch 2 → 3 taken 59 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 59 times. ✗ Branch 3 → 8 not taken. | 59 | std::any visitEnumDef(SpiceParser::EnumDefContext *ctx) override { return buildRule(ctx); } | 
| 36 | 2/4✓ Branch 2 → 3 taken 1149 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 1149 times. ✗ Branch 3 → 8 not taken. | 1149 | std::any visitGlobalVarDef(SpiceParser::GlobalVarDefContext *ctx) override { return buildRule(ctx); } | 
| 37 | 2/4✓ Branch 2 → 3 taken 973 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 973 times. ✗ Branch 3 → 8 not taken. | 973 | std::any visitExtDecl(SpiceParser::ExtDeclContext *ctx) override { return buildRule(ctx); } | 
| 38 | 2/4✓ Branch 2 → 3 taken 465 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 465 times. ✗ Branch 3 → 8 not taken. | 465 | std::any visitImportDef(SpiceParser::ImportDefContext *ctx) override { return buildRule(ctx); } | 
| 39 | 2/4✓ Branch 2 → 3 taken 2433 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 2433 times. ✗ Branch 3 → 8 not taken. | 2433 | std::any visitUnsafeBlock(SpiceParser::UnsafeBlockContext *ctx) override { return buildRule(ctx); } | 
| 40 | 2/4✓ Branch 2 → 3 taken 1261 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 1261 times. ✗ Branch 3 → 8 not taken. | 1261 | std::any visitForLoop(SpiceParser::ForLoopContext *ctx) override { return buildRule(ctx); } | 
| 41 | 2/4✓ Branch 2 → 3 taken 1261 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 1261 times. ✗ Branch 3 → 8 not taken. | 1261 | std::any visitForHead(SpiceParser::ForHeadContext *ctx) override { return buildRule(ctx); } | 
| 42 | 2/4✓ Branch 2 → 3 taken 77 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 77 times. ✗ Branch 3 → 8 not taken. | 77 | std::any visitForeachLoop(SpiceParser::ForeachLoopContext *ctx) override { return buildRule(ctx); } | 
| 43 | 2/4✓ Branch 2 → 3 taken 77 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 77 times. ✗ Branch 3 → 8 not taken. | 77 | std::any visitForeachHead(SpiceParser::ForeachHeadContext *ctx) override { return buildRule(ctx); } | 
| 44 | 2/4✓ Branch 2 → 3 taken 730 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 730 times. ✗ Branch 3 → 8 not taken. | 730 | std::any visitWhileLoop(SpiceParser::WhileLoopContext *ctx) override { return buildRule(ctx); } | 
| 45 | 2/4✓ Branch 2 → 3 taken 3 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 3 times. ✗ Branch 3 → 8 not taken. | 3 | std::any visitDoWhileLoop(SpiceParser::DoWhileLoopContext *ctx) override { return buildRule(ctx); } | 
| 46 | 2/4✓ Branch 2 → 3 taken 3989 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 3989 times. ✗ Branch 3 → 8 not taken. | 3989 | std::any visitIfStmt(SpiceParser::IfStmtContext *ctx) override { return buildRule(ctx); } | 
| 47 | 2/4✓ Branch 2 → 3 taken 228 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 228 times. ✗ Branch 3 → 8 not taken. | 228 | std::any visitElseStmt(SpiceParser::ElseStmtContext *ctx) override { return buildRule(ctx); } | 
| 48 | 2/4✓ Branch 2 → 3 taken 5 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 5 times. ✗ Branch 3 → 8 not taken. | 5 | std::any visitSwitchStmt(SpiceParser::SwitchStmtContext *ctx) override { return buildRule(ctx); } | 
| 49 | 2/4✓ Branch 2 → 3 taken 31 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 31 times. ✗ Branch 3 → 8 not taken. | 31 | std::any visitCaseBranch(SpiceParser::CaseBranchContext *ctx) override { return buildRule(ctx); } | 
| 50 | 2/4✓ Branch 2 → 3 taken 3 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 3 times. ✗ Branch 3 → 8 not taken. | 3 | std::any visitDefaultBranch(SpiceParser::DefaultBranchContext *ctx) override { return buildRule(ctx); } | 
| 51 | 2/4✓ Branch 2 → 3 taken 105 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 105 times. ✗ Branch 3 → 8 not taken. | 105 | std::any visitAssertStmt(SpiceParser::AssertStmtContext *ctx) override { return buildRule(ctx); } | 
| 52 | ✗ | std::any visitAnonymousBlockStmt(SpiceParser::AnonymousBlockStmtContext *ctx) override { return buildRule(ctx); } | |
| 53 | 2/4✓ Branch 2 → 3 taken 19864 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 19864 times. ✗ Branch 3 → 8 not taken. | 19864 | std::any visitStmtLst(SpiceParser::StmtLstContext *ctx) override { return buildRule(ctx); } | 
| 54 | 2/4✓ Branch 2 → 3 taken 1261 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 1261 times. ✗ Branch 3 → 8 not taken. | 1261 | std::any visitField(SpiceParser::FieldContext *ctx) override { return buildRule(ctx); } | 
| 55 | 2/4✓ Branch 2 → 3 taken 200 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 200 times. ✗ Branch 3 → 8 not taken. | 200 | std::any visitSignature(SpiceParser::SignatureContext *ctx) override { return buildRule(ctx); } | 
| 56 | 2/4✓ Branch 2 → 3 taken 6483 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 6483 times. ✗ Branch 3 → 8 not taken. | 6483 | std::any visitTypeLst(SpiceParser::TypeLstContext *ctx) override { return buildRule(ctx); } | 
| 57 | 2/4✓ Branch 2 → 3 taken 933 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 933 times. ✗ Branch 3 → 8 not taken. | 933 | std::any visitTypeLstWithEllipsis(SpiceParser::TypeLstWithEllipsisContext *ctx) override { return buildRule(ctx); } | 
| 58 | 2/4✓ Branch 2 → 3 taken 857 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 857 times. ✗ Branch 3 → 8 not taken. | 857 | std::any visitTypeAltsLst(SpiceParser::TypeAltsLstContext *ctx) override { return buildRule(ctx); } | 
| 59 | 2/4✓ Branch 2 → 3 taken 8558 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 8558 times. ✗ Branch 3 → 8 not taken. | 8558 | std::any visitParamLst(SpiceParser::ParamLstContext *ctx) override { return buildRule(ctx); } | 
| 60 | 2/4✓ Branch 2 → 3 taken 11123 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 11123 times. ✗ Branch 3 → 8 not taken. | 11123 | std::any visitArgLst(SpiceParser::ArgLstContext *ctx) override { return buildRule(ctx); } | 
| 61 | 2/4✓ Branch 2 → 3 taken 59 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 59 times. ✗ Branch 3 → 8 not taken. | 59 | std::any visitEnumItemLst(SpiceParser::EnumItemLstContext *ctx) override { return buildRule(ctx); } | 
| 62 | 2/4✓ Branch 2 → 3 taken 713 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 713 times. ✗ Branch 3 → 8 not taken. | 713 | std::any visitEnumItem(SpiceParser::EnumItemContext *ctx) override { return buildRule(ctx); } | 
| 63 | 2/4✓ Branch 2 → 3 taken 26205 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 26205 times. ✗ Branch 3 → 8 not taken. | 26205 | std::any visitStmt(SpiceParser::StmtContext *ctx) override { return buildRule(ctx); } | 
| 64 | 2/4✓ Branch 2 → 3 taken 18655 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 18655 times. ✗ Branch 3 → 8 not taken. | 18655 | std::any visitDeclStmt(SpiceParser::DeclStmtContext *ctx) override { return buildRule(ctx); } | 
| 65 | 2/4✓ Branch 2 → 3 taken 12448 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 12448 times. ✗ Branch 3 → 8 not taken. | 12448 | std::any visitExprStmt(SpiceParser::ExprStmtContext *ctx) override { return buildRule(ctx); } | 
| 66 | 2/4✓ Branch 2 → 3 taken 29427 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 29427 times. ✗ Branch 3 → 8 not taken. | 29427 | std::any visitQualifierLst(SpiceParser::QualifierLstContext *ctx) override { return buildRule(ctx); } | 
| 67 | 2/4✓ Branch 2 → 3 taken 35572 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 35572 times. ✗ Branch 3 → 8 not taken. | 35572 | std::any visitQualifier(SpiceParser::QualifierContext *ctx) override { return buildRule(ctx); } | 
| 68 | 2/4✓ Branch 2 → 3 taken 333 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 333 times. ✗ Branch 3 → 8 not taken. | 333 | std::any visitModAttr(SpiceParser::ModAttrContext *ctx) override { return buildRule(ctx); } | 
| 69 | 2/4✓ Branch 2 → 3 taken 423 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 423 times. ✗ Branch 3 → 8 not taken. | 423 | std::any visitTopLevelDefAttr(SpiceParser::TopLevelDefAttrContext *ctx) override { return buildRule(ctx); } | 
| 70 | 2/4✓ Branch 2 → 3 taken 1 time. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 1 time. ✗ Branch 3 → 8 not taken. | 1 | std::any visitLambdaAttr(SpiceParser::LambdaAttrContext *ctx) override { return buildRule(ctx); } | 
| 71 | 2/4✓ Branch 2 → 3 taken 757 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 757 times. ✗ Branch 3 → 8 not taken. | 757 | std::any visitAttrLst(SpiceParser::AttrLstContext *ctx) override { return buildRule(ctx); } | 
| 72 | 2/4✓ Branch 2 → 3 taken 1196 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 1196 times. ✗ Branch 3 → 8 not taken. | 1196 | std::any visitAttr(SpiceParser::AttrContext *ctx) override { return buildRule(ctx); } | 
| 73 | 2/4✓ Branch 2 → 3 taken 48 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 48 times. ✗ Branch 3 → 8 not taken. | 48 | std::any visitCaseConstant(SpiceParser::CaseConstantContext *ctx) override { return buildRule(ctx); } | 
| 74 | 2/4✓ Branch 2 → 3 taken 9014 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 9014 times. ✗ Branch 3 → 8 not taken. | 9014 | std::any visitReturnStmt(SpiceParser::ReturnStmtContext *ctx) override { return buildRule(ctx); } | 
| 75 | 2/4✓ Branch 2 → 3 taken 105 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 105 times. ✗ Branch 3 → 8 not taken. | 105 | std::any visitBreakStmt(SpiceParser::BreakStmtContext *ctx) override { return buildRule(ctx); } | 
| 76 | 2/4✓ Branch 2 → 3 taken 184 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 184 times. ✗ Branch 3 → 8 not taken. | 184 | std::any visitContinueStmt(SpiceParser::ContinueStmtContext *ctx) override { return buildRule(ctx); } | 
| 77 | ✗ | std::any visitFallthroughStmt(SpiceParser::FallthroughStmtContext *ctx) override { return buildRule(ctx); } | |
| 78 | 2/4✓ Branch 2 → 3 taken 1449 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 1449 times. ✗ Branch 3 → 8 not taken. | 1449 | std::any visitBuiltinCall(SpiceParser::BuiltinCallContext *ctx) override { return buildRule(ctx); } | 
| 79 | 2/4✓ Branch 2 → 3 taken 180 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 180 times. ✗ Branch 3 → 8 not taken. | 180 | std::any visitPrintfCall(SpiceParser::PrintfCallContext *ctx) override { return buildRule(ctx); } | 
| 80 | 2/4✓ Branch 2 → 3 taken 238 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 238 times. ✗ Branch 3 → 8 not taken. | 238 | std::any visitSizeOfCall(SpiceParser::SizeOfCallContext *ctx) override { return buildRule(ctx); } | 
| 81 | ✗ | std::any visitAlignOfCall(SpiceParser::AlignOfCallContext *ctx) override { return buildRule(ctx); } | |
| 82 | ✗ | std::any visitTypeIdCall(SpiceParser::TypeIdCallContext *ctx) override { return buildRule(ctx); } | |
| 83 | 2/4✓ Branch 2 → 3 taken 110 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 110 times. ✗ Branch 3 → 8 not taken. | 110 | std::any visitLenCall(SpiceParser::LenCallContext *ctx) override { return buildRule(ctx); } | 
| 84 | 2/4✓ Branch 2 → 3 taken 921 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 921 times. ✗ Branch 3 → 8 not taken. | 921 | std::any visitPanicCall(SpiceParser::PanicCallContext *ctx) override { return buildRule(ctx); } | 
| 85 | ✗ | std::any visitSysCall(SpiceParser::SysCallContext *ctx) override { return buildRule(ctx); } | |
| 86 | 2/4✓ Branch 2 → 3 taken 67349 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 67349 times. ✗ Branch 3 → 8 not taken. | 67349 | std::any visitAssignExpr(SpiceParser::AssignExprContext *ctx) override { return buildRule(ctx); } | 
| 87 | 2/4✓ Branch 2 → 3 taken 60297 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 60297 times. ✗ Branch 3 → 8 not taken. | 60297 | std::any visitTernaryExpr(SpiceParser::TernaryExprContext *ctx) override { return buildRule(ctx); } | 
| 88 | 2/4✓ Branch 2 → 3 taken 61099 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 61099 times. ✗ Branch 3 → 8 not taken. | 61099 | std::any visitLogicalOrExpr(SpiceParser::LogicalOrExprContext *ctx) override { return buildRule(ctx); } | 
| 89 | 2/4✓ Branch 2 → 3 taken 62318 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 62318 times. ✗ Branch 3 → 8 not taken. | 62318 | std::any visitLogicalAndExpr(SpiceParser::LogicalAndExprContext *ctx) override { return buildRule(ctx); } | 
| 90 | 2/4✓ Branch 2 → 3 taken 62575 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 62575 times. ✗ Branch 3 → 8 not taken. | 62575 | std::any visitBitwiseOrExpr(SpiceParser::BitwiseOrExprContext *ctx) override { return buildRule(ctx); } | 
| 91 | 2/4✓ Branch 2 → 3 taken 62650 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 62650 times. ✗ Branch 3 → 8 not taken. | 62650 | std::any visitBitwiseXorExpr(SpiceParser::BitwiseXorExprContext *ctx) override { return buildRule(ctx); } | 
| 92 | 2/4✓ Branch 2 → 3 taken 62657 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 62657 times. ✗ Branch 3 → 8 not taken. | 62657 | std::any visitBitwiseAndExpr(SpiceParser::BitwiseAndExprContext *ctx) override { return buildRule(ctx); } | 
| 93 | 2/4✓ Branch 2 → 3 taken 62674 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 62674 times. ✗ Branch 3 → 8 not taken. | 62674 | std::any visitEqualityExpr(SpiceParser::EqualityExprContext *ctx) override { return buildRule(ctx); } | 
| 94 | 2/4✓ Branch 2 → 3 taken 67207 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 67207 times. ✗ Branch 3 → 8 not taken. | 67207 | std::any visitRelationalExpr(SpiceParser::RelationalExprContext *ctx) override { return buildRule(ctx); } | 
| 95 | 2/4✓ Branch 2 → 3 taken 70847 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 70847 times. ✗ Branch 3 → 8 not taken. | 70847 | std::any visitShiftExpr(SpiceParser::ShiftExprContext *ctx) override { return buildRule(ctx); } | 
| 96 | 2/4✓ Branch 2 → 3 taken 70954 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 70954 times. ✗ Branch 3 → 8 not taken. | 70954 | std::any visitAdditiveExpr(SpiceParser::AdditiveExprContext *ctx) override { return buildRule(ctx); } | 
| 97 | 2/4✓ Branch 2 → 3 taken 74821 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 74821 times. ✗ Branch 3 → 8 not taken. | 74821 | std::any visitMultiplicativeExpr(SpiceParser::MultiplicativeExprContext *ctx) override { return buildRule(ctx); } | 
| 98 | 2/4✓ Branch 2 → 3 taken 76060 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 76060 times. ✗ Branch 3 → 8 not taken. | 76060 | std::any visitCastExpr(SpiceParser::CastExprContext *ctx) override { return buildRule(ctx); } | 
| 99 | 2/4✓ Branch 2 → 3 taken 81783 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 81783 times. ✗ Branch 3 → 8 not taken. | 81783 | std::any visitPrefixUnaryExpr(SpiceParser::PrefixUnaryExprContext *ctx) override { return buildRule(ctx); } | 
| 100 | 2/4✓ Branch 2 → 3 taken 103938 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 103938 times. ✗ Branch 3 → 8 not taken. | 103938 | std::any visitPostfixUnaryExpr(SpiceParser::PostfixUnaryExprContext *ctx) override { return buildRule(ctx); } | 
| 101 | 2/4✓ Branch 2 → 3 taken 80732 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 80732 times. ✗ Branch 3 → 8 not taken. | 80732 | std::any visitAtomicExpr(SpiceParser::AtomicExprContext *ctx) override { return buildRule(ctx); } | 
| 102 | 2/4✓ Branch 2 → 3 taken 15709 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 15709 times. ✗ Branch 3 → 8 not taken. | 15709 | std::any visitValue(SpiceParser::ValueContext *ctx) override { return buildRule(ctx); } | 
| 103 | 2/4✓ Branch 2 → 3 taken 14108 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 14108 times. ✗ Branch 3 → 8 not taken. | 14108 | std::any visitFctCall(SpiceParser::FctCallContext *ctx) override { return buildRule(ctx); } | 
| 104 | 2/4✓ Branch 2 → 3 taken 9 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 9 times. ✗ Branch 3 → 8 not taken. | 9 | std::any visitArrayInitialization(SpiceParser::ArrayInitializationContext *ctx) override { return buildRule(ctx); } | 
| 105 | 2/4✓ Branch 2 → 3 taken 167 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 167 times. ✗ Branch 3 → 8 not taken. | 167 | std::any visitStructInstantiation(SpiceParser::StructInstantiationContext *ctx) override { return buildRule(ctx); } | 
| 106 | ✗ | std::any visitLambdaFunc(SpiceParser::LambdaFuncContext *ctx) override { return buildRule(ctx); } | |
| 107 | 2/4✓ Branch 2 → 3 taken 2 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 2 times. ✗ Branch 3 → 8 not taken. | 2 | std::any visitLambdaProc(SpiceParser::LambdaProcContext *ctx) override { return buildRule(ctx); } | 
| 108 | ✗ | std::any visitLambdaExpr(SpiceParser::LambdaExprContext *ctx) override { return buildRule(ctx); } | |
| 109 | 2/4✓ Branch 2 → 3 taken 14694 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 14694 times. ✗ Branch 3 → 8 not taken. | 14694 | std::any visitConstant(SpiceParser::ConstantContext *ctx) override { return buildRule(ctx); } | 
| 110 | 2/4✓ Branch 2 → 3 taken 44035 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 44035 times. ✗ Branch 3 → 8 not taken. | 44035 | std::any visitDataType(SpiceParser::DataTypeContext *ctx) override { return buildRule(ctx); } | 
| 111 | 2/4✓ Branch 2 → 3 taken 44035 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 44035 times. ✗ Branch 3 → 8 not taken. | 44035 | std::any visitBaseDataType(SpiceParser::BaseDataTypeContext *ctx) override { return buildRule(ctx); } | 
| 112 | 2/4✓ Branch 2 → 3 taken 16738 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 16738 times. ✗ Branch 3 → 8 not taken. | 16738 | std::any visitCustomDataType(SpiceParser::CustomDataTypeContext *ctx) override { return buildRule(ctx); } | 
| 113 | 2/4✓ Branch 2 → 3 taken 50 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 50 times. ✗ Branch 3 → 8 not taken. | 50 | std::any visitFunctionDataType(SpiceParser::FunctionDataTypeContext *ctx) override { return buildRule(ctx); } | 
| 114 | 2/4✓ Branch 2 → 3 taken 7228 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 7228 times. ✗ Branch 3 → 8 not taken. | 7228 | std::any visitAssignOp(SpiceParser::AssignOpContext *ctx) override { return buildRule(ctx); } | 
| 115 | 2/4✓ Branch 2 → 3 taken 1654 times. ✗ Branch 2 → 10 not taken. ✓ Branch 3 → 4 taken 1654 times. ✗ Branch 3 → 8 not taken. | 1654 | std::any visitOverloadableOp(SpiceParser::OverloadableOpContext *ctx) override { return buildRule(ctx); } | 
| 116 | |||
| 117 | private: | ||
| 118 | // Members | ||
| 119 | const antlr4::dfa::Vocabulary &vocabulary; | ||
| 120 | const std::vector<std::string> ruleNames; | ||
| 121 | int currentTabs = 1; | ||
| 122 | std::string parentNodeId; | ||
| 123 | |||
| 124 | // Private methods | ||
| 125 | std::string buildRule(antlr4::ParserRuleContext *ctx); | ||
| 126 | [[nodiscard]] std::string getSpaces() const; | ||
| 127 | [[nodiscard]] static std::string tokenToCodeLoc(const antlr4::Token &token); | ||
| 128 | }; | ||
| 129 | |||
| 130 | } // namespace spice::compiler | ||
| 131 |