GCC Code Coverage Report


Directory: ../
File: src/ast/ASTBuilder.cpp
Date: 2025-09-17 22:53:38
Exec Total Coverage
Lines: 1109 1140 97.3%
Functions: 104 104 100.0%
Branches: 1543 2555 60.4%

Line Branch Exec Source
1 // Copyright (c) 2021-2025 ChilliBits. All rights reserved.
2
3 #include "ASTBuilder.h"
4
5 #include <regex>
6
7 #include <SourceFile.h>
8 #include <ast/ASTNodes.h>
9 #include <ast/Attributes.h>
10 #include <exception/ParserError.h>
11 #include <typechecker/OpRuleManager.h>
12 #include <util/GlobalDefinitions.h>
13
14 namespace spice::compiler {
15
16 1113 ASTBuilder::ASTBuilder(GlobalResourceManager &resourceManager, SourceFile *sourceFile, antlr4::ANTLRInputStream *inputStream)
17
1/2
✓ Branch 0 (4→5) taken 1113 times.
✗ Branch 1 (4→6) not taken.
1113 : CompilerPass(resourceManager, sourceFile), inputStream(inputStream) {}
18
19 1111 std::any ASTBuilder::visitEntry(SpiceParser::EntryContext *ctx) {
20 1111 const auto entryNode = createNode<EntryNode>(ctx);
21
22 // Visit children
23
2/2
✓ Branch 0 (127→5) taken 17380 times.
✓ Branch 1 (127→128) taken 1105 times.
18485 for (ParserRuleContext::ParseTree *child : ctx->children) {
24
3/4
✓ Branch 0 (6→7) taken 17380 times.
✗ Branch 1 (6→8) not taken.
✓ Branch 2 (9→10) taken 405 times.
✓ Branch 3 (9→15) taken 16975 times.
17380 if (auto *mainFctDefCtx = dynamic_cast<SpiceParser::MainFunctionDefContext *>(child))
25
4/6
✓ Branch 0 (10→11) taken 401 times.
✓ Branch 1 (10→140) taken 4 times.
✓ Branch 2 (11→12) taken 401 times.
✗ Branch 3 (11→138) not taken.
✓ Branch 4 (12→13) taken 401 times.
✗ Branch 5 (12→138) not taken.
405 entryNode->topLevelDefs.push_back(std::any_cast<MainFctDefNode *>(visit(mainFctDefCtx)));
26
3/4
✓ Branch 0 (15→16) taken 16975 times.
✗ Branch 1 (15→17) not taken.
✓ Branch 2 (18→19) taken 7397 times.
✓ Branch 3 (18→24) taken 9578 times.
16975 else if (auto *fctDefCtx = dynamic_cast<SpiceParser::FunctionDefContext *>(child))
27
3/6
✓ Branch 0 (19→20) taken 7397 times.
✗ Branch 1 (19→144) not taken.
✓ Branch 2 (20→21) taken 7397 times.
✗ Branch 3 (20→142) not taken.
✓ Branch 4 (21→22) taken 7397 times.
✗ Branch 5 (21→142) not taken.
7397 entryNode->topLevelDefs.push_back(std::any_cast<FctDefNode *>(visit(fctDefCtx)));
28
3/4
✓ Branch 0 (24→25) taken 9578 times.
✗ Branch 1 (24→26) not taken.
✓ Branch 2 (27→28) taken 3680 times.
✓ Branch 3 (27→33) taken 5898 times.
9578 else if (auto *procDefCtx = dynamic_cast<SpiceParser::ProcedureDefContext *>(child))
29
3/6
✓ Branch 0 (28→29) taken 3680 times.
✗ Branch 1 (28→148) not taken.
✓ Branch 2 (29→30) taken 3680 times.
✗ Branch 3 (29→146) not taken.
✓ Branch 4 (30→31) taken 3680 times.
✗ Branch 5 (30→146) not taken.
3680 entryNode->topLevelDefs.push_back(std::any_cast<ProcDefNode *>(visit(procDefCtx)));
30
3/4
✓ Branch 0 (33→34) taken 5898 times.
✗ Branch 1 (33→35) not taken.
✓ Branch 2 (36→37) taken 659 times.
✓ Branch 3 (36→42) taken 5239 times.
5898 else if (auto *structDefCtx = dynamic_cast<SpiceParser::StructDefContext *>(child))
31
4/6
✓ Branch 0 (37→38) taken 658 times.
✓ Branch 1 (37→152) taken 1 times.
✓ Branch 2 (38→39) taken 658 times.
✗ Branch 3 (38→150) not taken.
✓ Branch 4 (39→40) taken 658 times.
✗ Branch 5 (39→150) not taken.
659 entryNode->topLevelDefs.push_back(std::any_cast<StructDefNode *>(visit(structDefCtx)));
32
3/4
✓ Branch 0 (42→43) taken 5239 times.
✗ Branch 1 (42→44) not taken.
✓ Branch 2 (45→46) taken 93 times.
✓ Branch 3 (45→51) taken 5146 times.
5239 else if (auto *interfaceDefCtx = dynamic_cast<SpiceParser::InterfaceDefContext *>(child))
33
3/6
✓ Branch 0 (46→47) taken 93 times.
✗ Branch 1 (46→156) not taken.
✓ Branch 2 (47→48) taken 93 times.
✗ Branch 3 (47→154) not taken.
✓ Branch 4 (48→49) taken 93 times.
✗ Branch 5 (48→154) not taken.
93 entryNode->topLevelDefs.push_back(std::any_cast<InterfaceDefNode *>(visit(interfaceDefCtx)));
34
3/4
✓ Branch 0 (51→52) taken 5146 times.
✗ Branch 1 (51→53) not taken.
✓ Branch 2 (54→55) taken 67 times.
✓ Branch 3 (54→60) taken 5079 times.
5146 else if (auto *enumDefCtx = dynamic_cast<SpiceParser::EnumDefContext *>(child))
35
3/6
✓ Branch 0 (55→56) taken 67 times.
✗ Branch 1 (55→160) not taken.
✓ Branch 2 (56→57) taken 67 times.
✗ Branch 3 (56→158) not taken.
✓ Branch 4 (57→58) taken 67 times.
✗ Branch 5 (57→158) not taken.
67 entryNode->topLevelDefs.push_back(std::any_cast<EnumDefNode *>(visit(enumDefCtx)));
36
3/4
✓ Branch 0 (60→61) taken 5079 times.
✗ Branch 1 (60→62) not taken.
✓ Branch 2 (63→64) taken 877 times.
✓ Branch 3 (63→69) taken 4202 times.
5079 else if (auto *genericTypeDefCtx = dynamic_cast<SpiceParser::GenericTypeDefContext *>(child))
37
3/6
✓ Branch 0 (64→65) taken 877 times.
✗ Branch 1 (64→164) not taken.
✓ Branch 2 (65→66) taken 877 times.
✗ Branch 3 (65→162) not taken.
✓ Branch 4 (66→67) taken 877 times.
✗ Branch 5 (66→162) not taken.
877 entryNode->topLevelDefs.push_back(std::any_cast<GenericTypeDefNode *>(visit(genericTypeDefCtx)));
38
3/4
✓ Branch 0 (69→70) taken 4202 times.
✗ Branch 1 (69→71) not taken.
✓ Branch 2 (72→73) taken 69 times.
✓ Branch 3 (72→78) taken 4133 times.
4202 else if (auto *aliasDefCtx = dynamic_cast<SpiceParser::AliasDefContext *>(child))
39
3/6
✓ Branch 0 (73→74) taken 69 times.
✗ Branch 1 (73→168) not taken.
✓ Branch 2 (74→75) taken 69 times.
✗ Branch 3 (74→166) not taken.
✓ Branch 4 (75→76) taken 69 times.
✗ Branch 5 (75→166) not taken.
69 entryNode->topLevelDefs.push_back(std::any_cast<AliasDefNode *>(visit(aliasDefCtx)));
40
3/4
✓ Branch 0 (78→79) taken 4133 times.
✗ Branch 1 (78→80) not taken.
✓ Branch 2 (81→82) taken 1171 times.
✓ Branch 3 (81→87) taken 2962 times.
4133 else if (auto *globalVarDefCtx = dynamic_cast<SpiceParser::GlobalVarDefContext *>(child))
41
3/6
✓ Branch 0 (82→83) taken 1171 times.
✗ Branch 1 (82→172) not taken.
✓ Branch 2 (83→84) taken 1171 times.
✗ Branch 3 (83→170) not taken.
✓ Branch 4 (84→85) taken 1171 times.
✗ Branch 5 (84→170) not taken.
1171 entryNode->topLevelDefs.push_back(std::any_cast<GlobalVarDefNode *>(visit(globalVarDefCtx)));
42
3/4
✓ Branch 0 (87→88) taken 2962 times.
✗ Branch 1 (87→89) not taken.
✓ Branch 2 (90→91) taken 580 times.
✓ Branch 3 (90→96) taken 2382 times.
2962 else if (auto *importDefCtx = dynamic_cast<SpiceParser::ImportDefContext *>(child))
43
3/6
✓ Branch 0 (91→92) taken 580 times.
✗ Branch 1 (91→176) not taken.
✓ Branch 2 (92→93) taken 580 times.
✗ Branch 3 (92→174) not taken.
✓ Branch 4 (93→94) taken 580 times.
✗ Branch 5 (93→174) not taken.
580 entryNode->importDefs.push_back(std::any_cast<ImportDefNode *>(visit(importDefCtx)));
44
3/4
✓ Branch 0 (96→97) taken 2382 times.
✗ Branch 1 (96→98) not taken.
✓ Branch 2 (99→100) taken 954 times.
✓ Branch 3 (99→105) taken 1428 times.
2382 else if (auto *extDeclCtx = dynamic_cast<SpiceParser::ExtDeclContext *>(child))
45
3/6
✓ Branch 0 (100→101) taken 954 times.
✗ Branch 1 (100→180) not taken.
✓ Branch 2 (101→102) taken 954 times.
✗ Branch 3 (101→178) not taken.
✓ Branch 4 (102→103) taken 954 times.
✗ Branch 5 (102→178) not taken.
954 entryNode->topLevelDefs.push_back(std::any_cast<ExtDeclNode *>(visit(extDeclCtx)));
46
3/4
✓ Branch 0 (105→106) taken 1428 times.
✗ Branch 1 (105→107) not taken.
✓ Branch 2 (108→109) taken 323 times.
✓ Branch 3 (108→114) taken 1105 times.
1428 else if (auto *modAttrCtx = dynamic_cast<SpiceParser::ModAttrContext *>(child))
47
4/6
✓ Branch 0 (109→110) taken 322 times.
✓ Branch 1 (109→184) taken 1 times.
✓ Branch 2 (110→111) taken 322 times.
✗ Branch 3 (110→182) not taken.
✓ Branch 4 (111→112) taken 322 times.
✗ Branch 5 (111→182) not taken.
323 entryNode->modAttrs.push_back(std::any_cast<ModAttrNode *>(visit(modAttrCtx)));
48
1/2
✓ Branch 0 (114→115) taken 1105 times.
✗ Branch 1 (114→116) not taken.
1105 else if (const auto *eofCtx = dynamic_cast<TerminalNode *>(child);
49
5/10
✓ Branch 0 (117→118) taken 1105 times.
✗ Branch 1 (117→121) not taken.
✓ Branch 2 (118→119) taken 1105 times.
✗ Branch 3 (118→186) not taken.
✓ Branch 4 (119→120) taken 1105 times.
✗ Branch 5 (119→186) not taken.
✗ Branch 6 (120→121) not taken.
✓ Branch 7 (120→122) taken 1105 times.
✗ Branch 8 (123→124) not taken.
✓ Branch 9 (123→125) taken 1105 times.
1105 !eofCtx || eofCtx->getSymbol()->getType() != SpiceParser::EOF)
50 assert_fail("Unknown top level definition type"); // GCOV_EXCL_LINE
51 }
52
53
1/2
✓ Branch 0 (134→135) taken 1105 times.
✗ Branch 1 (134→187) not taken.
1105 return concludeNode(entryNode);
54 }
55
56 405 std::any ASTBuilder::visitMainFunctionDef(SpiceParser::MainFunctionDefContext *ctx) {
57 405 const auto mainFctDefNode = createNode<MainFctDefNode>(ctx);
58
59 // Visit children
60
2/2
✓ Branch 0 (4→5) taken 1 times.
✓ Branch 1 (4→10) taken 404 times.
405 if (ctx->topLevelDefAttr())
61
3/6
✓ Branch 0 (5→6) taken 1 times.
✗ Branch 1 (5→33) not taken.
✓ Branch 2 (6→7) taken 1 times.
✗ Branch 3 (6→33) not taken.
✓ Branch 4 (7→8) taken 1 times.
✗ Branch 5 (7→31) not taken.
1 mainFctDefNode->attrs = std::any_cast<TopLevelDefinitionAttrNode *>(visit(ctx->topLevelDefAttr()));
62
2/2
✓ Branch 0 (11→12) taken 4 times.
✓ Branch 1 (11→17) taken 401 times.
405 if (ctx->paramLst()) {
63 4 mainFctDefNode->takesArgs = true;
64
3/6
✓ Branch 0 (12→13) taken 4 times.
✗ Branch 1 (12→36) not taken.
✓ Branch 2 (13→14) taken 4 times.
✗ Branch 3 (13→36) not taken.
✓ Branch 4 (14→15) taken 4 times.
✗ Branch 5 (14→34) not taken.
4 mainFctDefNode->paramLst = std::any_cast<ParamLstNode *>(visit(ctx->paramLst()));
65 }
66
4/6
✓ Branch 0 (17→18) taken 405 times.
✗ Branch 1 (17→39) not taken.
✓ Branch 2 (18→19) taken 401 times.
✓ Branch 3 (18→39) taken 4 times.
✓ Branch 4 (19→20) taken 401 times.
✗ Branch 5 (19→37) not taken.
405 mainFctDefNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
67
68
1/2
✓ Branch 0 (27→28) taken 401 times.
✗ Branch 1 (27→40) not taken.
401 return concludeNode(mainFctDefNode);
69 }
70
71 7397 std::any ASTBuilder::visitFunctionDef(SpiceParser::FunctionDefContext *ctx) {
72 7397 const auto fctDefNode = createNode<FctDefNode>(ctx);
73
74 // Visit children
75
2/2
✓ Branch 0 (4→5) taken 306 times.
✓ Branch 1 (4→16) taken 7091 times.
7397 if (ctx->topLevelDefAttr()) {
76
3/6
✓ Branch 0 (5→6) taken 306 times.
✗ Branch 1 (5→62) not taken.
✓ Branch 2 (6→7) taken 306 times.
✗ Branch 3 (6→62) not taken.
✓ Branch 4 (7→8) taken 306 times.
✗ Branch 5 (7→60) not taken.
306 fctDefNode->attrs = std::any_cast<TopLevelDefinitionAttrNode *>(visit(ctx->topLevelDefAttr()));
77 // Tell the attributes that they are function attributes
78
2/2
✓ Branch 0 (14→11) taken 311 times.
✓ Branch 1 (14→15) taken 306 times.
617 for (AttrNode *attr : fctDefNode->attrs->attrLst->attributes)
79 311 attr->target = AttrNode::TARGET_FCT_PROC;
80 }
81
2/2
✓ Branch 0 (17→18) taken 7221 times.
✓ Branch 1 (17→23) taken 176 times.
7397 if (ctx->qualifierLst())
82
3/6
✓ Branch 0 (18→19) taken 7221 times.
✗ Branch 1 (18→65) not taken.
✓ Branch 2 (19→20) taken 7221 times.
✗ Branch 3 (19→65) not taken.
✓ Branch 4 (20→21) taken 7221 times.
✗ Branch 5 (20→63) not taken.
7221 fctDefNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
83
3/6
✓ Branch 0 (23→24) taken 7397 times.
✗ Branch 1 (23→68) not taken.
✓ Branch 2 (24→25) taken 7397 times.
✗ Branch 3 (24→68) not taken.
✓ Branch 4 (25→26) taken 7397 times.
✗ Branch 5 (25→66) not taken.
7397 fctDefNode->returnType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
84 7397 fctDefNode->returnType->isReturnType = true;
85
3/6
✓ Branch 0 (27→28) taken 7397 times.
✗ Branch 1 (27→71) not taken.
✓ Branch 2 (28→29) taken 7397 times.
✗ Branch 3 (28→71) not taken.
✓ Branch 4 (29→30) taken 7397 times.
✗ Branch 5 (29→69) not taken.
7397 fctDefNode->name = std::any_cast<FctNameNode *>(visit(ctx->fctName()));
86 7397 fctDefNode->isMethod = fctDefNode->name->nameFragments.size() > 1;
87
2/2
✓ Branch 0 (33→34) taken 943 times.
✓ Branch 1 (33→39) taken 6454 times.
7397 if (ctx->typeLst()) {
88 943 fctDefNode->hasTemplateTypes = true;
89
3/6
✓ Branch 0 (34→35) taken 943 times.
✗ Branch 1 (34→74) not taken.
✓ Branch 2 (35→36) taken 943 times.
✗ Branch 3 (35→74) not taken.
✓ Branch 4 (36→37) taken 943 times.
✗ Branch 5 (36→72) not taken.
943 fctDefNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
90 }
91
2/2
✓ Branch 0 (40→41) taken 5738 times.
✓ Branch 1 (40→46) taken 1659 times.
7397 if (ctx->paramLst()) {
92 5738 fctDefNode->hasParams = true;
93
3/6
✓ Branch 0 (41→42) taken 5738 times.
✗ Branch 1 (41→77) not taken.
✓ Branch 2 (42→43) taken 5738 times.
✗ Branch 3 (42→77) not taken.
✓ Branch 4 (43→44) taken 5738 times.
✗ Branch 5 (43→75) not taken.
5738 fctDefNode->paramLst = std::any_cast<ParamLstNode *>(visit(ctx->paramLst()));
94 }
95
3/6
✓ Branch 0 (46→47) taken 7397 times.
✗ Branch 1 (46→80) not taken.
✓ Branch 2 (47→48) taken 7397 times.
✗ Branch 3 (47→80) not taken.
✓ Branch 4 (48→49) taken 7397 times.
✗ Branch 5 (48→78) not taken.
7397 fctDefNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
96
97
1/2
✓ Branch 0 (56→57) taken 7397 times.
✗ Branch 1 (56→81) not taken.
7397 return concludeNode(fctDefNode);
98 }
99
100 3680 std::any ASTBuilder::visitProcedureDef(SpiceParser::ProcedureDefContext *ctx) {
101 3680 const auto procDefNode = createNode<ProcDefNode>(ctx);
102
103 // Visit children
104
2/2
✓ Branch 0 (4→5) taken 1 times.
✓ Branch 1 (4→16) taken 3679 times.
3680 if (ctx->topLevelDefAttr()) {
105
3/6
✓ Branch 0 (5→6) taken 1 times.
✗ Branch 1 (5→58) not taken.
✓ Branch 2 (6→7) taken 1 times.
✗ Branch 3 (6→58) not taken.
✓ Branch 4 (7→8) taken 1 times.
✗ Branch 5 (7→56) not taken.
1 procDefNode->attrs = std::any_cast<TopLevelDefinitionAttrNode *>(visit(ctx->topLevelDefAttr()));
106 // Tell the attributes that they are function attributes
107
2/2
✓ Branch 0 (14→11) taken 1 times.
✓ Branch 1 (14→15) taken 1 times.
2 for (AttrNode *attr : procDefNode->attrs->attrLst->attributes)
108 1 attr->target = AttrNode::TARGET_FCT_PROC;
109 }
110
2/2
✓ Branch 0 (17→18) taken 3267 times.
✓ Branch 1 (17→23) taken 413 times.
3680 if (ctx->qualifierLst())
111
3/6
✓ Branch 0 (18→19) taken 3267 times.
✗ Branch 1 (18→61) not taken.
✓ Branch 2 (19→20) taken 3267 times.
✗ Branch 3 (19→61) not taken.
✓ Branch 4 (20→21) taken 3267 times.
✗ Branch 5 (20→59) not taken.
3267 procDefNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
112
3/6
✓ Branch 0 (23→24) taken 3680 times.
✗ Branch 1 (23→64) not taken.
✓ Branch 2 (24→25) taken 3680 times.
✗ Branch 3 (24→64) not taken.
✓ Branch 4 (25→26) taken 3680 times.
✗ Branch 5 (25→62) not taken.
3680 procDefNode->name = std::any_cast<FctNameNode *>(visit(ctx->fctName()));
113 3680 procDefNode->isMethod = procDefNode->name->nameFragments.size() > 1;
114
2/2
✓ Branch 0 (29→30) taken 998 times.
✓ Branch 1 (29→35) taken 2682 times.
3680 if (ctx->typeLst()) {
115 998 procDefNode->hasTemplateTypes = true;
116
3/6
✓ Branch 0 (30→31) taken 998 times.
✗ Branch 1 (30→67) not taken.
✓ Branch 2 (31→32) taken 998 times.
✗ Branch 3 (31→67) not taken.
✓ Branch 4 (32→33) taken 998 times.
✗ Branch 5 (32→65) not taken.
998 procDefNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
117 }
118
2/2
✓ Branch 0 (36→37) taken 2725 times.
✓ Branch 1 (36→42) taken 955 times.
3680 if (ctx->paramLst()) {
119 2725 procDefNode->hasParams = true;
120
3/6
✓ Branch 0 (37→38) taken 2725 times.
✗ Branch 1 (37→70) not taken.
✓ Branch 2 (38→39) taken 2725 times.
✗ Branch 3 (38→70) not taken.
✓ Branch 4 (39→40) taken 2725 times.
✗ Branch 5 (39→68) not taken.
2725 procDefNode->paramLst = std::any_cast<ParamLstNode *>(visit(ctx->paramLst()));
121 }
122
3/6
✓ Branch 0 (42→43) taken 3680 times.
✗ Branch 1 (42→73) not taken.
✓ Branch 2 (43→44) taken 3680 times.
✗ Branch 3 (43→73) not taken.
✓ Branch 4 (44→45) taken 3680 times.
✗ Branch 5 (44→71) not taken.
3680 procDefNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
123
124
1/2
✓ Branch 0 (52→53) taken 3680 times.
✗ Branch 1 (52→74) not taken.
3680 return concludeNode(procDefNode);
125 }
126
127 11077 std::any ASTBuilder::visitFctName(SpiceParser::FctNameContext *ctx) {
128 11077 const auto fctNameNode = createNode<FctNameNode>(ctx);
129
130 // Extract function name
131
2/2
✓ Branch 0 (4→5) taken 6078 times.
✓ Branch 1 (4→14) taken 4999 times.
11077 if (ctx->TYPE_IDENTIFIER()) {
132
2/4
✓ Branch 0 (5→6) taken 6078 times.
✗ Branch 1 (5→42) not taken.
✓ Branch 2 (6→7) taken 6078 times.
✗ Branch 3 (6→42) not taken.
6078 const std::string typeIdentifier = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
133
1/2
✓ Branch 0 (7→8) taken 6078 times.
✗ Branch 1 (7→40) not taken.
6078 fctNameNode->structName = typeIdentifier;
134
1/2
✓ Branch 0 (8→9) taken 6078 times.
✗ Branch 1 (8→39) not taken.
6078 fctNameNode->fqName = typeIdentifier + MEMBER_ACCESS_TOKEN;
135
1/2
✓ Branch 0 (11→12) taken 6078 times.
✗ Branch 1 (11→40) not taken.
6078 fctNameNode->nameFragments.push_back(typeIdentifier);
136 6078 }
137
2/2
✓ Branch 0 (15→16) taken 9437 times.
✓ Branch 1 (15→23) taken 1640 times.
11077 if (ctx->IDENTIFIER()) {
138
2/4
✓ Branch 0 (16→17) taken 9437 times.
✗ Branch 1 (16→45) not taken.
✓ Branch 2 (17→18) taken 9437 times.
✗ Branch 3 (17→45) not taken.
9437 const std::string fctIdentifier = getIdentifier(ctx->IDENTIFIER(), false);
139
1/2
✓ Branch 0 (18→19) taken 9437 times.
✗ Branch 1 (18→43) not taken.
9437 fctNameNode->name = fctIdentifier;
140
1/2
✓ Branch 0 (19→20) taken 9437 times.
✗ Branch 1 (19→43) not taken.
9437 fctNameNode->fqName += fctIdentifier;
141
1/2
✓ Branch 0 (20→21) taken 9437 times.
✗ Branch 1 (20→43) not taken.
9437 fctNameNode->nameFragments.push_back(fctIdentifier);
142 9437 }
143
144 // Visit children
145
2/2
✓ Branch 0 (24→25) taken 1640 times.
✓ Branch 1 (24→29) taken 9437 times.
11077 if (ctx->overloadableOp())
146
2/4
✓ Branch 0 (25→26) taken 1640 times.
✗ Branch 1 (25→46) not taken.
✓ Branch 2 (26→27) taken 1640 times.
✗ Branch 3 (26→46) not taken.
1640 visit(ctx->overloadableOp());
147
148
1/2
✓ Branch 0 (35→36) taken 11077 times.
✗ Branch 1 (35→47) not taken.
11077 return concludeNode(fctNameNode);
149 }
150
151 659 std::any ASTBuilder::visitStructDef(SpiceParser::StructDefContext *ctx) {
152 659 const auto structDefNode = createNode<StructDefNode>(ctx);
153
154 // Enrich
155
3/4
✓ Branch 0 (3→4) taken 659 times.
✗ Branch 1 (3→87) not taken.
✓ Branch 2 (4→5) taken 658 times.
✓ Branch 3 (4→87) taken 1 times.
659 structDefNode->structName = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
156 658 structDefNode->typeId = resourceManager.getNextCustomTypeId();
157
158 // Visit children
159
2/2
✓ Branch 0 (9→10) taken 57 times.
✓ Branch 1 (9→41) taken 601 times.
658 if (ctx->topLevelDefAttr()) {
160
3/6
✓ Branch 0 (10→11) taken 57 times.
✗ Branch 1 (10→90) not taken.
✓ Branch 2 (11→12) taken 57 times.
✗ Branch 3 (11→90) not taken.
✓ Branch 4 (12→13) taken 57 times.
✗ Branch 5 (12→88) not taken.
57 structDefNode->attrs = std::any_cast<TopLevelDefinitionAttrNode *>(visit(ctx->topLevelDefAttr()));
161
162 // Tell the attributes that they are struct attributes
163
2/2
✓ Branch 0 (19→16) taken 57 times.
✓ Branch 1 (19→20) taken 57 times.
114 for (AttrNode *attr : structDefNode->attrs->attrLst->attributes)
164 57 attr->target = AttrNode::TARGET_STRUCT;
165
166 // Check if a custom type id was set
167
7/18
✓ Branch 0 (20→21) taken 57 times.
✗ Branch 1 (20→27) not taken.
✓ Branch 2 (23→24) taken 57 times.
✗ Branch 3 (23→91) not taken.
✓ Branch 4 (24→25) taken 57 times.
✗ Branch 5 (24→91) not taken.
✗ Branch 6 (25→26) not taken.
✓ Branch 7 (25→27) taken 57 times.
✓ Branch 8 (28→29) taken 57 times.
✗ Branch 9 (28→30) not taken.
✓ Branch 10 (30→31) taken 57 times.
✗ Branch 11 (30→33) not taken.
✗ Branch 12 (33→34) not taken.
✓ Branch 13 (33→41) taken 57 times.
✗ Branch 14 (91→92) not taken.
✗ Branch 15 (91→93) not taken.
✗ Branch 16 (95→96) not taken.
✗ Branch 17 (95→98) not taken.
171 if (structDefNode->attrs && structDefNode->attrs->attrLst->hasAttr(ATTR_CORE_COMPILER_FIXED_TYPE_ID))
168 structDefNode->typeId = structDefNode->attrs->attrLst->getAttrValueByName(ATTR_CORE_COMPILER_FIXED_TYPE_ID)->intValue;
169 }
170
2/2
✓ Branch 0 (42→43) taken 509 times.
✓ Branch 1 (42→48) taken 149 times.
658 if (ctx->qualifierLst())
171
3/6
✓ Branch 0 (43→44) taken 509 times.
✗ Branch 1 (43→108) not taken.
✓ Branch 2 (44→45) taken 509 times.
✗ Branch 3 (44→108) not taken.
✓ Branch 4 (45→46) taken 509 times.
✗ Branch 5 (45→106) not taken.
509 structDefNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
172
2/2
✓ Branch 0 (49→50) taken 228 times.
✓ Branch 1 (49→55) taken 430 times.
658 if (ctx->LESS()) {
173 228 structDefNode->hasTemplateTypes = true;
174
3/6
✓ Branch 0 (50→51) taken 228 times.
✗ Branch 1 (50→111) not taken.
✓ Branch 2 (51→52) taken 228 times.
✗ Branch 3 (51→111) not taken.
✓ Branch 4 (52→53) taken 228 times.
✗ Branch 5 (52→109) not taken.
228 structDefNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst(0)));
175 }
176
2/2
✓ Branch 0 (56→57) taken 122 times.
✓ Branch 1 (56→65) taken 536 times.
658 if (ctx->COLON()) {
177 122 structDefNode->hasInterfaces = true;
178
5/8
✓ Branch 0 (57→58) taken 103 times.
✓ Branch 1 (57→59) taken 19 times.
✓ Branch 2 (60→61) taken 122 times.
✗ Branch 3 (60→114) not taken.
✓ Branch 4 (61→62) taken 122 times.
✗ Branch 5 (61→114) not taken.
✓ Branch 6 (62→63) taken 122 times.
✗ Branch 7 (62→112) not taken.
122 structDefNode->interfaceTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst(structDefNode->hasTemplateTypes ? 1 : 0)));
179 }
180
3/4
✓ Branch 0 (65→66) taken 658 times.
✗ Branch 1 (65→121) not taken.
✓ Branch 2 (75→68) taken 1419 times.
✓ Branch 3 (75→76) taken 658 times.
2077 for (SpiceParser::FieldContext *field : ctx->field())
181
3/6
✓ Branch 0 (69→70) taken 1419 times.
✗ Branch 1 (69→117) not taken.
✓ Branch 2 (70→71) taken 1419 times.
✗ Branch 3 (70→115) not taken.
✓ Branch 4 (71→72) taken 1419 times.
✗ Branch 5 (71→115) not taken.
2077 structDefNode->fields.push_back(std::any_cast<FieldNode *>(visit(field)));
182
183
1/2
✓ Branch 0 (83→84) taken 658 times.
✗ Branch 1 (83→122) not taken.
658 return concludeNode(structDefNode);
184 }
185
186 93 std::any ASTBuilder::visitInterfaceDef(SpiceParser::InterfaceDefContext *ctx) {
187 93 const auto interfaceDefNode = createNode<InterfaceDefNode>(ctx);
188
189 // Enrich
190
2/4
✓ Branch 0 (3→4) taken 93 times.
✗ Branch 1 (3→77) not taken.
✓ Branch 2 (4→5) taken 93 times.
✗ Branch 3 (4→77) not taken.
93 interfaceDefNode->interfaceName = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
191 93 interfaceDefNode->typeId = resourceManager.getNextCustomTypeId();
192
193 // Visit children
194
2/2
✓ Branch 0 (9→10) taken 65 times.
✓ Branch 1 (9→41) taken 28 times.
93 if (ctx->topLevelDefAttr()) {
195
3/6
✓ Branch 0 (10→11) taken 65 times.
✗ Branch 1 (10→80) not taken.
✓ Branch 2 (11→12) taken 65 times.
✗ Branch 3 (11→80) not taken.
✓ Branch 4 (12→13) taken 65 times.
✗ Branch 5 (12→78) not taken.
65 interfaceDefNode->attrs = std::any_cast<TopLevelDefinitionAttrNode *>(visit(ctx->topLevelDefAttr()));
196
197 // Tell the attributes that they are struct attributes
198
2/2
✓ Branch 0 (19→16) taken 65 times.
✓ Branch 1 (19→20) taken 65 times.
130 for (AttrNode *attr : interfaceDefNode->attrs->attrLst->attributes)
199 65 attr->target = AttrNode::TARGET_INTERFACE;
200
201 // Check if a custom type id was set
202
7/18
✓ Branch 0 (20→21) taken 65 times.
✗ Branch 1 (20→27) not taken.
✓ Branch 2 (23→24) taken 65 times.
✗ Branch 3 (23→81) not taken.
✓ Branch 4 (24→25) taken 65 times.
✗ Branch 5 (24→81) not taken.
✓ Branch 6 (25→26) taken 65 times.
✗ Branch 7 (25→27) not taken.
✓ Branch 8 (28→29) taken 65 times.
✗ Branch 9 (28→30) not taken.
✓ Branch 10 (30→31) taken 65 times.
✗ Branch 11 (30→33) not taken.
✓ Branch 12 (33→34) taken 65 times.
✗ Branch 13 (33→41) not taken.
✗ Branch 14 (81→82) not taken.
✗ Branch 15 (81→83) not taken.
✗ Branch 16 (85→86) not taken.
✗ Branch 17 (85→88) not taken.
195 if (interfaceDefNode->attrs && interfaceDefNode->attrs->attrLst->hasAttr(ATTR_CORE_COMPILER_FIXED_TYPE_ID))
203
2/4
✓ Branch 0 (36→37) taken 65 times.
✗ Branch 1 (36→92) not taken.
✓ Branch 2 (37→38) taken 65 times.
✗ Branch 3 (37→90) not taken.
195 interfaceDefNode->typeId = interfaceDefNode->attrs->attrLst->getAttrValueByName(ATTR_CORE_COMPILER_FIXED_TYPE_ID)->intValue;
204 }
205
2/2
✓ Branch 0 (42→43) taken 77 times.
✓ Branch 1 (42→48) taken 16 times.
93 if (ctx->qualifierLst())
206
3/6
✓ Branch 0 (43→44) taken 77 times.
✗ Branch 1 (43→98) not taken.
✓ Branch 2 (44→45) taken 77 times.
✗ Branch 3 (44→98) not taken.
✓ Branch 4 (45→46) taken 77 times.
✗ Branch 5 (45→96) not taken.
77 interfaceDefNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
207
2/2
✓ Branch 0 (49→50) taken 68 times.
✓ Branch 1 (49→55) taken 25 times.
93 if (ctx->LESS()) {
208 68 interfaceDefNode->hasTemplateTypes = true;
209
3/6
✓ Branch 0 (50→51) taken 68 times.
✗ Branch 1 (50→101) not taken.
✓ Branch 2 (51→52) taken 68 times.
✗ Branch 3 (51→101) not taken.
✓ Branch 4 (52→53) taken 68 times.
✗ Branch 5 (52→99) not taken.
68 interfaceDefNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
210 }
211
3/4
✓ Branch 0 (55→56) taken 93 times.
✗ Branch 1 (55→108) not taken.
✓ Branch 2 (65→58) taken 211 times.
✓ Branch 3 (65→66) taken 93 times.
304 for (SpiceParser::SignatureContext *signature : ctx->signature())
212
3/6
✓ Branch 0 (59→60) taken 211 times.
✗ Branch 1 (59→104) not taken.
✓ Branch 2 (60→61) taken 211 times.
✗ Branch 3 (60→102) not taken.
✓ Branch 4 (61→62) taken 211 times.
✗ Branch 5 (61→102) not taken.
304 interfaceDefNode->signatures.push_back(std::any_cast<SignatureNode *>(visit(signature)));
213
214
1/2
✓ Branch 0 (73→74) taken 93 times.
✗ Branch 1 (73→109) not taken.
93 return concludeNode(interfaceDefNode);
215 }
216
217 67 std::any ASTBuilder::visitEnumDef(SpiceParser::EnumDefContext *ctx) {
218 67 const auto enumDefNode = createNode<EnumDefNode>(ctx);
219
220 // Enrich
221
2/4
✓ Branch 0 (3→4) taken 67 times.
✗ Branch 1 (3→35) not taken.
✓ Branch 2 (4→5) taken 67 times.
✗ Branch 3 (4→35) not taken.
67 enumDefNode->enumName = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
222 67 enumDefNode->typeId = resourceManager.getNextCustomTypeId();
223
224 // Visit children
225
2/2
✓ Branch 0 (9→10) taken 52 times.
✓ Branch 1 (9→15) taken 15 times.
67 if (ctx->qualifierLst())
226
3/6
✓ Branch 0 (10→11) taken 52 times.
✗ Branch 1 (10→38) not taken.
✓ Branch 2 (11→12) taken 52 times.
✗ Branch 3 (11→38) not taken.
✓ Branch 4 (12→13) taken 52 times.
✗ Branch 5 (12→36) not taken.
52 enumDefNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
227
3/6
✓ Branch 0 (15→16) taken 67 times.
✗ Branch 1 (15→41) not taken.
✓ Branch 2 (16→17) taken 67 times.
✗ Branch 3 (16→41) not taken.
✓ Branch 4 (17→18) taken 67 times.
✗ Branch 5 (17→39) not taken.
67 enumDefNode->itemLst = std::any_cast<EnumItemLstNode *>(visit(ctx->enumItemLst()));
228
229 // Tell all items about the enum def
230
2/2
✓ Branch 0 (24→21) taken 744 times.
✓ Branch 1 (24→25) taken 67 times.
811 for (EnumItemNode *enumItem : enumDefNode->itemLst->items)
231 744 enumItem->enumDef = enumDefNode;
232
233
1/2
✓ Branch 0 (31→32) taken 67 times.
✗ Branch 1 (31→42) not taken.
67 return concludeNode(enumDefNode);
234 }
235
236 877 std::any ASTBuilder::visitGenericTypeDef(SpiceParser::GenericTypeDefContext *ctx) {
237 877 const auto genericTypeDefNode = createNode<GenericTypeDefNode>(ctx);
238
239 // Enrich
240
2/4
✓ Branch 0 (3→4) taken 877 times.
✗ Branch 1 (3→21) not taken.
✓ Branch 2 (4→5) taken 877 times.
✗ Branch 3 (4→21) not taken.
877 genericTypeDefNode->typeName = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
241
242 // Visit children
243
3/6
✓ Branch 0 (7→8) taken 877 times.
✗ Branch 1 (7→24) not taken.
✓ Branch 2 (8→9) taken 877 times.
✗ Branch 3 (8→24) not taken.
✓ Branch 4 (9→10) taken 877 times.
✗ Branch 5 (9→22) not taken.
877 genericTypeDefNode->typeAltsLst = std::any_cast<TypeAltsLstNode *>(visit(ctx->typeAltsLst()));
244
245
1/2
✓ Branch 0 (17→18) taken 877 times.
✗ Branch 1 (17→25) not taken.
877 return concludeNode(genericTypeDefNode);
246 }
247
248 69 std::any ASTBuilder::visitAliasDef(SpiceParser::AliasDefContext *ctx) {
249 69 const auto aliasDefNode = createNode<AliasDefNode>(ctx);
250
251 // Enrich
252
2/4
✓ Branch 0 (3→4) taken 69 times.
✗ Branch 1 (3→33) not taken.
✓ Branch 2 (4→5) taken 69 times.
✗ Branch 3 (4→33) not taken.
69 aliasDefNode->aliasName = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
253
2/4
✓ Branch 0 (7→8) taken 69 times.
✗ Branch 1 (7→34) not taken.
✓ Branch 2 (8→9) taken 69 times.
✗ Branch 3 (8→34) not taken.
69 aliasDefNode->dataTypeString = ctx->dataType()->getText();
254 69 aliasDefNode->typeId = resourceManager.getNextCustomTypeId();
255
256 // Visit children
257
2/2
✓ Branch 0 (13→14) taken 21 times.
✓ Branch 1 (13→19) taken 48 times.
69 if (ctx->qualifierLst())
258
3/6
✓ Branch 0 (14→15) taken 21 times.
✗ Branch 1 (14→37) not taken.
✓ Branch 2 (15→16) taken 21 times.
✗ Branch 3 (15→37) not taken.
✓ Branch 4 (16→17) taken 21 times.
✗ Branch 5 (16→35) not taken.
21 aliasDefNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
259
3/6
✓ Branch 0 (19→20) taken 69 times.
✗ Branch 1 (19→40) not taken.
✓ Branch 2 (20→21) taken 69 times.
✗ Branch 3 (20→40) not taken.
✓ Branch 4 (21→22) taken 69 times.
✗ Branch 5 (21→38) not taken.
69 aliasDefNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
260
261
1/2
✓ Branch 0 (29→30) taken 69 times.
✗ Branch 1 (29→41) not taken.
69 return concludeNode(aliasDefNode);
262 }
263
264 1171 std::any ASTBuilder::visitGlobalVarDef(SpiceParser::GlobalVarDefContext *ctx) {
265 1171 const auto globalVarDefNode = createNode<GlobalVarDefNode>(ctx);
266
267 // Enrich
268
2/4
✓ Branch 0 (3→4) taken 1171 times.
✗ Branch 1 (3→28) not taken.
✓ Branch 2 (4→5) taken 1171 times.
✗ Branch 3 (4→28) not taken.
1171 globalVarDefNode->varName = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
269
270 // Visit children
271
3/6
✓ Branch 0 (7→8) taken 1171 times.
✗ Branch 1 (7→31) not taken.
✓ Branch 2 (8→9) taken 1171 times.
✗ Branch 3 (8→31) not taken.
✓ Branch 4 (9→10) taken 1171 times.
✗ Branch 5 (9→29) not taken.
1171 globalVarDefNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
272 1171 globalVarDefNode->dataType->isGlobalType = true;
273
2/2
✓ Branch 0 (12→13) taken 1169 times.
✓ Branch 1 (12→18) taken 2 times.
1171 if (ctx->constant()) {
274 1169 globalVarDefNode->hasValue = true;
275
3/6
✓ Branch 0 (13→14) taken 1169 times.
✗ Branch 1 (13→34) not taken.
✓ Branch 2 (14→15) taken 1169 times.
✗ Branch 3 (14→34) not taken.
✓ Branch 4 (15→16) taken 1169 times.
✗ Branch 5 (15→32) not taken.
1169 globalVarDefNode->constant = std::any_cast<ConstantNode *>(visit(ctx->constant()));
276 }
277
278
1/2
✓ Branch 0 (24→25) taken 1171 times.
✗ Branch 1 (24→35) not taken.
1171 return concludeNode(globalVarDefNode);
279 }
280
281 954 std::any ASTBuilder::visitExtDecl(SpiceParser::ExtDeclContext *ctx) {
282 954 const auto extDeclNode = createNode<ExtDeclNode>(ctx);
283
284 // Enrich
285
6/10
✓ Branch 0 (3→4) taken 954 times.
✗ Branch 1 (3→49) not taken.
✓ Branch 2 (4→5) taken 712 times.
✓ Branch 3 (4→7) taken 242 times.
✓ Branch 4 (5→6) taken 712 times.
✗ Branch 5 (5→49) not taken.
✓ Branch 6 (7→8) taken 242 times.
✗ Branch 7 (7→49) not taken.
✓ Branch 8 (9→10) taken 954 times.
✗ Branch 9 (9→49) not taken.
954 extDeclNode->extFunctionName = getIdentifier(ctx->IDENTIFIER() ? ctx->IDENTIFIER() : ctx->TYPE_IDENTIFIER(), false);
286
287 // Visit children
288
2/2
✓ Branch 0 (13→14) taken 1 times.
✓ Branch 1 (13→25) taken 953 times.
954 if (ctx->topLevelDefAttr()) {
289
3/6
✓ Branch 0 (14→15) taken 1 times.
✗ Branch 1 (14→52) not taken.
✓ Branch 2 (15→16) taken 1 times.
✗ Branch 3 (15→52) not taken.
✓ Branch 4 (16→17) taken 1 times.
✗ Branch 5 (16→50) not taken.
1 extDeclNode->attrs = std::any_cast<TopLevelDefinitionAttrNode *>(visit(ctx->topLevelDefAttr()));
290
291 // Tell the attributes that they are ext decl attributes
292
2/2
✓ Branch 0 (23→20) taken 1 times.
✓ Branch 1 (23→24) taken 1 times.
2 for (AttrNode *attr : extDeclNode->attrs->attrLst->attributes)
293 1 attr->target = AttrNode::TARGET_EXT_DECL;
294 }
295
2/2
✓ Branch 0 (26→27) taken 634 times.
✓ Branch 1 (26→32) taken 320 times.
954 if (ctx->F()) {
296
3/6
✓ Branch 0 (27→28) taken 634 times.
✗ Branch 1 (27→55) not taken.
✓ Branch 2 (28→29) taken 634 times.
✗ Branch 3 (28→55) not taken.
✓ Branch 4 (29→30) taken 634 times.
✗ Branch 5 (29→53) not taken.
634 extDeclNode->returnType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
297 634 extDeclNode->returnType->isReturnType = true;
298 }
299
2/2
✓ Branch 0 (33→34) taken 914 times.
✓ Branch 1 (33→39) taken 40 times.
954 if (ctx->typeLstWithEllipsis()) {
300 914 extDeclNode->hasArgs = true;
301
3/6
✓ Branch 0 (34→35) taken 914 times.
✗ Branch 1 (34→58) not taken.
✓ Branch 2 (35→36) taken 914 times.
✗ Branch 3 (35→58) not taken.
✓ Branch 4 (36→37) taken 914 times.
✗ Branch 5 (36→56) not taken.
914 extDeclNode->argTypeLst = std::any_cast<TypeLstWithEllipsisNode *>(visit(ctx->typeLstWithEllipsis()));
302 }
303
304
1/2
✓ Branch 0 (45→46) taken 954 times.
✗ Branch 1 (45→59) not taken.
954 return concludeNode(extDeclNode);
305 }
306
307 580 std::any ASTBuilder::visitImportDef(SpiceParser::ImportDefContext *ctx) {
308
1/2
✓ Branch 0 (2→3) taken 580 times.
✗ Branch 1 (2→32) not taken.
580 const auto importDefNode = createNode<ImportDefNode>(ctx);
309
310 // Extract path
311
2/4
✓ Branch 0 (3→4) taken 580 times.
✗ Branch 1 (3→32) not taken.
✓ Branch 2 (4→5) taken 580 times.
✗ Branch 3 (4→32) not taken.
580 const std::string pathStr = ctx->STRING_LIT()->getText();
312
1/2
✓ Branch 0 (6→7) taken 580 times.
✗ Branch 1 (6→27) not taken.
580 importDefNode->importPath = pathStr.substr(1, pathStr.size() - 2);
313
314 // If no name is given, use the path as name
315
6/10
✓ Branch 0 (9→10) taken 580 times.
✗ Branch 1 (9→28) not taken.
✓ Branch 2 (10→11) taken 33 times.
✓ Branch 3 (10→13) taken 547 times.
✓ Branch 4 (11→12) taken 33 times.
✗ Branch 5 (11→28) not taken.
✓ Branch 6 (12→14) taken 33 times.
✗ Branch 7 (12→28) not taken.
✓ Branch 8 (13→14) taken 547 times.
✗ Branch 9 (13→28) not taken.
580 importDefNode->importName = ctx->AS() ? getIdentifier(ctx->IDENTIFIER(), false) : importDefNode->importPath;
316
317
1/2
✓ Branch 0 (22→23) taken 580 times.
✗ Branch 1 (22→29) not taken.
1160 return concludeNode(importDefNode);
318 580 }
319
320 2403 std::any ASTBuilder::visitUnsafeBlock(SpiceParser::UnsafeBlockContext *ctx) {
321 2403 const auto unsafeBlockDefNode = createNode<UnsafeBlockNode>(ctx);
322
323 // Visit children
324
3/6
✓ Branch 0 (3→4) taken 2403 times.
✗ Branch 1 (3→19) not taken.
✓ Branch 2 (4→5) taken 2403 times.
✗ Branch 3 (4→19) not taken.
✓ Branch 4 (5→6) taken 2403 times.
✗ Branch 5 (5→17) not taken.
2403 unsafeBlockDefNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
325
326
1/2
✓ Branch 0 (13→14) taken 2403 times.
✗ Branch 1 (13→20) not taken.
2403 return concludeNode(unsafeBlockDefNode);
327 }
328
329 1295 std::any ASTBuilder::visitForLoop(SpiceParser::ForLoopContext *ctx) {
330 1295 const auto forLoopNode = createNode<ForLoopNode>(ctx);
331
332
2/4
✓ Branch 0 (3→4) taken 1295 times.
✗ Branch 1 (3→20) not taken.
✓ Branch 2 (4→5) taken 1295 times.
✗ Branch 3 (4→20) not taken.
1295 visit(ctx->forHead());
333
3/6
✓ Branch 0 (6→7) taken 1295 times.
✗ Branch 1 (6→23) not taken.
✓ Branch 2 (7→8) taken 1295 times.
✗ Branch 3 (7→23) not taken.
✓ Branch 4 (8→9) taken 1295 times.
✗ Branch 5 (8→21) not taken.
1295 forLoopNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
334
335
1/2
✓ Branch 0 (16→17) taken 1295 times.
✗ Branch 1 (16→24) not taken.
1295 return concludeNode(forLoopNode);
336 }
337
338 1295 std::any ASTBuilder::visitForHead(SpiceParser::ForHeadContext *ctx) {
339 1295 const auto forLoopNode = resumeForExpansion<ForLoopNode>();
340
341 // Visit children
342
3/6
✓ Branch 0 (12→13) taken 1295 times.
✗ Branch 1 (12→29) not taken.
✓ Branch 2 (13→14) taken 1295 times.
✗ Branch 3 (13→29) not taken.
✓ Branch 4 (14→15) taken 1295 times.
✗ Branch 5 (14→27) not taken.
1295 forLoopNode->initDecl = std::any_cast<DeclStmtNode *>(visit(ctx->declStmt()));
343
3/6
✓ Branch 0 (16→17) taken 1295 times.
✗ Branch 1 (16→32) not taken.
✓ Branch 2 (17→18) taken 1295 times.
✗ Branch 3 (17→32) not taken.
✓ Branch 4 (18→19) taken 1295 times.
✗ Branch 5 (18→30) not taken.
1295 forLoopNode->condAssign = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr(0)));
344
3/6
✓ Branch 0 (20→21) taken 1295 times.
✗ Branch 1 (20→35) not taken.
✓ Branch 2 (21→22) taken 1295 times.
✗ Branch 3 (21→35) not taken.
✓ Branch 4 (22→23) taken 1295 times.
✗ Branch 5 (22→33) not taken.
1295 forLoopNode->incAssign = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr(1)));
345
346
1/2
✓ Branch 0 (24→25) taken 1295 times.
✗ Branch 1 (24→36) not taken.
1295 return nullptr;
347 }
348
349 117 std::any ASTBuilder::visitForeachLoop(SpiceParser::ForeachLoopContext *ctx) {
350 117 const auto foreachLoopNode = createNode<ForeachLoopNode>(ctx);
351
352 // Visit children
353
2/4
✓ Branch 0 (3→4) taken 117 times.
✗ Branch 1 (3→20) not taken.
✓ Branch 2 (4→5) taken 117 times.
✗ Branch 3 (4→20) not taken.
117 visit(ctx->foreachHead());
354
3/6
✓ Branch 0 (6→7) taken 117 times.
✗ Branch 1 (6→23) not taken.
✓ Branch 2 (7→8) taken 117 times.
✗ Branch 3 (7→23) not taken.
✓ Branch 4 (8→9) taken 117 times.
✗ Branch 5 (8→21) not taken.
117 foreachLoopNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
355
356 // Tell the foreach item that it is one
357 117 foreachLoopNode->itemVarDecl->isForEachItem = true;
358
359
1/2
✓ Branch 0 (16→17) taken 117 times.
✗ Branch 1 (16→24) not taken.
117 return concludeNode(foreachLoopNode);
360 }
361
362 117 std::any ASTBuilder::visitForeachHead(SpiceParser::ForeachHeadContext *ctx) {
363 117 const auto foreachLoopNode = resumeForExpansion<ForeachLoopNode>();
364
365 // Visit children
366
3/4
✓ Branch 0 (12→13) taken 117 times.
✗ Branch 1 (12→42) not taken.
✓ Branch 2 (15→16) taken 111 times.
✓ Branch 3 (15→21) taken 6 times.
117 if (ctx->declStmt().size() == 1) {
367
3/6
✓ Branch 0 (16→17) taken 111 times.
✗ Branch 1 (16→45) not taken.
✓ Branch 2 (17→18) taken 111 times.
✗ Branch 3 (17→45) not taken.
✓ Branch 4 (18→19) taken 111 times.
✗ Branch 5 (18→43) not taken.
111 foreachLoopNode->itemVarDecl = std::any_cast<DeclStmtNode *>(visit(ctx->declStmt(0)));
368
2/4
✓ Branch 0 (21→22) taken 6 times.
✗ Branch 1 (21→46) not taken.
✓ Branch 2 (24→25) taken 6 times.
✗ Branch 3 (24→34) not taken.
6 } else if (ctx->declStmt().size() == 2) {
369
3/6
✓ Branch 0 (25→26) taken 6 times.
✗ Branch 1 (25→49) not taken.
✓ Branch 2 (26→27) taken 6 times.
✗ Branch 3 (26→49) not taken.
✓ Branch 4 (27→28) taken 6 times.
✗ Branch 5 (27→47) not taken.
6 foreachLoopNode->idxVarDecl = std::any_cast<DeclStmtNode *>(visit(ctx->declStmt(0)));
370
3/6
✓ Branch 0 (29→30) taken 6 times.
✗ Branch 1 (29→52) not taken.
✓ Branch 2 (30→31) taken 6 times.
✗ Branch 3 (30→52) not taken.
✓ Branch 4 (31→32) taken 6 times.
✗ Branch 5 (31→50) not taken.
6 foreachLoopNode->itemVarDecl = std::any_cast<DeclStmtNode *>(visit(ctx->declStmt(1)));
371 } else {
372 assert_fail("Invalid number of decl statements in foreach loop"); // GCOV_EXCL_LINE
373 }
374
3/6
✓ Branch 0 (35→36) taken 117 times.
✗ Branch 1 (35→55) not taken.
✓ Branch 2 (36→37) taken 117 times.
✗ Branch 3 (36→55) not taken.
✓ Branch 4 (37→38) taken 117 times.
✗ Branch 5 (37→53) not taken.
117 foreachLoopNode->iteratorAssign = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
375
376
1/2
✓ Branch 0 (39→40) taken 117 times.
✗ Branch 1 (39→56) not taken.
117 return nullptr;
377 }
378
379 729 std::any ASTBuilder::visitWhileLoop(SpiceParser::WhileLoopContext *ctx) {
380 729 const auto whileLoopNode = createNode<WhileLoopNode>(ctx);
381
382 // Visit children
383
3/6
✓ Branch 0 (3→4) taken 729 times.
✗ Branch 1 (3→23) not taken.
✓ Branch 2 (4→5) taken 729 times.
✗ Branch 3 (4→23) not taken.
✓ Branch 4 (5→6) taken 729 times.
✗ Branch 5 (5→21) not taken.
729 whileLoopNode->condition = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
384
3/6
✓ Branch 0 (7→8) taken 729 times.
✗ Branch 1 (7→26) not taken.
✓ Branch 2 (8→9) taken 729 times.
✗ Branch 3 (8→26) not taken.
✓ Branch 4 (9→10) taken 729 times.
✗ Branch 5 (9→24) not taken.
729 whileLoopNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
385
386
1/2
✓ Branch 0 (17→18) taken 729 times.
✗ Branch 1 (17→27) not taken.
729 return concludeNode(whileLoopNode);
387 }
388
389 9 std::any ASTBuilder::visitDoWhileLoop(SpiceParser::DoWhileLoopContext *ctx) {
390 9 const auto doWhileLoopNode = createNode<DoWhileLoopNode>(ctx);
391
392 // Visit children
393
3/6
✓ Branch 0 (3→4) taken 9 times.
✗ Branch 1 (3→23) not taken.
✓ Branch 2 (4→5) taken 9 times.
✗ Branch 3 (4→23) not taken.
✓ Branch 4 (5→6) taken 9 times.
✗ Branch 5 (5→21) not taken.
9 doWhileLoopNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
394
3/6
✓ Branch 0 (7→8) taken 9 times.
✗ Branch 1 (7→26) not taken.
✓ Branch 2 (8→9) taken 9 times.
✗ Branch 3 (8→26) not taken.
✓ Branch 4 (9→10) taken 9 times.
✗ Branch 5 (9→24) not taken.
9 doWhileLoopNode->condition = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
395
396
1/2
✓ Branch 0 (17→18) taken 9 times.
✗ Branch 1 (17→27) not taken.
9 return concludeNode(doWhileLoopNode);
397 }
398
399 3936 std::any ASTBuilder::visitIfStmt(SpiceParser::IfStmtContext *ctx) {
400 3936 const auto ifStmtNode = createNode<IfStmtNode>(ctx);
401
402 // Visit children
403
3/6
✓ Branch 0 (3→4) taken 3936 times.
✗ Branch 1 (3→30) not taken.
✓ Branch 2 (4→5) taken 3936 times.
✗ Branch 3 (4→30) not taken.
✓ Branch 4 (5→6) taken 3936 times.
✗ Branch 5 (5→28) not taken.
3936 ifStmtNode->condition = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
404
3/6
✓ Branch 0 (7→8) taken 3936 times.
✗ Branch 1 (7→33) not taken.
✓ Branch 2 (8→9) taken 3936 times.
✗ Branch 3 (8→33) not taken.
✓ Branch 4 (9→10) taken 3936 times.
✗ Branch 5 (9→31) not taken.
3936 ifStmtNode->thenBody = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
405
2/2
✓ Branch 0 (12→13) taken 213 times.
✓ Branch 1 (12→18) taken 3723 times.
3936 if (ctx->elseStmt())
406
3/6
✓ Branch 0 (13→14) taken 213 times.
✗ Branch 1 (13→36) not taken.
✓ Branch 2 (14→15) taken 213 times.
✗ Branch 3 (14→36) not taken.
✓ Branch 4 (15→16) taken 213 times.
✗ Branch 5 (15→34) not taken.
213 ifStmtNode->elseStmt = std::any_cast<ElseStmtNode *>(visit(ctx->elseStmt()));
407
408
1/2
✓ Branch 0 (24→25) taken 3936 times.
✗ Branch 1 (24→37) not taken.
3936 return concludeNode(ifStmtNode);
409 }
410
411 213 std::any ASTBuilder::visitElseStmt(SpiceParser::ElseStmtContext *ctx) {
412 213 const auto elseStmtNode = createNode<ElseStmtNode>(ctx);
413
414 // Visit children
415
2/2
✓ Branch 0 (4→5) taken 62 times.
✓ Branch 1 (4→10) taken 151 times.
213 if (ctx->ifStmt()) {
416 62 elseStmtNode->isElseIf = true;
417
3/6
✓ Branch 0 (5→6) taken 62 times.
✗ Branch 1 (5→27) not taken.
✓ Branch 2 (6→7) taken 62 times.
✗ Branch 3 (6→27) not taken.
✓ Branch 4 (7→8) taken 62 times.
✗ Branch 5 (7→25) not taken.
62 elseStmtNode->ifStmt = std::any_cast<IfStmtNode *>(visit(ctx->ifStmt()));
418 } else {
419
3/6
✓ Branch 0 (10→11) taken 151 times.
✗ Branch 1 (10→30) not taken.
✓ Branch 2 (11→12) taken 151 times.
✗ Branch 3 (11→30) not taken.
✓ Branch 4 (12→13) taken 151 times.
✗ Branch 5 (12→28) not taken.
151 elseStmtNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
420 }
421
422
1/2
✓ Branch 0 (21→22) taken 213 times.
✗ Branch 1 (21→31) not taken.
213 return concludeNode(elseStmtNode);
423 }
424
425 12 std::any ASTBuilder::visitSwitchStmt(SpiceParser::SwitchStmtContext *ctx) {
426 12 const auto switchStmtNode = createNode<SwitchStmtNode>(ctx);
427
428 // Visit children
429
3/6
✓ Branch 0 (3→4) taken 12 times.
✗ Branch 1 (3→29) not taken.
✓ Branch 2 (4→5) taken 12 times.
✗ Branch 3 (4→29) not taken.
✓ Branch 4 (5→6) taken 12 times.
✗ Branch 5 (5→27) not taken.
12 switchStmtNode->assignExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
430
2/4
✓ Branch 0 (7→8) taken 12 times.
✗ Branch 1 (7→32) not taken.
✓ Branch 2 (8→9) taken 12 times.
✗ Branch 3 (8→30) not taken.
12 fetchChildrenIntoVector(switchStmtNode->caseBranches, ctx->caseBranch());
431
2/2
✓ Branch 0 (11→12) taken 6 times.
✓ Branch 1 (11→17) taken 6 times.
12 if (ctx->defaultBranch()) {
432 6 switchStmtNode->hasDefaultBranch = true;
433
3/6
✓ Branch 0 (12→13) taken 6 times.
✗ Branch 1 (12→35) not taken.
✓ Branch 2 (13→14) taken 6 times.
✗ Branch 3 (13→35) not taken.
✓ Branch 4 (14→15) taken 6 times.
✗ Branch 5 (14→33) not taken.
6 switchStmtNode->defaultBranch = std::any_cast<DefaultBranchNode *>(visit(ctx->defaultBranch()));
434 }
435
436
1/2
✓ Branch 0 (23→24) taken 12 times.
✗ Branch 1 (23→36) not taken.
12 return concludeNode(switchStmtNode);
437 }
438
439 53 std::any ASTBuilder::visitCaseBranch(SpiceParser::CaseBranchContext *ctx) {
440 53 const auto caseBranchNode = createNode<CaseBranchNode>(ctx);
441
442 // Visit children
443
2/4
✓ Branch 0 (3→4) taken 53 times.
✗ Branch 1 (3→22) not taken.
✓ Branch 2 (4→5) taken 53 times.
✗ Branch 3 (4→20) not taken.
53 fetchChildrenIntoVector(caseBranchNode->caseConstants, ctx->caseConstant());
444
3/6
✓ Branch 0 (6→7) taken 53 times.
✗ Branch 1 (6→25) not taken.
✓ Branch 2 (7→8) taken 53 times.
✗ Branch 3 (7→25) not taken.
✓ Branch 4 (8→9) taken 53 times.
✗ Branch 5 (8→23) not taken.
53 caseBranchNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
445
446
1/2
✓ Branch 0 (16→17) taken 53 times.
✗ Branch 1 (16→26) not taken.
53 return concludeNode(caseBranchNode);
447 }
448
449 6 std::any ASTBuilder::visitDefaultBranch(SpiceParser::DefaultBranchContext *ctx) {
450 6 const auto defaultBranchNode = createNode<DefaultBranchNode>(ctx);
451
452 // Visit children
453
3/6
✓ Branch 0 (3→4) taken 6 times.
✗ Branch 1 (3→19) not taken.
✓ Branch 2 (4→5) taken 6 times.
✗ Branch 3 (4→19) not taken.
✓ Branch 4 (5→6) taken 6 times.
✗ Branch 5 (5→17) not taken.
6 defaultBranchNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
454
455
1/2
✓ Branch 0 (13→14) taken 6 times.
✗ Branch 1 (13→20) not taken.
6 return concludeNode(defaultBranchNode);
456 }
457
458 29 std::any ASTBuilder::visitAnonymousBlockStmt(SpiceParser::AnonymousBlockStmtContext *ctx) {
459 29 const auto anonymousBlockStmtNode = createNode<AnonymousBlockStmtNode>(ctx);
460
461 // Visit children
462
3/6
✓ Branch 0 (3→4) taken 29 times.
✗ Branch 1 (3→19) not taken.
✓ Branch 2 (4→5) taken 29 times.
✗ Branch 3 (4→19) not taken.
✓ Branch 4 (5→6) taken 29 times.
✗ Branch 5 (5→17) not taken.
29 anonymousBlockStmtNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
463
464
1/2
✓ Branch 0 (13→14) taken 29 times.
✗ Branch 1 (13→20) not taken.
29 return concludeNode(anonymousBlockStmtNode);
465 }
466
467 20249 std::any ASTBuilder::visitStmtLst(SpiceParser::StmtLstContext *ctx) {
468 20249 const auto stmtLstNode = createNode<StmtLstNode>(ctx);
469
470 // Enrich
471
2/4
✓ Branch 0 (3→4) taken 20249 times.
✗ Branch 1 (3→116) not taken.
✓ Branch 2 (4→5) taken 20249 times.
✗ Branch 3 (4→116) not taken.
20249 stmtLstNode->closingBraceCodeLoc = CodeLoc(ctx->getStop(), sourceFile);
472
473 // Visit children
474
2/2
✓ Branch 0 (105→7) taken 77303 times.
✓ Branch 1 (105→106) taken 20245 times.
97548 for (ParserRuleContext::ParseTree *stmt : ctx->children) {
475
3/4
✓ Branch 0 (8→9) taken 77303 times.
✗ Branch 1 (8→10) not taken.
✓ Branch 2 (11→12) taken 27634 times.
✓ Branch 3 (11→17) taken 49669 times.
77303 if (auto *stmtCtx = dynamic_cast<SpiceParser::StmtContext *>(stmt))
476
4/6
✓ Branch 0 (12→13) taken 27630 times.
✓ Branch 1 (12→119) taken 4 times.
✓ Branch 2 (13→14) taken 27630 times.
✗ Branch 3 (13→117) not taken.
✓ Branch 4 (14→15) taken 27630 times.
✗ Branch 5 (14→117) not taken.
27634 stmtLstNode->statements.push_back(std::any_cast<StmtNode *>(visit(stmtCtx)));
477
3/4
✓ Branch 0 (17→18) taken 49669 times.
✗ Branch 1 (17→19) not taken.
✓ Branch 2 (20→21) taken 1295 times.
✓ Branch 3 (20→26) taken 48374 times.
49669 else if (auto *forLoopCtx = dynamic_cast<SpiceParser::ForLoopContext *>(stmt))
478
3/6
✓ Branch 0 (21→22) taken 1295 times.
✗ Branch 1 (21→123) not taken.
✓ Branch 2 (22→23) taken 1295 times.
✗ Branch 3 (22→121) not taken.
✓ Branch 4 (23→24) taken 1295 times.
✗ Branch 5 (23→121) not taken.
1295 stmtLstNode->statements.push_back(std::any_cast<ForLoopNode *>(visit(forLoopCtx)));
479
3/4
✓ Branch 0 (26→27) taken 48374 times.
✗ Branch 1 (26→28) not taken.
✓ Branch 2 (29→30) taken 117 times.
✓ Branch 3 (29→35) taken 48257 times.
48374 else if (auto *foreachLoopCtx = dynamic_cast<SpiceParser::ForeachLoopContext *>(stmt))
480
3/6
✓ Branch 0 (30→31) taken 117 times.
✗ Branch 1 (30→127) not taken.
✓ Branch 2 (31→32) taken 117 times.
✗ Branch 3 (31→125) not taken.
✓ Branch 4 (32→33) taken 117 times.
✗ Branch 5 (32→125) not taken.
117 stmtLstNode->statements.push_back(std::any_cast<ForeachLoopNode *>(visit(foreachLoopCtx)));
481
3/4
✓ Branch 0 (35→36) taken 48257 times.
✗ Branch 1 (35→37) not taken.
✓ Branch 2 (38→39) taken 729 times.
✓ Branch 3 (38→44) taken 47528 times.
48257 else if (auto *whileLoopCtx = dynamic_cast<SpiceParser::WhileLoopContext *>(stmt))
482
3/6
✓ Branch 0 (39→40) taken 729 times.
✗ Branch 1 (39→131) not taken.
✓ Branch 2 (40→41) taken 729 times.
✗ Branch 3 (40→129) not taken.
✓ Branch 4 (41→42) taken 729 times.
✗ Branch 5 (41→129) not taken.
729 stmtLstNode->statements.push_back(std::any_cast<WhileLoopNode *>(visit(whileLoopCtx)));
483
3/4
✓ Branch 0 (44→45) taken 47528 times.
✗ Branch 1 (44→46) not taken.
✓ Branch 2 (47→48) taken 9 times.
✓ Branch 3 (47→53) taken 47519 times.
47528 else if (auto *doWhileLoopCtx = dynamic_cast<SpiceParser::DoWhileLoopContext *>(stmt))
484
3/6
✓ Branch 0 (48→49) taken 9 times.
✗ Branch 1 (48→135) not taken.
✓ Branch 2 (49→50) taken 9 times.
✗ Branch 3 (49→133) not taken.
✓ Branch 4 (50→51) taken 9 times.
✗ Branch 5 (50→133) not taken.
9 stmtLstNode->statements.push_back(std::any_cast<DoWhileLoopNode *>(visit(doWhileLoopCtx)));
485
3/4
✓ Branch 0 (53→54) taken 47519 times.
✗ Branch 1 (53→55) not taken.
✓ Branch 2 (56→57) taken 3874 times.
✓ Branch 3 (56→62) taken 43645 times.
47519 else if (auto *ifStmtCtx = dynamic_cast<SpiceParser::IfStmtContext *>(stmt))
486
3/6
✓ Branch 0 (57→58) taken 3874 times.
✗ Branch 1 (57→139) not taken.
✓ Branch 2 (58→59) taken 3874 times.
✗ Branch 3 (58→137) not taken.
✓ Branch 4 (59→60) taken 3874 times.
✗ Branch 5 (59→137) not taken.
3874 stmtLstNode->statements.push_back(std::any_cast<IfStmtNode *>(visit(ifStmtCtx)));
487
3/4
✓ Branch 0 (62→63) taken 43645 times.
✗ Branch 1 (62→64) not taken.
✓ Branch 2 (65→66) taken 12 times.
✓ Branch 3 (65→71) taken 43633 times.
43645 else if (auto *switchStmtCtx = dynamic_cast<SpiceParser::SwitchStmtContext *>(stmt))
488
3/6
✓ Branch 0 (66→67) taken 12 times.
✗ Branch 1 (66→143) not taken.
✓ Branch 2 (67→68) taken 12 times.
✗ Branch 3 (67→141) not taken.
✓ Branch 4 (68→69) taken 12 times.
✗ Branch 5 (68→141) not taken.
12 stmtLstNode->statements.push_back(std::any_cast<SwitchStmtNode *>(visit(switchStmtCtx)));
489
3/4
✓ Branch 0 (71→72) taken 43633 times.
✗ Branch 1 (71→73) not taken.
✓ Branch 2 (74→75) taken 707 times.
✓ Branch 3 (74→80) taken 42926 times.
43633 else if (auto *assetStmtCtx = dynamic_cast<SpiceParser::AssertStmtContext *>(stmt))
490
3/6
✓ Branch 0 (75→76) taken 707 times.
✗ Branch 1 (75→147) not taken.
✓ Branch 2 (76→77) taken 707 times.
✗ Branch 3 (76→145) not taken.
✓ Branch 4 (77→78) taken 707 times.
✗ Branch 5 (77→145) not taken.
707 stmtLstNode->statements.push_back(std::any_cast<AssertStmtNode *>(visit(assetStmtCtx)));
491
3/4
✓ Branch 0 (80→81) taken 42926 times.
✗ Branch 1 (80→82) not taken.
✓ Branch 2 (83→84) taken 2403 times.
✓ Branch 3 (83→89) taken 40523 times.
42926 else if (auto *unsafeBlockCtx = dynamic_cast<SpiceParser::UnsafeBlockContext *>(stmt))
492
3/6
✓ Branch 0 (84→85) taken 2403 times.
✗ Branch 1 (84→151) not taken.
✓ Branch 2 (85→86) taken 2403 times.
✗ Branch 3 (85→149) not taken.
✓ Branch 4 (86→87) taken 2403 times.
✗ Branch 5 (86→149) not taken.
2403 stmtLstNode->statements.push_back(std::any_cast<UnsafeBlockNode *>(visit(unsafeBlockCtx)));
493
3/4
✓ Branch 0 (89→90) taken 40523 times.
✗ Branch 1 (89→91) not taken.
✓ Branch 2 (92→93) taken 29 times.
✓ Branch 3 (92→98) taken 40494 times.
40523 else if (auto *anonymousScopeCtx = dynamic_cast<SpiceParser::AnonymousBlockStmtContext *>(stmt))
494
3/6
✓ Branch 0 (93→94) taken 29 times.
✗ Branch 1 (93→155) not taken.
✓ Branch 2 (94→95) taken 29 times.
✗ Branch 3 (94→153) not taken.
✓ Branch 4 (95→96) taken 29 times.
✗ Branch 5 (95→153) not taken.
29 stmtLstNode->statements.push_back(std::any_cast<AnonymousBlockStmtNode *>(visit(anonymousScopeCtx)));
495 else
496 assert(dynamic_cast<TerminalNode *>(stmt) != nullptr); // GCOV_EXCL_LINE
497 }
498
499
1/2
✓ Branch 0 (112→113) taken 20245 times.
✗ Branch 1 (112→158) not taken.
20245 return concludeNode(stmtLstNode);
500 }
501
502 6333 std::any ASTBuilder::visitTypeLst(SpiceParser::TypeLstContext *ctx) {
503 6333 const auto typeLstNode = createNode<TypeLstNode>(ctx);
504
505 // Visit children
506
2/4
✓ Branch 0 (3→4) taken 6333 times.
✗ Branch 1 (3→18) not taken.
✓ Branch 2 (4→5) taken 6333 times.
✗ Branch 3 (4→16) not taken.
6333 fetchChildrenIntoVector(typeLstNode->dataTypes, ctx->dataType());
507
508
1/2
✓ Branch 0 (12→13) taken 6333 times.
✗ Branch 1 (12→19) not taken.
6333 return concludeNode(typeLstNode);
509 }
510
511 914 std::any ASTBuilder::visitTypeLstWithEllipsis(SpiceParser::TypeLstWithEllipsisContext *ctx) {
512 914 const auto typeLstWithEllipsisNode = createNode<TypeLstWithEllipsisNode>(ctx);
513
514 // Visit children
515
3/6
✓ Branch 0 (3→4) taken 914 times.
✗ Branch 1 (3→20) not taken.
✓ Branch 2 (4→5) taken 914 times.
✗ Branch 3 (4→20) not taken.
✓ Branch 4 (5→6) taken 914 times.
✗ Branch 5 (5→18) not taken.
914 typeLstWithEllipsisNode->typeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
516
517 // Set some flags
518 914 typeLstWithEllipsisNode->hasEllipsis = ctx->ELLIPSIS() != nullptr;
519
520
1/2
✓ Branch 0 (14→15) taken 914 times.
✗ Branch 1 (14→21) not taken.
914 return concludeNode(typeLstWithEllipsisNode);
521 }
522
523 877 std::any ASTBuilder::visitTypeAltsLst(SpiceParser::TypeAltsLstContext *ctx) {
524 877 const auto typeAltsLstNode = createNode<TypeAltsLstNode>(ctx);
525
526 // Visit children
527
2/4
✓ Branch 0 (3→4) taken 877 times.
✗ Branch 1 (3→18) not taken.
✓ Branch 2 (4→5) taken 877 times.
✗ Branch 3 (4→16) not taken.
877 fetchChildrenIntoVector(typeAltsLstNode->dataTypes, ctx->dataType());
528
529
1/2
✓ Branch 0 (12→13) taken 877 times.
✗ Branch 1 (12→19) not taken.
877 return concludeNode(typeAltsLstNode);
530 }
531
532 8483 std::any ASTBuilder::visitParamLst(SpiceParser::ParamLstContext *ctx) {
533 8483 const auto paramLstNode = createNode<ParamLstNode>(ctx);
534
535 // Visit children
536
2/4
✓ Branch 0 (3→4) taken 8483 times.
✗ Branch 1 (3→24) not taken.
✓ Branch 2 (4→5) taken 8483 times.
✗ Branch 3 (4→22) not taken.
8483 fetchChildrenIntoVector(paramLstNode->params, ctx->declStmt());
537
538 // Set some flags to later detect that the decl statements are parameters
539
2/2
✓ Branch 0 (11→8) taken 12786 times.
✓ Branch 1 (11→12) taken 8483 times.
21269 for (DeclStmtNode *declStmt : paramLstNode->params) {
540 12786 declStmt->isFctParam = true;
541 12786 declStmt->dataType->isParamType = true;
542 }
543
544
1/2
✓ Branch 0 (18→19) taken 8483 times.
✗ Branch 1 (18→25) not taken.
8483 return concludeNode(paramLstNode);
545 }
546
547 12006 std::any ASTBuilder::visitArgLst(SpiceParser::ArgLstContext *ctx) {
548 12006 const auto argLstNode = createNode<ArgLstNode>(ctx);
549
550 // Visit children
551
2/4
✓ Branch 0 (3→4) taken 12006 times.
✗ Branch 1 (3→20) not taken.
✓ Branch 2 (4→5) taken 12006 times.
✗ Branch 3 (4→18) not taken.
12006 fetchChildrenIntoVector(argLstNode->args, ctx->assignExpr());
552 12006 argLstNode->argInfos.reserve(argLstNode->args.size());
553
554
1/2
✓ Branch 0 (14→15) taken 12006 times.
✗ Branch 1 (14→21) not taken.
12006 return concludeNode(argLstNode);
555 }
556
557 67 std::any ASTBuilder::visitEnumItemLst(SpiceParser::EnumItemLstContext *ctx) {
558 67 const auto enumItemLstNode = createNode<EnumItemLstNode>(ctx);
559
560 // Visit children
561
2/4
✓ Branch 0 (3→4) taken 67 times.
✗ Branch 1 (3→18) not taken.
✓ Branch 2 (4→5) taken 67 times.
✗ Branch 3 (4→16) not taken.
67 fetchChildrenIntoVector(enumItemLstNode->items, ctx->enumItem());
562
563
1/2
✓ Branch 0 (12→13) taken 67 times.
✗ Branch 1 (12→19) not taken.
67 return concludeNode(enumItemLstNode);
564 }
565
566 744 std::any ASTBuilder::visitEnumItem(SpiceParser::EnumItemContext *ctx) {
567 744 const auto enumItemNode = createNode<EnumItemNode>(ctx);
568
569 // Enrich
570
2/4
✓ Branch 0 (3→4) taken 744 times.
✗ Branch 1 (3→22) not taken.
✓ Branch 2 (4→5) taken 744 times.
✗ Branch 3 (4→22) not taken.
744 enumItemNode->itemName = getIdentifier(ctx->TYPE_IDENTIFIER(), false);
571
2/2
✓ Branch 0 (8→9) taken 409 times.
✓ Branch 1 (8→12) taken 335 times.
744 if (ctx->ASSIGN()) {
572 409 enumItemNode->itemValue = parseInt(ctx->INT_LIT());
573 409 enumItemNode->hasValue = true;
574 }
575
576
1/2
✓ Branch 0 (18→19) taken 744 times.
✗ Branch 1 (18→23) not taken.
744 return concludeNode(enumItemNode);
577 }
578
579 1419 std::any ASTBuilder::visitField(SpiceParser::FieldContext *ctx) {
580 1419 const auto fieldNode = createNode<FieldNode>(ctx);
581
582 // Enrich
583
2/4
✓ Branch 0 (3→4) taken 1419 times.
✗ Branch 1 (3→29) not taken.
✓ Branch 2 (4→5) taken 1419 times.
✗ Branch 3 (4→29) not taken.
1419 fieldNode->fieldName = getIdentifier(ctx->IDENTIFIER(), false);
584
585 // Visit children
586
3/6
✓ Branch 0 (7→8) taken 1419 times.
✗ Branch 1 (7→32) not taken.
✓ Branch 2 (8→9) taken 1419 times.
✗ Branch 3 (8→32) not taken.
✓ Branch 4 (9→10) taken 1419 times.
✗ Branch 5 (9→30) not taken.
1419 fieldNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
587 1419 fieldNode->dataType->setFieldTypeRecursive();
588
2/2
✓ Branch 0 (13→14) taken 205 times.
✓ Branch 1 (13→19) taken 1214 times.
1419 if (ctx->ternaryExpr())
589
3/6
✓ Branch 0 (14→15) taken 205 times.
✗ Branch 1 (14→35) not taken.
✓ Branch 2 (15→16) taken 205 times.
✗ Branch 3 (15→35) not taken.
✓ Branch 4 (16→17) taken 205 times.
✗ Branch 5 (16→33) not taken.
205 fieldNode->defaultValue = std::any_cast<TernaryExprNode *>(visit(ctx->ternaryExpr()));
590
591
1/2
✓ Branch 0 (25→26) taken 1419 times.
✗ Branch 1 (25→36) not taken.
1419 return concludeNode(fieldNode);
592 }
593
594 211 std::any ASTBuilder::visitSignature(SpiceParser::SignatureContext *ctx) {
595 211 const auto signatureNode = createNode<SignatureNode>(ctx);
596
597 // Extract method name
598
2/4
✓ Branch 0 (3→4) taken 211 times.
✗ Branch 1 (3→73) not taken.
✓ Branch 2 (4→5) taken 211 times.
✗ Branch 3 (4→73) not taken.
211 signatureNode->methodName = getIdentifier(ctx->IDENTIFIER(), false);
599
600 // Visit children
601
2/2
✓ Branch 0 (8→9) taken 14 times.
✓ Branch 1 (8→14) taken 197 times.
211 if (ctx->qualifierLst()) {
602
3/6
✓ Branch 0 (9→10) taken 14 times.
✗ Branch 1 (9→76) not taken.
✓ Branch 2 (10→11) taken 14 times.
✗ Branch 3 (10→76) not taken.
✓ Branch 4 (11→12) taken 14 times.
✗ Branch 5 (11→74) not taken.
14 signatureNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
603 }
604
2/2
✓ Branch 0 (15→16) taken 165 times.
✓ Branch 1 (15→22) taken 46 times.
211 if (ctx->F()) {
605 165 signatureNode->hasReturnType = true;
606 165 signatureNode->signatureType = SignatureNode::SignatureType::TYPE_FUNCTION;
607 165 signatureNode->signatureQualifiers = TypeQualifiers::of(TY_FUNCTION);
608
3/6
✓ Branch 0 (17→18) taken 165 times.
✗ Branch 1 (17→79) not taken.
✓ Branch 2 (18→19) taken 165 times.
✗ Branch 3 (18→79) not taken.
✓ Branch 4 (19→20) taken 165 times.
✗ Branch 5 (19→77) not taken.
165 signatureNode->returnType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
609 } else {
610 46 signatureNode->signatureType = SignatureNode::SignatureType::TYPE_PROCEDURE;
611 46 signatureNode->signatureQualifiers = TypeQualifiers::of(TY_PROCEDURE);
612 }
613
10/16
✓ Branch 0 (24→25) taken 165 times.
✓ Branch 1 (24→28) taken 46 times.
✓ Branch 2 (25→26) taken 165 times.
✗ Branch 3 (25→80) not taken.
✓ Branch 4 (28→29) taken 46 times.
✗ Branch 5 (28→80) not taken.
✓ Branch 6 (31→32) taken 46 times.
✓ Branch 7 (31→33) taken 165 times.
✓ Branch 8 (33→34) taken 165 times.
✓ Branch 9 (33→35) taken 46 times.
✓ Branch 10 (35→36) taken 105 times.
✓ Branch 11 (35→41) taken 106 times.
✗ Branch 12 (80→81) not taken.
✗ Branch 13 (80→82) not taken.
✗ Branch 14 (84→85) not taken.
✗ Branch 15 (84→86) not taken.
211 if (ctx->F() ? ctx->LESS().size() == 2 : ctx->LESS().size() == 1) {
614 105 signatureNode->hasTemplateTypes = true;
615
3/6
✓ Branch 0 (36→37) taken 105 times.
✗ Branch 1 (36→90) not taken.
✓ Branch 2 (37→38) taken 105 times.
✗ Branch 3 (37→90) not taken.
✓ Branch 4 (38→39) taken 105 times.
✗ Branch 5 (38→88) not taken.
105 signatureNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst(0)));
616 }
617
13/20
✓ Branch 0 (41→42) taken 211 times.
✗ Branch 1 (41→91) not taken.
✓ Branch 2 (43→44) taken 209 times.
✓ Branch 3 (43→48) taken 2 times.
✓ Branch 4 (44→45) taken 209 times.
✗ Branch 5 (44→91) not taken.
✓ Branch 6 (46→47) taken 110 times.
✓ Branch 7 (46→49) taken 99 times.
✓ Branch 8 (47→48) taken 7 times.
✓ Branch 9 (47→49) taken 103 times.
✓ Branch 10 (50→51) taken 209 times.
✓ Branch 11 (50→52) taken 2 times.
✓ Branch 12 (52→53) taken 211 times.
✗ Branch 13 (52→54) not taken.
✓ Branch 14 (54→55) taken 9 times.
✓ Branch 15 (54→63) taken 202 times.
✗ Branch 16 (91→92) not taken.
✗ Branch 17 (91→93) not taken.
✗ Branch 18 (95→96) not taken.
✗ Branch 19 (95→97) not taken.
211 if (ctx->typeLst().size() == 2 || (ctx->typeLst().size() == 1 && !signatureNode->hasTemplateTypes)) {
618 9 signatureNode->hasParams = true;
619
5/8
✓ Branch 0 (55→56) taken 2 times.
✓ Branch 1 (55→57) taken 7 times.
✓ Branch 2 (58→59) taken 9 times.
✗ Branch 3 (58→101) not taken.
✓ Branch 4 (59→60) taken 9 times.
✗ Branch 5 (59→101) not taken.
✓ Branch 6 (60→61) taken 9 times.
✗ Branch 7 (60→99) not taken.
9 signatureNode->paramTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst(signatureNode->hasTemplateTypes ? 1 : 0)));
620 }
621
622
1/2
✓ Branch 0 (69→70) taken 211 times.
✗ Branch 1 (69→102) not taken.
211 return concludeNode(signatureNode);
623 }
624
625 27634 std::any ASTBuilder::visitStmt(SpiceParser::StmtContext *ctx) {
626
2/2
✓ Branch 0 (3→4) taken 4976 times.
✓ Branch 1 (3→11) taken 22658 times.
27634 if (ctx->declStmt())
627
5/8
✓ Branch 0 (4→5) taken 4976 times.
✗ Branch 1 (4→60) not taken.
✓ Branch 2 (5→6) taken 4972 times.
✓ Branch 3 (5→60) taken 4 times.
✓ Branch 4 (6→7) taken 4972 times.
✗ Branch 5 (6→58) not taken.
✓ Branch 6 (7→8) taken 4972 times.
✗ Branch 7 (7→58) not taken.
4976 return static_cast<StmtNode *>(std::any_cast<DeclStmtNode *>(visit(ctx->declStmt())));
628
2/2
✓ Branch 0 (12→13) taken 13349 times.
✓ Branch 1 (12→20) taken 9309 times.
22658 if (ctx->exprStmt())
629
4/8
✓ Branch 0 (13→14) taken 13349 times.
✗ Branch 1 (13→64) not taken.
✓ Branch 2 (14→15) taken 13349 times.
✗ Branch 3 (14→64) not taken.
✓ Branch 4 (15→16) taken 13349 times.
✗ Branch 5 (15→62) not taken.
✓ Branch 6 (16→17) taken 13349 times.
✗ Branch 7 (16→62) not taken.
13349 return static_cast<StmtNode *>(std::any_cast<ExprStmtNode *>(visit(ctx->exprStmt())));
630
2/2
✓ Branch 0 (21→22) taken 9006 times.
✓ Branch 1 (21→29) taken 303 times.
9309 if (ctx->returnStmt())
631
4/8
✓ Branch 0 (22→23) taken 9006 times.
✗ Branch 1 (22→68) not taken.
✓ Branch 2 (23→24) taken 9006 times.
✗ Branch 3 (23→68) not taken.
✓ Branch 4 (24→25) taken 9006 times.
✗ Branch 5 (24→66) not taken.
✓ Branch 6 (25→26) taken 9006 times.
✗ Branch 7 (25→66) not taken.
9006 return static_cast<StmtNode *>(std::any_cast<ReturnStmtNode *>(visit(ctx->returnStmt())));
632
2/2
✓ Branch 0 (30→31) taken 108 times.
✓ Branch 1 (30→38) taken 195 times.
303 if (ctx->breakStmt())
633
4/8
✓ Branch 0 (31→32) taken 108 times.
✗ Branch 1 (31→72) not taken.
✓ Branch 2 (32→33) taken 108 times.
✗ Branch 3 (32→72) not taken.
✓ Branch 4 (33→34) taken 108 times.
✗ Branch 5 (33→70) not taken.
✓ Branch 6 (34→35) taken 108 times.
✗ Branch 7 (34→70) not taken.
108 return static_cast<StmtNode *>(std::any_cast<BreakStmtNode *>(visit(ctx->breakStmt())));
634
2/2
✓ Branch 0 (39→40) taken 189 times.
✓ Branch 1 (39→47) taken 6 times.
195 if (ctx->continueStmt())
635
4/8
✓ Branch 0 (40→41) taken 189 times.
✗ Branch 1 (40→76) not taken.
✓ Branch 2 (41→42) taken 189 times.
✗ Branch 3 (41→76) not taken.
✓ Branch 4 (42→43) taken 189 times.
✗ Branch 5 (42→74) not taken.
✓ Branch 6 (43→44) taken 189 times.
✗ Branch 7 (43→74) not taken.
189 return static_cast<StmtNode *>(std::any_cast<ContinueStmtNode *>(visit(ctx->continueStmt())));
636
1/2
✓ Branch 0 (48→49) taken 6 times.
✗ Branch 1 (48→56) not taken.
6 if (ctx->fallthroughStmt())
637
4/8
✓ Branch 0 (49→50) taken 6 times.
✗ Branch 1 (49→80) not taken.
✓ Branch 2 (50→51) taken 6 times.
✗ Branch 3 (50→80) not taken.
✓ Branch 4 (51→52) taken 6 times.
✗ Branch 5 (51→78) not taken.
✓ Branch 6 (52→53) taken 6 times.
✗ Branch 7 (52→78) not taken.
6 return static_cast<StmtNode *>(std::any_cast<FallthroughStmtNode *>(visit(ctx->fallthroughStmt())));
638 assert_fail("Unknown statement type"); // GCOV_EXCL_LINE
639 return nullptr; // GCOV_EXCL_LINE
640 }
641
642 19180 std::any ASTBuilder::visitDeclStmt(SpiceParser::DeclStmtContext *ctx) {
643 19180 const auto declStmtNode = createNode<DeclStmtNode>(ctx);
644
645 // Enrich
646
3/4
✓ Branch 0 (3→4) taken 19180 times.
✗ Branch 1 (3→28) not taken.
✓ Branch 2 (4→5) taken 19179 times.
✓ Branch 3 (4→28) taken 1 times.
19180 declStmtNode->varName = getIdentifier(ctx->IDENTIFIER(), false);
647
648 // Visit children
649
4/6
✓ Branch 0 (7→8) taken 19179 times.
✗ Branch 1 (7→31) not taken.
✓ Branch 2 (8→9) taken 19178 times.
✓ Branch 3 (8→31) taken 1 times.
✓ Branch 4 (9→10) taken 19178 times.
✗ Branch 5 (9→29) not taken.
19179 declStmtNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
650
2/2
✓ Branch 0 (12→13) taken 6903 times.
✓ Branch 1 (12→18) taken 12275 times.
19178 if (ctx->assignExpr()) {
651 6903 declStmtNode->hasAssignment = true;
652
4/6
✓ Branch 0 (13→14) taken 6903 times.
✗ Branch 1 (13→34) not taken.
✓ Branch 2 (14→15) taken 6901 times.
✓ Branch 3 (14→34) taken 2 times.
✓ Branch 4 (15→16) taken 6901 times.
✗ Branch 5 (15→32) not taken.
6903 declStmtNode->assignExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
653 }
654
655
1/2
✓ Branch 0 (24→25) taken 19176 times.
✗ Branch 1 (24→35) not taken.
19176 return concludeNode(declStmtNode);
656 }
657
658 13349 std::any ASTBuilder::visitExprStmt(SpiceParser::ExprStmtContext *ctx) {
659 13349 const auto exprStmtNode = createNode<ExprStmtNode>(ctx);
660
661 // Enrich
662
3/6
✓ Branch 0 (3→4) taken 13349 times.
✗ Branch 1 (3→19) not taken.
✓ Branch 2 (4→5) taken 13349 times.
✗ Branch 3 (4→19) not taken.
✓ Branch 4 (5→6) taken 13349 times.
✗ Branch 5 (5→17) not taken.
13349 exprStmtNode->expr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
663
664
1/2
✓ Branch 0 (13→14) taken 13349 times.
✗ Branch 1 (13→20) not taken.
13349 return concludeNode(exprStmtNode);
665 }
666
667 28768 std::any ASTBuilder::visitQualifierLst(SpiceParser::QualifierLstContext *ctx) {
668 28768 const auto qualifierLstNode = createNode<QualifierLstNode>(ctx);
669
670 // Visit children
671
2/4
✓ Branch 0 (3→4) taken 28768 times.
✗ Branch 1 (3→37) not taken.
✓ Branch 2 (4→5) taken 28768 times.
✗ Branch 3 (4→35) not taken.
28768 fetchChildrenIntoVector(qualifierLstNode->qualifiers, ctx->qualifier());
672
673 // Check if qualifier combination is invalid
674 28768 bool seenSignedOrUnsigned = false;
675
2/2
✓ Branch 0 (24→8) taken 34805 times.
✓ Branch 1 (24→25) taken 28767 times.
63572 for (const QualifierNode *qualifier : qualifierLstNode->qualifiers) {
676 // Check if we have both, signed and unsigned qualifier
677
2/2
✓ Branch 0 (9→10) taken 34798 times.
✓ Branch 1 (9→12) taken 7 times.
34805 if (qualifier->type != QualifierNode::QualifierType::TY_SIGNED &&
678
2/2
✓ Branch 0 (10→11) taken 26007 times.
✓ Branch 1 (10→12) taken 8791 times.
34798 qualifier->type != QualifierNode::QualifierType::TY_UNSIGNED)
679 26007 continue;
680
2/2
✓ Branch 0 (12→13) taken 1 times.
✓ Branch 1 (12→21) taken 8797 times.
8798 if (seenSignedOrUnsigned)
681
2/4
✓ Branch 0 (16→17) taken 1 times.
✗ Branch 1 (16→41) not taken.
✓ Branch 2 (17→18) taken 1 times.
✗ Branch 3 (17→38) not taken.
3 throw ParserError(qualifier->codeLoc, INVALID_QUALIFIER_COMBINATION, "A variable can not be signed and unsigned");
682 8797 seenSignedOrUnsigned = true;
683 }
684
685
1/2
✓ Branch 0 (31→32) taken 28767 times.
✗ Branch 1 (31→48) not taken.
28767 return concludeNode(qualifierLstNode);
686 }
687
688 34805 std::any ASTBuilder::visitQualifier(SpiceParser::QualifierContext *ctx) {
689 34805 const auto qualifierNode = createNode<QualifierNode>(ctx);
690
691
3/4
✓ Branch 0 (6→7) taken 34805 times.
✗ Branch 1 (6→8) not taken.
✓ Branch 2 (32→5) taken 34805 times.
✓ Branch 3 (32→33) taken 34805 times.
69610 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
692 34805 const auto token = spice_pointer_cast<TerminalNode *>(subTree);
693
2/4
✓ Branch 0 (13→14) taken 34805 times.
✗ Branch 1 (13→43) not taken.
✓ Branch 2 (14→15) taken 34805 times.
✗ Branch 3 (14→43) not taken.
34805 const size_t symbolType = token->getSymbol()->getType();
694
2/2
✓ Branch 0 (15→16) taken 7280 times.
✓ Branch 1 (15→17) taken 27525 times.
34805 if (symbolType == SpiceParser::CONST)
695 7280 qualifierNode->type = QualifierNode::QualifierType::TY_CONST;
696
2/2
✓ Branch 0 (17→18) taken 7 times.
✓ Branch 1 (17→19) taken 27518 times.
27525 else if (symbolType == SpiceParser::SIGNED)
697 7 qualifierNode->type = QualifierNode::QualifierType::TY_SIGNED;
698
2/2
✓ Branch 0 (19→20) taken 8791 times.
✓ Branch 1 (19→21) taken 18727 times.
27518 else if (symbolType == SpiceParser::UNSIGNED)
699 8791 qualifierNode->type = QualifierNode::QualifierType::TY_UNSIGNED;
700
2/2
✓ Branch 0 (21→22) taken 3009 times.
✓ Branch 1 (21→23) taken 15718 times.
18727 else if (symbolType == SpiceParser::INLINE)
701 3009 qualifierNode->type = QualifierNode::QualifierType::TY_INLINE;
702
2/2
✓ Branch 0 (23→24) taken 11954 times.
✓ Branch 1 (23→25) taken 3764 times.
15718 else if (symbolType == SpiceParser::PUBLIC)
703 11954 qualifierNode->type = QualifierNode::QualifierType::TY_PUBLIC;
704
2/2
✓ Branch 0 (25→26) taken 3757 times.
✓ Branch 1 (25→27) taken 7 times.
3764 else if (symbolType == SpiceParser::HEAP)
705 3757 qualifierNode->type = QualifierNode::QualifierType::TY_HEAP;
706
1/2
✓ Branch 0 (27→28) taken 7 times.
✗ Branch 1 (27→29) not taken.
7 else if (symbolType == SpiceParser::COMPOSE)
707 7 qualifierNode->type = QualifierNode::QualifierType::TY_COMPOSITION;
708 else
709 assert_fail("Unknown qualifier type"); // GCOV_EXCL_LINE
710 }
711
712
1/2
✓ Branch 0 (39→40) taken 34805 times.
✗ Branch 1 (39→44) not taken.
34805 return concludeNode(qualifierNode);
713 }
714
715 323 std::any ASTBuilder::visitModAttr(SpiceParser::ModAttrContext *ctx) {
716 323 const auto modAttrNode = createNode<ModAttrNode>(ctx);
717
718 // Visit children
719
4/6
✓ Branch 0 (3→4) taken 323 times.
✗ Branch 1 (3→25) not taken.
✓ Branch 2 (4→5) taken 322 times.
✓ Branch 3 (4→25) taken 1 times.
✓ Branch 4 (5→6) taken 322 times.
✗ Branch 5 (5→23) not taken.
323 modAttrNode->attrLst = std::any_cast<AttrLstNode *>(visit(ctx->attrLst()));
720
721 // Tell the attributes that they are module attributes
722
2/2
✓ Branch 0 (12→9) taken 760 times.
✓ Branch 1 (12→13) taken 322 times.
1082 for (AttrNode *attr : modAttrNode->attrLst->attributes)
723 760 attr->target = AttrNode::TARGET_MODULE;
724
725
1/2
✓ Branch 0 (19→20) taken 322 times.
✗ Branch 1 (19→26) not taken.
322 return concludeNode(modAttrNode);
726 }
727
728 431 std::any ASTBuilder::visitTopLevelDefAttr(SpiceParser::TopLevelDefAttrContext *ctx) {
729 431 const auto fctAttrNode = createNode<TopLevelDefinitionAttrNode>(ctx);
730
731 // Visit children
732
3/6
✓ Branch 0 (3→4) taken 431 times.
✗ Branch 1 (3→19) not taken.
✓ Branch 2 (4→5) taken 431 times.
✗ Branch 3 (4→19) not taken.
✓ Branch 4 (5→6) taken 431 times.
✗ Branch 5 (5→17) not taken.
431 fctAttrNode->attrLst = std::any_cast<AttrLstNode *>(visit(ctx->attrLst()));
733
734
1/2
✓ Branch 0 (13→14) taken 431 times.
✗ Branch 1 (13→20) not taken.
431 return concludeNode(fctAttrNode);
735 }
736
737 16 std::any ASTBuilder::visitLambdaAttr(SpiceParser::LambdaAttrContext *ctx) {
738 16 const auto lambdaAttrNode = createNode<LambdaAttrNode>(ctx);
739
740 // Visit children
741
3/6
✓ Branch 0 (3→4) taken 16 times.
✗ Branch 1 (3→25) not taken.
✓ Branch 2 (4→5) taken 16 times.
✗ Branch 3 (4→25) not taken.
✓ Branch 4 (5→6) taken 16 times.
✗ Branch 5 (5→23) not taken.
16 lambdaAttrNode->attrLst = std::any_cast<AttrLstNode *>(visit(ctx->attrLst()));
742
743 // Tell the attributes that they are module attributes
744
2/2
✓ Branch 0 (12→9) taken 16 times.
✓ Branch 1 (12→13) taken 16 times.
32 for (AttrNode *attr : lambdaAttrNode->attrLst->attributes)
745 16 attr->target = AttrNode::TARGET_LAMBDA;
746
747
1/2
✓ Branch 0 (19→20) taken 16 times.
✗ Branch 1 (19→26) not taken.
16 return concludeNode(lambdaAttrNode);
748 }
749
750 770 std::any ASTBuilder::visitAttrLst(SpiceParser::AttrLstContext *ctx) {
751 770 const auto attrLstNode = createNode<AttrLstNode>(ctx);
752
753 // Visit children
754
3/4
✓ Branch 0 (3→4) taken 770 times.
✗ Branch 1 (3→18) not taken.
✓ Branch 2 (4→5) taken 769 times.
✓ Branch 3 (4→16) taken 1 times.
771 fetchChildrenIntoVector(attrLstNode->attributes, ctx->attr());
755
756
1/2
✓ Branch 0 (12→13) taken 769 times.
✗ Branch 1 (12→19) not taken.
769 return concludeNode(attrLstNode);
757 }
758
759 1213 std::any ASTBuilder::visitAttr(SpiceParser::AttrContext *ctx) {
760 1213 const auto attrNode = createNode<AttrNode>(ctx);
761
762 // Extract key
763
3/4
✓ Branch 0 (3→4) taken 1213 times.
✗ Branch 1 (3→66) not taken.
✓ Branch 2 (16→6) taken 3018 times.
✓ Branch 3 (16→17) taken 1213 times.
4231 for (const TerminalNode *keyFragment : ctx->IDENTIFIER()) {
764
2/2
✓ Branch 0 (8→9) taken 1805 times.
✓ Branch 1 (8→10) taken 1213 times.
3018 if (!attrNode->key.empty())
765
1/2
✓ Branch 0 (9→10) taken 1805 times.
✗ Branch 1 (9→64) not taken.
1805 attrNode->key += MEMBER_ACCESS_TOKEN;
766
3/6
✓ Branch 0 (10→11) taken 3018 times.
✗ Branch 1 (10→63) not taken.
✓ Branch 2 (11→12) taken 3018 times.
✗ Branch 3 (11→63) not taken.
✓ Branch 4 (12→13) taken 3018 times.
✗ Branch 5 (12→61) not taken.
3018 attrNode->key += keyFragment->getSymbol()->getText();
767 1213 }
768
769 // Visit children
770
2/2
✓ Branch 0 (19→20) taken 889 times.
✓ Branch 1 (19→50) taken 324 times.
1213 if (ctx->constant()) {
771
3/6
✓ Branch 0 (20→21) taken 889 times.
✗ Branch 1 (20→69) not taken.
✓ Branch 2 (21→22) taken 889 times.
✗ Branch 3 (21→69) not taken.
✓ Branch 4 (22→23) taken 889 times.
✗ Branch 5 (22→67) not taken.
889 attrNode->value = std::any_cast<ConstantNode *>(visit(ctx->constant()));
772
773
2/2
✓ Branch 0 (26→27) taken 446 times.
✓ Branch 1 (26→28) taken 443 times.
889 if (ctx->constant()->STRING_LIT())
774 446 attrNode->type = AttrNode::AttrType::TYPE_STRING;
775
2/2
✓ Branch 0 (30→31) taken 66 times.
✓ Branch 1 (30→32) taken 377 times.
443 else if (ctx->constant()->INT_LIT())
776 66 attrNode->type = AttrNode::AttrType::TYPE_INT;
777
6/6
✓ Branch 0 (34→35) taken 4 times.
✓ Branch 1 (34→38) taken 373 times.
✓ Branch 2 (37→38) taken 3 times.
✓ Branch 3 (37→39) taken 1 times.
✓ Branch 4 (40→41) taken 376 times.
✓ Branch 5 (40→42) taken 1 times.
377 else if (ctx->constant()->TRUE() || ctx->constant()->FALSE())
778 376 attrNode->type = AttrNode::AttrType::TYPE_BOOL;
779 else
780
2/4
✓ Branch 0 (45→46) taken 1 times.
✗ Branch 1 (45→73) not taken.
✓ Branch 2 (46→47) taken 1 times.
✗ Branch 3 (46→70) not taken.
3 throw ParserError(attrNode->value->codeLoc, INVALID_ATTR_VALUE_TYPE, "Invalid attribute value type");
781 } else {
782 // If no value is given, use the bool type
783 324 attrNode->type = AttrNode::AttrType::TYPE_BOOL;
784 }
785
786
1/2
✓ Branch 0 (57→58) taken 1212 times.
✗ Branch 1 (57→79) not taken.
1212 return concludeNode(attrNode);
787 }
788
789 70 std::any ASTBuilder::visitCaseConstant(SpiceParser::CaseConstantContext *ctx) {
790 70 const auto caseConstantNode = createNode<CaseConstantNode>(ctx);
791
792 // Visit children
793
2/2
✓ Branch 0 (4→5) taken 18 times.
✓ Branch 1 (4→10) taken 52 times.
70 if (ctx->constant()) {
794
3/6
✓ Branch 0 (5→6) taken 18 times.
✗ Branch 1 (5→61) not taken.
✓ Branch 2 (6→7) taken 18 times.
✗ Branch 3 (6→61) not taken.
✓ Branch 4 (7→8) taken 18 times.
✗ Branch 5 (7→59) not taken.
18 caseConstantNode->constant = std::any_cast<ConstantNode *>(visit(ctx->constant()));
795
2/4
✓ Branch 0 (10→11) taken 52 times.
✗ Branch 1 (10→62) not taken.
✓ Branch 2 (13→14) taken 52 times.
✗ Branch 3 (13→48) not taken.
52 } else if (!ctx->TYPE_IDENTIFIER().empty()) {
796
2/2
✓ Branch 0 (46→16) taken 126 times.
✓ Branch 1 (46→47) taken 52 times.
178 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
797
1/2
✓ Branch 0 (17→18) taken 126 times.
✗ Branch 1 (17→19) not taken.
126 const auto terminal = dynamic_cast<TerminalNode *>(subTree);
798
1/2
✗ Branch 0 (20→21) not taken.
✓ Branch 1 (20→22) taken 126 times.
126 if (!terminal)
799 continue;
800
801
3/6
✓ Branch 0 (22→23) taken 126 times.
✗ Branch 1 (22→69) not taken.
✓ Branch 2 (23→24) taken 126 times.
✗ Branch 3 (23→69) not taken.
✗ Branch 4 (24→25) not taken.
✓ Branch 5 (24→33) taken 126 times.
126 if (terminal->getSymbol()->getType() == SpiceParser::IDENTIFIER) {
802 const std::string fragment = getIdentifier(terminal, false);
803 caseConstantNode->identifierFragments.push_back(fragment);
804 if (!caseConstantNode->fqIdentifier.empty())
805 caseConstantNode->fqIdentifier += SCOPE_ACCESS_TOKEN;
806 caseConstantNode->fqIdentifier += fragment;
807
4/6
✓ Branch 0 (33→34) taken 126 times.
✗ Branch 1 (33→69) not taken.
✓ Branch 2 (34→35) taken 126 times.
✗ Branch 3 (34→69) not taken.
✓ Branch 4 (35→36) taken 89 times.
✓ Branch 5 (35→44) taken 37 times.
126 } else if (terminal->getSymbol()->getType() == SpiceParser::TYPE_IDENTIFIER) {
808
1/2
✓ Branch 0 (36→37) taken 89 times.
✗ Branch 1 (36→68) not taken.
89 const std::string fragment = getIdentifier(terminal, false);
809
1/2
✓ Branch 0 (37→38) taken 89 times.
✗ Branch 1 (37→66) not taken.
89 caseConstantNode->identifierFragments.push_back(fragment);
810
2/2
✓ Branch 0 (39→40) taken 37 times.
✓ Branch 1 (39→41) taken 52 times.
89 if (!caseConstantNode->fqIdentifier.empty())
811
1/2
✓ Branch 0 (40→41) taken 37 times.
✗ Branch 1 (40→66) not taken.
37 caseConstantNode->fqIdentifier += SCOPE_ACCESS_TOKEN;
812
1/2
✓ Branch 0 (41→42) taken 89 times.
✗ Branch 1 (41→66) not taken.
89 caseConstantNode->fqIdentifier += fragment;
813 89 }
814 }
815 } else {
816 assert_fail("Unknown case constant type"); // GCOV_EXCL_LINE
817 }
818
819
1/2
✓ Branch 0 (55→56) taken 70 times.
✗ Branch 1 (55→70) not taken.
70 return concludeNode(caseConstantNode);
820 }
821
822 9006 std::any ASTBuilder::visitReturnStmt(SpiceParser::ReturnStmtContext *ctx) {
823 9006 const auto returnStmtNode = createNode<ReturnStmtNode>(ctx);
824
825 // Visit children
826
2/2
✓ Branch 0 (4→5) taken 8783 times.
✓ Branch 1 (4→10) taken 223 times.
9006 if (ctx->assignExpr()) {
827 8783 returnStmtNode->hasReturnValue = true;
828
3/6
✓ Branch 0 (5→6) taken 8783 times.
✗ Branch 1 (5→22) not taken.
✓ Branch 2 (6→7) taken 8783 times.
✗ Branch 3 (6→22) not taken.
✓ Branch 4 (7→8) taken 8783 times.
✗ Branch 5 (7→20) not taken.
8783 returnStmtNode->assignExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
829 }
830
831
1/2
✓ Branch 0 (16→17) taken 9006 times.
✗ Branch 1 (16→23) not taken.
9006 return concludeNode(returnStmtNode);
832 }
833
834 108 std::any ASTBuilder::visitBreakStmt(SpiceParser::BreakStmtContext *ctx) {
835 108 const auto breakStmtNode = createNode<BreakStmtNode>(ctx);
836
837 // Extract number of breaks
838
2/2
✓ Branch 0 (4→5) taken 6 times.
✓ Branch 1 (4→10) taken 102 times.
108 if (ctx->INT_LIT())
839
3/6
✓ Branch 0 (5→6) taken 6 times.
✗ Branch 1 (5→24) not taken.
✓ Branch 2 (6→7) taken 6 times.
✗ Branch 3 (6→24) not taken.
✓ Branch 4 (7→8) taken 6 times.
✗ Branch 5 (7→22) not taken.
6 breakStmtNode->breakTimes = std::stoi(ctx->INT_LIT()->toString());
840
841 // Visit children
842
1/2
✓ Branch 0 (10→11) taken 108 times.
✗ Branch 1 (10→25) not taken.
108 visitChildren(ctx);
843
844
1/2
✓ Branch 0 (18→19) taken 108 times.
✗ Branch 1 (18→26) not taken.
108 return concludeNode(breakStmtNode);
845 }
846
847 189 std::any ASTBuilder::visitContinueStmt(SpiceParser::ContinueStmtContext *ctx) {
848 189 const auto continueStmtNode = createNode<ContinueStmtNode>(ctx);
849
850 // Extract number of continues
851
2/2
✓ Branch 0 (4→5) taken 188 times.
✓ Branch 1 (4→10) taken 1 times.
189 if (ctx->INT_LIT())
852
3/6
✓ Branch 0 (5→6) taken 188 times.
✗ Branch 1 (5→24) not taken.
✓ Branch 2 (6→7) taken 188 times.
✗ Branch 3 (6→24) not taken.
✓ Branch 4 (7→8) taken 188 times.
✗ Branch 5 (7→22) not taken.
188 continueStmtNode->continueTimes = std::stoi(ctx->INT_LIT()->toString());
853
854 // Visit children
855
1/2
✓ Branch 0 (10→11) taken 189 times.
✗ Branch 1 (10→25) not taken.
189 visitChildren(ctx);
856
857
1/2
✓ Branch 0 (18→19) taken 189 times.
✗ Branch 1 (18→26) not taken.
189 return concludeNode(continueStmtNode);
858 }
859
860 6 std::any ASTBuilder::visitFallthroughStmt(SpiceParser::FallthroughStmtContext *ctx) {
861 6 const auto fallthroughStmtNode = createNode<FallthroughStmtNode>(ctx);
862
863 // Visit children
864
1/2
✓ Branch 0 (3→4) taken 6 times.
✗ Branch 1 (3→15) not taken.
6 visitChildren(ctx);
865
866
1/2
✓ Branch 0 (11→12) taken 6 times.
✗ Branch 1 (11→16) not taken.
6 return concludeNode(fallthroughStmtNode);
867 }
868
869 707 std::any ASTBuilder::visitAssertStmt(SpiceParser::AssertStmtContext *ctx) {
870
1/2
✓ Branch 0 (2→3) taken 707 times.
✗ Branch 1 (2→30) not taken.
707 const auto assertStmtNode = createNode<AssertStmtNode>(ctx);
871
872 // Enrich
873
5/10
✓ Branch 0 (3→4) taken 707 times.
✗ Branch 1 (3→30) not taken.
✓ Branch 2 (4→5) taken 707 times.
✗ Branch 3 (4→30) not taken.
✓ Branch 4 (5→6) taken 707 times.
✗ Branch 5 (5→30) not taken.
✓ Branch 6 (6→7) taken 707 times.
✗ Branch 7 (6→30) not taken.
✓ Branch 8 (7→8) taken 707 times.
✗ Branch 9 (7→30) not taken.
707 const antlr4::misc::Interval interval(ctx->assignExpr()->start->getStartIndex(), ctx->assignExpr()->stop->getStopIndex());
874
1/2
✓ Branch 0 (8→9) taken 707 times.
✗ Branch 1 (8→25) not taken.
707 assertStmtNode->expressionString = inputStream->getText(interval);
875
876 // Visit children
877
3/6
✓ Branch 0 (11→12) taken 707 times.
✗ Branch 1 (11→28) not taken.
✓ Branch 2 (12→13) taken 707 times.
✗ Branch 3 (12→28) not taken.
✓ Branch 4 (13→14) taken 707 times.
✗ Branch 5 (13→26) not taken.
707 assertStmtNode->assignExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
878
879
1/2
✓ Branch 0 (21→22) taken 707 times.
✗ Branch 1 (21→29) not taken.
707 return concludeNode(assertStmtNode);
880 }
881
882 2075 std::any ASTBuilder::visitBuiltinCall(SpiceParser::BuiltinCallContext *ctx) {
883 2075 const auto builtinCallNode = createNode<BuiltinCallNode>(ctx);
884
885
2/2
✓ Branch 0 (4→5) taken 808 times.
✓ Branch 1 (4→10) taken 1267 times.
2075 if (ctx->printfCall()) {
886
3/6
✓ Branch 0 (5→6) taken 808 times.
✗ Branch 1 (5→65) not taken.
✓ Branch 2 (6→7) taken 808 times.
✗ Branch 3 (6→65) not taken.
✓ Branch 4 (7→8) taken 808 times.
✗ Branch 5 (7→63) not taken.
808 builtinCallNode->printfCall = std::any_cast<PrintfCallNode *>(visit(ctx->printfCall()));
887
2/2
✓ Branch 0 (11→12) taken 244 times.
✓ Branch 1 (11→17) taken 1023 times.
1267 } else if (ctx->sizeOfCall()) {
888
3/6
✓ Branch 0 (12→13) taken 244 times.
✗ Branch 1 (12→68) not taken.
✓ Branch 2 (13→14) taken 244 times.
✗ Branch 3 (13→68) not taken.
✓ Branch 4 (14→15) taken 244 times.
✗ Branch 5 (14→66) not taken.
244 builtinCallNode->sizeofCall = std::any_cast<SizeofCallNode *>(visit(ctx->sizeOfCall()));
889
2/2
✓ Branch 0 (18→19) taken 11 times.
✓ Branch 1 (18→24) taken 1012 times.
1023 } else if (ctx->alignOfCall()) {
890
3/6
✓ Branch 0 (19→20) taken 11 times.
✗ Branch 1 (19→71) not taken.
✓ Branch 2 (20→21) taken 11 times.
✗ Branch 3 (20→71) not taken.
✓ Branch 4 (21→22) taken 11 times.
✗ Branch 5 (21→69) not taken.
11 builtinCallNode->alignofCall = std::any_cast<AlignofCallNode *>(visit(ctx->alignOfCall()));
891
2/2
✓ Branch 0 (25→26) taken 2 times.
✓ Branch 1 (25→31) taken 1010 times.
1012 } else if (ctx->typeIdCall()) {
892
3/6
✓ Branch 0 (26→27) taken 2 times.
✗ Branch 1 (26→74) not taken.
✓ Branch 2 (27→28) taken 2 times.
✗ Branch 3 (27→74) not taken.
✓ Branch 4 (28→29) taken 2 times.
✗ Branch 5 (28→72) not taken.
2 builtinCallNode->typeidCall = std::any_cast<TypeidCallNode *>(visit(ctx->typeIdCall()));
893
2/2
✓ Branch 0 (32→33) taken 122 times.
✓ Branch 1 (32→38) taken 888 times.
1010 } else if (ctx->lenCall()) {
894
3/6
✓ Branch 0 (33→34) taken 122 times.
✗ Branch 1 (33→77) not taken.
✓ Branch 2 (34→35) taken 122 times.
✗ Branch 3 (34→77) not taken.
✓ Branch 4 (35→36) taken 122 times.
✗ Branch 5 (35→75) not taken.
122 builtinCallNode->lenCall = std::any_cast<LenCallNode *>(visit(ctx->lenCall()));
895
2/2
✓ Branch 0 (39→40) taken 887 times.
✓ Branch 1 (39→45) taken 1 times.
888 } else if (ctx->panicCall()) {
896
3/6
✓ Branch 0 (40→41) taken 887 times.
✗ Branch 1 (40→80) not taken.
✓ Branch 2 (41→42) taken 887 times.
✗ Branch 3 (41→80) not taken.
✓ Branch 4 (42→43) taken 887 times.
✗ Branch 5 (42→78) not taken.
887 builtinCallNode->panicCall = std::any_cast<PanicCallNode *>(visit(ctx->panicCall()));
897
1/2
✓ Branch 0 (46→47) taken 1 times.
✗ Branch 1 (46→52) not taken.
1 } else if (ctx->sysCall()) {
898
3/6
✓ Branch 0 (47→48) taken 1 times.
✗ Branch 1 (47→83) not taken.
✓ Branch 2 (48→49) taken 1 times.
✗ Branch 3 (48→83) not taken.
✓ Branch 4 (49→50) taken 1 times.
✗ Branch 5 (49→81) not taken.
1 builtinCallNode->sysCall = std::any_cast<SysCallNode *>(visit(ctx->sysCall()));
899 } else {
900 assert_fail("Unknown builtin call"); // GCOV_EXCL_LINE
901 }
902
903
1/2
✓ Branch 0 (59→60) taken 2075 times.
✗ Branch 1 (59→84) not taken.
2075 return concludeNode(builtinCallNode);
904 }
905
906 808 std::any ASTBuilder::visitPrintfCall(SpiceParser::PrintfCallContext *ctx) {
907
1/2
✓ Branch 0 (2→3) taken 808 times.
✗ Branch 1 (2→32) not taken.
808 const auto printfCallNode = createNode<PrintfCallNode>(ctx);
908
909 // Enrich
910
2/4
✓ Branch 0 (3→4) taken 808 times.
✗ Branch 1 (3→32) not taken.
✓ Branch 2 (4→5) taken 808 times.
✗ Branch 3 (4→32) not taken.
808 std::string templatedString = ctx->STRING_LIT()->getText();
911
1/2
✓ Branch 0 (6→7) taken 808 times.
✗ Branch 1 (6→25) not taken.
808 templatedString = templatedString.substr(1, templatedString.size() - 2);
912
1/2
✓ Branch 0 (9→10) taken 808 times.
✗ Branch 1 (9→30) not taken.
808 replaceEscapeChars(templatedString);
913
1/2
✓ Branch 0 (10→11) taken 808 times.
✗ Branch 1 (10→30) not taken.
808 printfCallNode->templatedString = templatedString;
914
915 // Visit children
916
2/4
✓ Branch 0 (11→12) taken 808 times.
✗ Branch 1 (11→28) not taken.
✓ Branch 2 (12→13) taken 808 times.
✗ Branch 3 (12→26) not taken.
808 fetchChildrenIntoVector(printfCallNode->args, ctx->assignExpr());
917
918
1/2
✓ Branch 0 (20→21) taken 808 times.
✗ Branch 1 (20→29) not taken.
1616 return concludeNode(printfCallNode);
919 808 }
920
921 244 std::any ASTBuilder::visitSizeOfCall(SpiceParser::SizeOfCallContext *ctx) {
922 244 const auto sizeofCallNode = createNode<SizeofCallNode>(ctx);
923
924 // Visit children
925
2/2
✓ Branch 0 (4→5) taken 20 times.
✓ Branch 1 (4→10) taken 224 times.
244 if (ctx->assignExpr()) {
926
3/6
✓ Branch 0 (5→6) taken 20 times.
✗ Branch 1 (5→27) not taken.
✓ Branch 2 (6→7) taken 20 times.
✗ Branch 3 (6→27) not taken.
✓ Branch 4 (7→8) taken 20 times.
✗ Branch 5 (7→25) not taken.
20 sizeofCallNode->assignExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
927 } else {
928 224 sizeofCallNode->isType = true;
929
3/6
✓ Branch 0 (10→11) taken 224 times.
✗ Branch 1 (10→30) not taken.
✓ Branch 2 (11→12) taken 224 times.
✗ Branch 3 (11→30) not taken.
✓ Branch 4 (12→13) taken 224 times.
✗ Branch 5 (12→28) not taken.
224 sizeofCallNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
930 }
931
932
1/2
✓ Branch 0 (21→22) taken 244 times.
✗ Branch 1 (21→31) not taken.
244 return concludeNode(sizeofCallNode);
933 }
934
935 11 std::any ASTBuilder::visitAlignOfCall(SpiceParser::AlignOfCallContext *ctx) {
936 11 const auto alignofCallNode = createNode<AlignofCallNode>(ctx);
937
938 // Visit children
939
2/2
✓ Branch 0 (4→5) taken 10 times.
✓ Branch 1 (4→10) taken 1 times.
11 if (ctx->assignExpr()) {
940
3/6
✓ Branch 0 (5→6) taken 10 times.
✗ Branch 1 (5→27) not taken.
✓ Branch 2 (6→7) taken 10 times.
✗ Branch 3 (6→27) not taken.
✓ Branch 4 (7→8) taken 10 times.
✗ Branch 5 (7→25) not taken.
10 alignofCallNode->assignExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
941 } else {
942 1 alignofCallNode->isType = true;
943
3/6
✓ Branch 0 (10→11) taken 1 times.
✗ Branch 1 (10→30) not taken.
✓ Branch 2 (11→12) taken 1 times.
✗ Branch 3 (11→30) not taken.
✓ Branch 4 (12→13) taken 1 times.
✗ Branch 5 (12→28) not taken.
1 alignofCallNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
944 }
945
946
1/2
✓ Branch 0 (21→22) taken 11 times.
✗ Branch 1 (21→31) not taken.
11 return concludeNode(alignofCallNode);
947 }
948
949 2 std::any ASTBuilder::visitTypeIdCall(SpiceParser::TypeIdCallContext *ctx) {
950 2 const auto typeidCallNode = createNode<TypeidCallNode>(ctx);
951
952 // Visit children
953
2/2
✓ Branch 0 (4→5) taken 1 times.
✓ Branch 1 (4→10) taken 1 times.
2 if (ctx->assignExpr()) {
954
3/6
✓ Branch 0 (5→6) taken 1 times.
✗ Branch 1 (5→27) not taken.
✓ Branch 2 (6→7) taken 1 times.
✗ Branch 3 (6→27) not taken.
✓ Branch 4 (7→8) taken 1 times.
✗ Branch 5 (7→25) not taken.
1 typeidCallNode->assignExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
955 } else {
956 1 typeidCallNode->isType = true;
957
3/6
✓ Branch 0 (10→11) taken 1 times.
✗ Branch 1 (10→30) not taken.
✓ Branch 2 (11→12) taken 1 times.
✗ Branch 3 (11→30) not taken.
✓ Branch 4 (12→13) taken 1 times.
✗ Branch 5 (12→28) not taken.
1 typeidCallNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
958 }
959
960
1/2
✓ Branch 0 (21→22) taken 2 times.
✗ Branch 1 (21→31) not taken.
2 return concludeNode(typeidCallNode);
961 }
962
963 122 std::any ASTBuilder::visitLenCall(SpiceParser::LenCallContext *ctx) {
964 122 const auto lenCallNode = createNode<LenCallNode>(ctx);
965
966 // Visit children
967
3/6
✓ Branch 0 (3→4) taken 122 times.
✗ Branch 1 (3→19) not taken.
✓ Branch 2 (4→5) taken 122 times.
✗ Branch 3 (4→19) not taken.
✓ Branch 4 (5→6) taken 122 times.
✗ Branch 5 (5→17) not taken.
122 lenCallNode->assignExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
968
969
1/2
✓ Branch 0 (13→14) taken 122 times.
✗ Branch 1 (13→20) not taken.
122 return concludeNode(lenCallNode);
970 }
971
972 887 std::any ASTBuilder::visitPanicCall(SpiceParser::PanicCallContext *ctx) {
973 887 const auto panicCallNode = createNode<PanicCallNode>(ctx);
974
975 // Visit children
976
3/6
✓ Branch 0 (3→4) taken 887 times.
✗ Branch 1 (3→19) not taken.
✓ Branch 2 (4→5) taken 887 times.
✗ Branch 3 (4→19) not taken.
✓ Branch 4 (5→6) taken 887 times.
✗ Branch 5 (5→17) not taken.
887 panicCallNode->assignExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
977
978
1/2
✓ Branch 0 (13→14) taken 887 times.
✗ Branch 1 (13→20) not taken.
887 return concludeNode(panicCallNode);
979 }
980
981 1 std::any ASTBuilder::visitSysCall(SpiceParser::SysCallContext *ctx) {
982 1 const auto sysCallNode = createNode<SysCallNode>(ctx);
983
984 // Visit children
985
2/4
✓ Branch 0 (3→4) taken 1 times.
✗ Branch 1 (3→18) not taken.
✓ Branch 2 (4→5) taken 1 times.
✗ Branch 3 (4→16) not taken.
1 fetchChildrenIntoVector(sysCallNode->args, ctx->assignExpr());
986
987
1/2
✓ Branch 0 (12→13) taken 1 times.
✗ Branch 1 (12→19) not taken.
1 return concludeNode(sysCallNode);
988 }
989
990 71485 std::any ASTBuilder::visitAssignExpr(SpiceParser::AssignExprContext *ctx) {
991 71485 const auto assignExprNode = createNode<AssignExprNode>(ctx);
992
993 // Visit children
994
2/2
✓ Branch 0 (4→5) taken 64337 times.
✓ Branch 1 (4→10) taken 7148 times.
71485 if (ctx->ternaryExpr()) {
995
4/6
✓ Branch 0 (5→6) taken 64337 times.
✗ Branch 1 (5→37) not taken.
✓ Branch 2 (6→7) taken 64335 times.
✓ Branch 3 (6→37) taken 2 times.
✓ Branch 4 (7→8) taken 64335 times.
✗ Branch 5 (7→35) not taken.
64337 assignExprNode->ternaryExpr = std::any_cast<TernaryExprNode *>(visit(ctx->ternaryExpr()));
996
1/2
✓ Branch 0 (11→12) taken 7148 times.
✗ Branch 1 (11→24) not taken.
7148 } else if (ctx->prefixUnaryExpr()) {
997
3/6
✓ Branch 0 (12→13) taken 7148 times.
✗ Branch 1 (12→40) not taken.
✓ Branch 2 (13→14) taken 7148 times.
✗ Branch 3 (13→40) not taken.
✓ Branch 4 (14→15) taken 7148 times.
✗ Branch 5 (14→38) not taken.
7148 assignExprNode->lhs = std::any_cast<PrefixUnaryExprNode *>(visit(ctx->prefixUnaryExpr()));
998
2/4
✓ Branch 0 (16→17) taken 7148 times.
✗ Branch 1 (16→41) not taken.
✓ Branch 2 (17→18) taken 7148 times.
✗ Branch 3 (17→41) not taken.
7148 visit(ctx->assignOp());
999
3/6
✓ Branch 0 (19→20) taken 7148 times.
✗ Branch 1 (19→44) not taken.
✓ Branch 2 (20→21) taken 7148 times.
✗ Branch 3 (20→44) not taken.
✓ Branch 4 (21→22) taken 7148 times.
✗ Branch 5 (21→42) not taken.
7148 assignExprNode->rhs = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
1000 } else {
1001 assert_fail("Invalid assign expression"); // GCOV_EXCL_LINE
1002 }
1003
1004
1/2
✓ Branch 0 (31→32) taken 71483 times.
✗ Branch 1 (31→45) not taken.
71483 return concludeNode(assignExprNode);
1005 }
1006
1007 64542 std::any ASTBuilder::visitTernaryExpr(SpiceParser::TernaryExprContext *ctx) {
1008 64542 const auto ternaryExprNode = createNode<TernaryExprNode>(ctx);
1009
1010
4/6
✓ Branch 0 (3→4) taken 64542 times.
✗ Branch 1 (3→41) not taken.
✓ Branch 2 (4→5) taken 64540 times.
✓ Branch 3 (4→41) taken 2 times.
✓ Branch 4 (5→6) taken 64540 times.
✗ Branch 5 (5→39) not taken.
64542 ternaryExprNode->condition = std::any_cast<LogicalOrExprNode *>(visit(ctx->logicalOrExpr(0)));
1011
3/4
✓ Branch 0 (7→8) taken 64540 times.
✗ Branch 1 (7→42) not taken.
✓ Branch 2 (10→11) taken 432 times.
✓ Branch 3 (10→20) taken 64108 times.
64540 if (ctx->logicalOrExpr().size() == 3) {
1012
3/6
✓ Branch 0 (11→12) taken 432 times.
✗ Branch 1 (11→45) not taken.
✓ Branch 2 (12→13) taken 432 times.
✗ Branch 3 (12→45) not taken.
✓ Branch 4 (13→14) taken 432 times.
✗ Branch 5 (13→43) not taken.
432 ternaryExprNode->trueExpr = std::any_cast<LogicalOrExprNode *>(visit(ctx->logicalOrExpr(1)));
1013
3/6
✓ Branch 0 (15→16) taken 432 times.
✗ Branch 1 (15→48) not taken.
✓ Branch 2 (16→17) taken 432 times.
✗ Branch 3 (16→48) not taken.
✓ Branch 4 (17→18) taken 432 times.
✗ Branch 5 (17→46) not taken.
432 ternaryExprNode->falseExpr = std::any_cast<LogicalOrExprNode *>(visit(ctx->logicalOrExpr(2)));
1014
3/4
✓ Branch 0 (20→21) taken 64108 times.
✗ Branch 1 (20→49) not taken.
✓ Branch 2 (23→24) taken 1 times.
✓ Branch 3 (23→29) taken 64107 times.
64108 } else if (ctx->logicalOrExpr().size() == 2) {
1015 1 ternaryExprNode->isShortened = true;
1016
3/6
✓ Branch 0 (24→25) taken 1 times.
✗ Branch 1 (24→52) not taken.
✓ Branch 2 (25→26) taken 1 times.
✗ Branch 3 (25→52) not taken.
✓ Branch 4 (26→27) taken 1 times.
✗ Branch 5 (26→50) not taken.
1 ternaryExprNode->falseExpr = std::any_cast<LogicalOrExprNode *>(visit(ctx->logicalOrExpr(1)));
1017 }
1018
1019
1/2
✓ Branch 0 (35→36) taken 64540 times.
✗ Branch 1 (35→53) not taken.
64540 return concludeNode(ternaryExprNode);
1020 }
1021
1022 65407 std::any ASTBuilder::visitLogicalOrExpr(SpiceParser::LogicalOrExprContext *ctx) {
1023 65407 const auto logicalOrExprNode = createNode<LogicalOrExprNode>(ctx);
1024
1025 // Visit children
1026
3/4
✓ Branch 0 (3→4) taken 65407 times.
✗ Branch 1 (3→18) not taken.
✓ Branch 2 (4→5) taken 65405 times.
✓ Branch 3 (4→16) taken 2 times.
65409 fetchChildrenIntoVector(logicalOrExprNode->operands, ctx->logicalAndExpr());
1027
1028
1/2
✓ Branch 0 (12→13) taken 65405 times.
✗ Branch 1 (12→19) not taken.
65405 return concludeNode(logicalOrExprNode);
1029 }
1030
1031 66610 std::any ASTBuilder::visitLogicalAndExpr(SpiceParser::LogicalAndExprContext *ctx) {
1032 66610 const auto logicalAndExprNode = createNode<LogicalAndExprNode>(ctx);
1033
1034 // Visit children
1035
3/4
✓ Branch 0 (3→4) taken 66610 times.
✗ Branch 1 (3→18) not taken.
✓ Branch 2 (4→5) taken 66608 times.
✓ Branch 3 (4→16) taken 2 times.
66612 fetchChildrenIntoVector(logicalAndExprNode->operands, ctx->bitwiseOrExpr());
1036
1037
1/2
✓ Branch 0 (12→13) taken 66608 times.
✗ Branch 1 (12→19) not taken.
66608 return concludeNode(logicalAndExprNode);
1038 }
1039
1040 66872 std::any ASTBuilder::visitBitwiseOrExpr(SpiceParser::BitwiseOrExprContext *ctx) {
1041 66872 const auto bitwiseOrExprNode = createNode<BitwiseOrExprNode>(ctx);
1042
1043 // Visit children
1044
3/4
✓ Branch 0 (3→4) taken 66872 times.
✗ Branch 1 (3→18) not taken.
✓ Branch 2 (4→5) taken 66870 times.
✓ Branch 3 (4→16) taken 2 times.
66874 fetchChildrenIntoVector(bitwiseOrExprNode->operands, ctx->bitwiseXorExpr());
1045
1046
1/2
✓ Branch 0 (12→13) taken 66870 times.
✗ Branch 1 (12→19) not taken.
66870 return concludeNode(bitwiseOrExprNode);
1047 }
1048
1049 66948 std::any ASTBuilder::visitBitwiseXorExpr(SpiceParser::BitwiseXorExprContext *ctx) {
1050 66948 const auto bitwiseXorExprNode = createNode<BitwiseXorExprNode>(ctx);
1051
1052 // Visit children
1053
3/4
✓ Branch 0 (3→4) taken 66948 times.
✗ Branch 1 (3→18) not taken.
✓ Branch 2 (4→5) taken 66946 times.
✓ Branch 3 (4→16) taken 2 times.
66950 fetchChildrenIntoVector(bitwiseXorExprNode->operands, ctx->bitwiseAndExpr());
1054
1055
1/2
✓ Branch 0 (12→13) taken 66946 times.
✗ Branch 1 (12→19) not taken.
66946 return concludeNode(bitwiseXorExprNode);
1056 }
1057
1058 66959 std::any ASTBuilder::visitBitwiseAndExpr(SpiceParser::BitwiseAndExprContext *ctx) {
1059 66959 const auto bitwiseAndExprNode = createNode<BitwiseAndExprNode>(ctx);
1060
1061 // Visit children
1062
3/4
✓ Branch 0 (3→4) taken 66959 times.
✗ Branch 1 (3→18) not taken.
✓ Branch 2 (4→5) taken 66957 times.
✓ Branch 3 (4→16) taken 2 times.
66961 fetchChildrenIntoVector(bitwiseAndExprNode->operands, ctx->equalityExpr());
1063
1064
1/2
✓ Branch 0 (12→13) taken 66957 times.
✗ Branch 1 (12→19) not taken.
66957 return concludeNode(bitwiseAndExprNode);
1065 }
1066
1067 66983 std::any ASTBuilder::visitEqualityExpr(SpiceParser::EqualityExprContext *ctx) {
1068 66983 const auto equalityExprNode = createNode<EqualityExprNode>(ctx);
1069
1070 // Visit children
1071
3/4
✓ Branch 0 (3→4) taken 66983 times.
✗ Branch 1 (3→24) not taken.
✓ Branch 2 (4→5) taken 66981 times.
✓ Branch 3 (4→22) taken 2 times.
66985 fetchChildrenIntoVector(equalityExprNode->operands, ctx->relationalExpr());
1072
1073 // Extract operator
1074
2/2
✓ Branch 0 (7→8) taken 3600 times.
✓ Branch 1 (7→9) taken 63381 times.
66981 if (ctx->EQUAL())
1075 3600 equalityExprNode->op = EqualityExprNode::EqualityOp::OP_EQUAL;
1076
2/2
✓ Branch 0 (10→11) taken 1272 times.
✓ Branch 1 (10→12) taken 62109 times.
63381 else if (ctx->NOT_EQUAL())
1077 1272 equalityExprNode->op = EqualityExprNode::EqualityOp::OP_NOT_EQUAL;
1078
1079
1/2
✓ Branch 0 (18→19) taken 66981 times.
✗ Branch 1 (18→25) not taken.
66981 return concludeNode(equalityExprNode);
1080 }
1081
1082 71855 std::any ASTBuilder::visitRelationalExpr(SpiceParser::RelationalExprContext *ctx) {
1083 71855 const auto relationalExprNode = createNode<RelationalExprNode>(ctx);
1084
1085 // Visit children
1086
3/4
✓ Branch 0 (3→4) taken 71855 times.
✗ Branch 1 (3→30) not taken.
✓ Branch 2 (4→5) taken 71853 times.
✓ Branch 3 (4→28) taken 2 times.
71857 fetchChildrenIntoVector(relationalExprNode->operands, ctx->shiftExpr());
1087
1088 // Extract operator
1089
2/2
✓ Branch 0 (7→8) taken 1933 times.
✓ Branch 1 (7→9) taken 69920 times.
71853 if (ctx->LESS())
1090 1933 relationalExprNode->op = RelationalExprNode::RelationalOp::OP_LESS;
1091
2/2
✓ Branch 0 (10→11) taken 640 times.
✓ Branch 1 (10→12) taken 69280 times.
69920 else if (ctx->GREATER())
1092 640 relationalExprNode->op = RelationalExprNode::RelationalOp::OP_GREATER;
1093
2/2
✓ Branch 0 (13→14) taken 323 times.
✓ Branch 1 (13→15) taken 68957 times.
69280 else if (ctx->LESS_EQUAL())
1094 323 relationalExprNode->op = RelationalExprNode::RelationalOp::OP_LESS_EQUAL;
1095
2/2
✓ Branch 0 (16→17) taken 784 times.
✓ Branch 1 (16→18) taken 68173 times.
68957 else if (ctx->GREATER_EQUAL())
1096 784 relationalExprNode->op = RelationalExprNode::RelationalOp::OP_GREATER_EQUAL;
1097
1098
1/2
✓ Branch 0 (24→25) taken 71853 times.
✗ Branch 1 (24→31) not taken.
71853 return concludeNode(relationalExprNode);
1099 }
1100
1101 75535 std::any ASTBuilder::visitShiftExpr(SpiceParser::ShiftExprContext *ctx) {
1102 75535 const auto shiftExprNode = createNode<ShiftExprNode>(ctx);
1103
1104 // Visit children
1105
3/4
✓ Branch 0 (3→4) taken 75535 times.
✗ Branch 1 (3→48) not taken.
✓ Branch 2 (4→5) taken 75533 times.
✓ Branch 3 (4→46) taken 2 times.
75537 fetchChildrenIntoVector(shiftExprNode->operands, ctx->additiveExpr());
1106
1107 75533 bool seenFirstLess = false;
1108 75533 bool seenFirstGreater = false;
1109
2/2
✓ Branch 0 (31→8) taken 75926 times.
✓ Branch 1 (31→32) taken 75533 times.
151459 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
1110
1/2
✓ Branch 0 (9→10) taken 75926 times.
✗ Branch 1 (9→11) not taken.
75926 const auto terminal = dynamic_cast<TerminalNode *>(subTree);
1111
2/2
✓ Branch 0 (12→13) taken 75664 times.
✓ Branch 1 (12→14) taken 262 times.
75926 if (!terminal)
1112 75664 continue;
1113
1114
4/6
✓ Branch 0 (14→15) taken 262 times.
✗ Branch 1 (14→53) not taken.
✓ Branch 2 (15→16) taken 262 times.
✗ Branch 3 (15→53) not taken.
✓ Branch 4 (16→17) taken 154 times.
✓ Branch 5 (16→21) taken 108 times.
262 if (terminal->getSymbol()->getType() == SpiceParser::LESS) {
1115
2/2
✓ Branch 0 (17→18) taken 77 times.
✓ Branch 1 (17→20) taken 77 times.
154 if (seenFirstLess)
1116
1/2
✓ Branch 0 (18→19) taken 77 times.
✗ Branch 1 (18→49) not taken.
77 shiftExprNode->opQueue.emplace(ShiftExprNode::ShiftOp::OP_SHIFT_LEFT, TY_INVALID);
1117 154 seenFirstLess = !seenFirstLess;
1118 154 continue;
1119 }
1120
1121
3/6
✓ Branch 0 (21→22) taken 108 times.
✗ Branch 1 (21→53) not taken.
✓ Branch 2 (22→23) taken 108 times.
✗ Branch 3 (22→53) not taken.
✓ Branch 4 (23→24) taken 108 times.
✗ Branch 5 (23→28) not taken.
108 if (terminal->getSymbol()->getType() == SpiceParser::GREATER) {
1122
2/2
✓ Branch 0 (24→25) taken 54 times.
✓ Branch 1 (24→27) taken 54 times.
108 if (seenFirstGreater)
1123
1/2
✓ Branch 0 (25→26) taken 54 times.
✗ Branch 1 (25→51) not taken.
54 shiftExprNode->opQueue.emplace(ShiftExprNode::ShiftOp::OP_SHIFT_RIGHT, TY_INVALID);
1124 108 seenFirstGreater = !seenFirstGreater;
1125 108 continue;
1126 }
1127
1128 assert_fail("Invalid terminal symbol for additive expression"); // GCOV_EXCL_LINE
1129 }
1130
2/4
✓ Branch 0 (32→33) taken 75533 times.
✗ Branch 1 (32→35) not taken.
✓ Branch 2 (33→34) taken 75533 times.
✗ Branch 3 (33→35) not taken.
75533 assert(!seenFirstLess && !seenFirstGreater);
1131
1132
1/2
✓ Branch 0 (42→43) taken 75533 times.
✗ Branch 1 (42→54) not taken.
75533 return concludeNode(shiftExprNode);
1133 }
1134
1135 75666 std::any ASTBuilder::visitAdditiveExpr(SpiceParser::AdditiveExprContext *ctx) {
1136 75666 const auto additiveExprNode = createNode<AdditiveExprNode>(ctx);
1137
1138 // Visit children
1139
3/4
✓ Branch 0 (3→4) taken 75666 times.
✗ Branch 1 (3→40) not taken.
✓ Branch 2 (4→5) taken 75664 times.
✓ Branch 3 (4→38) taken 2 times.
75668 fetchChildrenIntoVector(additiveExprNode->operands, ctx->multiplicativeExpr());
1140
1141
2/2
✓ Branch 0 (27→8) taken 83440 times.
✓ Branch 1 (27→28) taken 75664 times.
159104 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
1142
1/2
✓ Branch 0 (9→10) taken 83440 times.
✗ Branch 1 (9→11) not taken.
83440 const auto terminal = dynamic_cast<TerminalNode *>(subTree);
1143
2/2
✓ Branch 0 (12→13) taken 79552 times.
✓ Branch 1 (12→14) taken 3888 times.
83440 if (!terminal)
1144 79552 continue;
1145
1146
4/6
✓ Branch 0 (14→15) taken 3888 times.
✗ Branch 1 (14→45) not taken.
✓ Branch 2 (15→16) taken 3888 times.
✗ Branch 3 (15→45) not taken.
✓ Branch 4 (16→17) taken 2358 times.
✓ Branch 5 (16→19) taken 1530 times.
3888 if (terminal->getSymbol()->getType() == SpiceParser::PLUS)
1147
1/2
✓ Branch 0 (17→18) taken 2358 times.
✗ Branch 1 (17→41) not taken.
2358 additiveExprNode->opQueue.emplace(AdditiveExprNode::AdditiveOp::OP_PLUS, TY_INVALID);
1148
3/6
✓ Branch 0 (19→20) taken 1530 times.
✗ Branch 1 (19→45) not taken.
✓ Branch 2 (20→21) taken 1530 times.
✗ Branch 3 (20→45) not taken.
✓ Branch 4 (21→22) taken 1530 times.
✗ Branch 5 (21→24) not taken.
1530 else if (terminal->getSymbol()->getType() == SpiceParser::MINUS)
1149
1/2
✓ Branch 0 (22→23) taken 1530 times.
✗ Branch 1 (22→43) not taken.
1530 additiveExprNode->opQueue.emplace(AdditiveExprNode::AdditiveOp::OP_MINUS, TY_INVALID);
1150 else
1151 assert_fail("Invalid terminal symbol for additive expression"); // GCOV_EXCL_LINE
1152 }
1153
1154
1/2
✓ Branch 0 (34→35) taken 75664 times.
✗ Branch 1 (34→46) not taken.
75664 return concludeNode(additiveExprNode);
1155 }
1156
1157 79554 std::any ASTBuilder::visitMultiplicativeExpr(SpiceParser::MultiplicativeExprContext *ctx) {
1158 79554 const auto multiplicativeExprNode = createNode<MultiplicativeExprNode>(ctx);
1159
1160 // Visit children
1161
3/4
✓ Branch 0 (3→4) taken 79554 times.
✗ Branch 1 (3→45) not taken.
✓ Branch 2 (4→5) taken 79552 times.
✓ Branch 3 (4→43) taken 2 times.
79556 fetchChildrenIntoVector(multiplicativeExprNode->operands, ctx->castExpr());
1162
1163
2/2
✓ Branch 0 (32→8) taken 82050 times.
✓ Branch 1 (32→33) taken 79552 times.
161602 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
1164
1/2
✓ Branch 0 (9→10) taken 82050 times.
✗ Branch 1 (9→11) not taken.
82050 const auto terminal = dynamic_cast<TerminalNode *>(subTree);
1165
2/2
✓ Branch 0 (12→13) taken 80801 times.
✓ Branch 1 (12→14) taken 1249 times.
82050 if (!terminal)
1166 80801 continue;
1167
1168
4/6
✓ Branch 0 (14→15) taken 1249 times.
✗ Branch 1 (14→52) not taken.
✓ Branch 2 (15→16) taken 1249 times.
✗ Branch 3 (15→52) not taken.
✓ Branch 4 (16→17) taken 933 times.
✓ Branch 5 (16→19) taken 316 times.
1249 if (terminal->getSymbol()->getType() == SpiceParser::MUL)
1169
1/2
✓ Branch 0 (17→18) taken 933 times.
✗ Branch 1 (17→46) not taken.
933 multiplicativeExprNode->opQueue.emplace(MultiplicativeExprNode::MultiplicativeOp::OP_MUL, TY_INVALID);
1170
4/6
✓ Branch 0 (19→20) taken 316 times.
✗ Branch 1 (19→52) not taken.
✓ Branch 2 (20→21) taken 316 times.
✗ Branch 3 (20→52) not taken.
✓ Branch 4 (21→22) taken 129 times.
✓ Branch 5 (21→24) taken 187 times.
316 else if (terminal->getSymbol()->getType() == SpiceParser::DIV)
1171
1/2
✓ Branch 0 (22→23) taken 129 times.
✗ Branch 1 (22→48) not taken.
129 multiplicativeExprNode->opQueue.emplace(MultiplicativeExprNode::MultiplicativeOp::OP_DIV, TY_INVALID);
1172
3/6
✓ Branch 0 (24→25) taken 187 times.
✗ Branch 1 (24→52) not taken.
✓ Branch 2 (25→26) taken 187 times.
✗ Branch 3 (25→52) not taken.
✓ Branch 4 (26→27) taken 187 times.
✗ Branch 5 (26→29) not taken.
187 else if (terminal->getSymbol()->getType() == SpiceParser::REM)
1173
1/2
✓ Branch 0 (27→28) taken 187 times.
✗ Branch 1 (27→50) not taken.
187 multiplicativeExprNode->opQueue.emplace(MultiplicativeExprNode::MultiplicativeOp::OP_REM, TY_INVALID);
1174 else
1175 assert_fail("Invalid terminal symbol for multiplicative expression"); // GCOV_EXCL_LINE
1176 }
1177
1178
1/2
✓ Branch 0 (39→40) taken 79552 times.
✗ Branch 1 (39→53) not taken.
79552 return concludeNode(multiplicativeExprNode);
1179 }
1180
1181 80803 std::any ASTBuilder::visitCastExpr(SpiceParser::CastExprContext *ctx) {
1182 80803 const auto castExprNode = createNode<CastExprNode>(ctx);
1183
1184
2/2
✓ Branch 0 (4→5) taken 2551 times.
✓ Branch 1 (4→14) taken 78252 times.
80803 if (ctx->dataType()) {
1185
3/6
✓ Branch 0 (5→6) taken 2551 times.
✗ Branch 1 (5→31) not taken.
✓ Branch 2 (6→7) taken 2551 times.
✗ Branch 3 (6→31) not taken.
✓ Branch 4 (7→8) taken 2551 times.
✗ Branch 5 (7→29) not taken.
2551 castExprNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
1186
3/6
✓ Branch 0 (9→10) taken 2551 times.
✗ Branch 1 (9→34) not taken.
✓ Branch 2 (10→11) taken 2551 times.
✗ Branch 3 (10→34) not taken.
✓ Branch 4 (11→12) taken 2551 times.
✗ Branch 5 (11→32) not taken.
2551 castExprNode->assignExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
1187 2551 castExprNode->isCast = true;
1188 } else {
1189
4/6
✓ Branch 0 (14→15) taken 78252 times.
✗ Branch 1 (14→37) not taken.
✓ Branch 2 (15→16) taken 78250 times.
✓ Branch 3 (15→37) taken 2 times.
✓ Branch 4 (16→17) taken 78250 times.
✗ Branch 5 (16→35) not taken.
78252 castExprNode->prefixUnaryExpr = std::any_cast<PrefixUnaryExprNode *>(visit(ctx->prefixUnaryExpr()));
1190 }
1191
1192
1/2
✓ Branch 0 (25→26) taken 80801 times.
✗ Branch 1 (25→38) not taken.
80801 return concludeNode(castExprNode);
1193 }
1194
1195 86603 std::any ASTBuilder::visitPrefixUnaryExpr(SpiceParser::PrefixUnaryExprContext *ctx) {
1196 86603 const auto prefixUnaryExprNode = createNode<PrefixUnaryExprNode>(ctx);
1197
1198 // Visit children
1199
2/2
✓ Branch 0 (4→5) taken 85400 times.
✓ Branch 1 (4→10) taken 1203 times.
86603 if (ctx->postfixUnaryExpr()) {
1200
4/6
✓ Branch 0 (5→6) taken 85400 times.
✗ Branch 1 (5→51) not taken.
✓ Branch 2 (6→7) taken 85398 times.
✓ Branch 3 (6→51) taken 2 times.
✓ Branch 4 (7→8) taken 85398 times.
✗ Branch 5 (7→49) not taken.
85400 prefixUnaryExprNode->postfixUnaryExpr = std::any_cast<PostfixUnaryExprNode *>(visit(ctx->postfixUnaryExpr()));
1201
1/2
✓ Branch 0 (11→12) taken 1203 times.
✗ Branch 1 (11→38) not taken.
1203 } else if (ctx->prefixUnaryExpr()) {
1202 // Extract operator
1203
2/2
✓ Branch 0 (13→14) taken 12 times.
✓ Branch 1 (13→15) taken 1191 times.
1203 if (ctx->MINUS())
1204 12 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_MINUS;
1205
2/2
✓ Branch 0 (16→17) taken 21 times.
✓ Branch 1 (16→18) taken 1170 times.
1191 else if (ctx->PLUS_PLUS())
1206 21 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_PLUS_PLUS;
1207
2/2
✓ Branch 0 (19→20) taken 9 times.
✓ Branch 1 (19→21) taken 1161 times.
1170 else if (ctx->MINUS_MINUS())
1208 9 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_MINUS_MINUS;
1209
2/2
✓ Branch 0 (22→23) taken 788 times.
✓ Branch 1 (22→24) taken 373 times.
1161 else if (ctx->NOT())
1210 788 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_NOT;
1211
2/2
✓ Branch 0 (25→26) taken 1 times.
✓ Branch 1 (25→27) taken 372 times.
373 else if (ctx->BITWISE_NOT())
1212 1 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_BITWISE_NOT;
1213
2/2
✓ Branch 0 (28→29) taken 216 times.
✓ Branch 1 (28→30) taken 156 times.
372 else if (ctx->MUL())
1214 216 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_DEREFERENCE;
1215
1/2
✓ Branch 0 (31→32) taken 156 times.
✗ Branch 1 (31→33) not taken.
156 else if (ctx->BITWISE_AND())
1216 156 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_ADDRESS_OF;
1217
1218
3/6
✓ Branch 0 (33→34) taken 1203 times.
✗ Branch 1 (33→54) not taken.
✓ Branch 2 (34→35) taken 1203 times.
✗ Branch 3 (34→54) not taken.
✓ Branch 4 (35→36) taken 1203 times.
✗ Branch 5 (35→52) not taken.
1203 prefixUnaryExprNode->prefixUnaryExpr = std::any_cast<PrefixUnaryExprNode *>(visit(ctx->prefixUnaryExpr()));
1219 } else {
1220 assert_fail("Unknown prefix unary expression type"); // GCOV_EXCL_LINE
1221 }
1222
1223
1/2
✓ Branch 0 (45→46) taken 86601 times.
✗ Branch 1 (45→55) not taken.
86601 return concludeNode(prefixUnaryExprNode);
1224 }
1225
1226 108436 std::any ASTBuilder::visitPostfixUnaryExpr(SpiceParser::PostfixUnaryExprContext *ctx) {
1227 108436 const auto postfixUnaryExprNode = createNode<PostfixUnaryExprNode>(ctx);
1228
1229
2/2
✓ Branch 0 (4→5) taken 85400 times.
✓ Branch 1 (4→10) taken 23036 times.
108436 if (ctx->atomicExpr()) {
1230
4/6
✓ Branch 0 (5→6) taken 85400 times.
✗ Branch 1 (5→49) not taken.
✓ Branch 2 (6→7) taken 85398 times.
✓ Branch 3 (6→49) taken 2 times.
✓ Branch 4 (7→8) taken 85398 times.
✗ Branch 5 (7→47) not taken.
85400 postfixUnaryExprNode->atomicExpr = std::any_cast<AtomicExprNode *>(visit(ctx->atomicExpr()));
1231
1/2
✓ Branch 0 (11→12) taken 23036 times.
✗ Branch 1 (11→36) not taken.
23036 } else if (ctx->postfixUnaryExpr()) {
1232
3/6
✓ Branch 0 (12→13) taken 23036 times.
✗ Branch 1 (12→52) not taken.
✓ Branch 2 (13→14) taken 23036 times.
✗ Branch 3 (13→52) not taken.
✓ Branch 4 (14→15) taken 23036 times.
✗ Branch 5 (14→50) not taken.
23036 postfixUnaryExprNode->postfixUnaryExpr = std::any_cast<PostfixUnaryExprNode *>(visit(ctx->postfixUnaryExpr()));
1233
1234 // Extract operator
1235
2/2
✓ Branch 0 (17→18) taken 3854 times.
✓ Branch 1 (17→23) taken 19182 times.
23036 if (ctx->assignExpr()) {
1236 3854 postfixUnaryExprNode->op = PostfixUnaryExprNode::PostfixUnaryOp::OP_SUBSCRIPT;
1237
3/6
✓ Branch 0 (18→19) taken 3854 times.
✗ Branch 1 (18→55) not taken.
✓ Branch 2 (19→20) taken 3854 times.
✗ Branch 3 (19→55) not taken.
✓ Branch 4 (20→21) taken 3854 times.
✗ Branch 5 (20→53) not taken.
3854 postfixUnaryExprNode->subscriptIndexExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
1238
2/2
✓ Branch 0 (24→25) taken 16939 times.
✓ Branch 1 (24→30) taken 2243 times.
19182 } else if (ctx->IDENTIFIER()) {
1239 16939 postfixUnaryExprNode->op = PostfixUnaryExprNode::PostfixUnaryOp::OP_MEMBER_ACCESS;
1240
2/4
✓ Branch 0 (25→26) taken 16939 times.
✗ Branch 1 (25→56) not taken.
✓ Branch 2 (26→27) taken 16939 times.
✗ Branch 3 (26→56) not taken.
16939 postfixUnaryExprNode->identifier = getIdentifier(ctx->IDENTIFIER(), false);
1241
2/2
✓ Branch 0 (31→32) taken 1773 times.
✓ Branch 1 (31→33) taken 470 times.
2243 } else if (ctx->PLUS_PLUS()) {
1242 1773 postfixUnaryExprNode->op = PostfixUnaryExprNode::PostfixUnaryOp::OP_PLUS_PLUS;
1243
1/2
✓ Branch 0 (34→35) taken 470 times.
✗ Branch 1 (34→37) not taken.
470 } else if (ctx->MINUS_MINUS()) {
1244 470 postfixUnaryExprNode->op = PostfixUnaryExprNode::PostfixUnaryOp::OP_MINUS_MINUS;
1245 }
1246 } else {
1247 assert_fail("Unknown postfix unary expression type"); // GCOV_EXCL_LINE
1248 }
1249
1250
1/2
✓ Branch 0 (43→44) taken 108434 times.
✗ Branch 1 (43→57) not taken.
108434 return concludeNode(postfixUnaryExprNode);
1251 }
1252
1253 85400 std::any ASTBuilder::visitAtomicExpr(SpiceParser::AtomicExprContext *ctx) {
1254 85400 const auto atomicExprNode = createNode<AtomicExprNode>(ctx);
1255
1256 // Visit children
1257
2/2
✓ Branch 0 (4→5) taken 15111 times.
✓ Branch 1 (4→10) taken 70289 times.
85400 if (ctx->constant()) {
1258
4/6
✓ Branch 0 (5→6) taken 15111 times.
✗ Branch 1 (5→91) not taken.
✓ Branch 2 (6→7) taken 15109 times.
✓ Branch 3 (6→91) taken 2 times.
✓ Branch 4 (7→8) taken 15109 times.
✗ Branch 5 (7→89) not taken.
15111 atomicExprNode->constant = std::any_cast<ConstantNode *>(visit(ctx->constant()));
1259
2/2
✓ Branch 0 (11→12) taken 16919 times.
✓ Branch 1 (11→17) taken 53370 times.
70289 } else if (ctx->value()) {
1260
3/6
✓ Branch 0 (12→13) taken 16919 times.
✗ Branch 1 (12→94) not taken.
✓ Branch 2 (13→14) taken 16919 times.
✗ Branch 3 (13→94) not taken.
✓ Branch 4 (14→15) taken 16919 times.
✗ Branch 5 (14→92) not taken.
16919 atomicExprNode->value = std::any_cast<ValueNode *>(visit(ctx->value()));
1261
11/18
✓ Branch 0 (17→18) taken 53370 times.
✗ Branch 1 (17→95) not taken.
✓ Branch 2 (19→20) taken 4404 times.
✓ Branch 3 (19→23) taken 48966 times.
✓ Branch 4 (20→21) taken 4404 times.
✗ Branch 5 (20→95) not taken.
✓ Branch 6 (22→23) taken 1679 times.
✓ Branch 7 (22→24) taken 2725 times.
✓ Branch 8 (25→26) taken 4404 times.
✓ Branch 9 (25→27) taken 48966 times.
✓ Branch 10 (27→28) taken 53370 times.
✗ Branch 11 (27→29) not taken.
✓ Branch 12 (29→30) taken 50645 times.
✓ Branch 13 (29→64) taken 2725 times.
✗ Branch 14 (95→96) not taken.
✗ Branch 15 (95→97) not taken.
✗ Branch 16 (99→100) not taken.
✗ Branch 17 (99→101) not taken.
53370 } else if (!ctx->IDENTIFIER().empty() || !ctx->TYPE_IDENTIFIER().empty()) {
1262
2/2
✓ Branch 0 (62→32) taken 51209 times.
✓ Branch 1 (62→63) taken 50645 times.
101854 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
1263
1/2
✓ Branch 0 (33→34) taken 51209 times.
✗ Branch 1 (33→35) not taken.
51209 const auto terminal = dynamic_cast<TerminalNode *>(subTree);
1264
1/2
✗ Branch 0 (36→37) not taken.
✓ Branch 1 (36→38) taken 51209 times.
51209 if (!terminal)
1265 continue;
1266
1267
4/6
✓ Branch 0 (38→39) taken 51209 times.
✗ Branch 1 (38→109) not taken.
✓ Branch 2 (39→40) taken 51209 times.
✗ Branch 3 (39→109) not taken.
✓ Branch 4 (40→41) taken 48966 times.
✓ Branch 5 (40→49) taken 2243 times.
51209 if (terminal->getSymbol()->getType() == SpiceParser::IDENTIFIER) {
1268
1/2
✓ Branch 0 (41→42) taken 48966 times.
✗ Branch 1 (41→105) not taken.
48966 std::string fragment = getIdentifier(terminal, false);
1269
1/2
✓ Branch 0 (42→43) taken 48966 times.
✗ Branch 1 (42→103) not taken.
48966 atomicExprNode->identifierFragments.push_back(fragment);
1270
1/2
✗ Branch 0 (44→45) not taken.
✓ Branch 1 (44→46) taken 48966 times.
48966 if (!atomicExprNode->fqIdentifier.empty())
1271 atomicExprNode->fqIdentifier += SCOPE_ACCESS_TOKEN;
1272
1/2
✓ Branch 0 (46→47) taken 48966 times.
✗ Branch 1 (46→103) not taken.
48966 atomicExprNode->fqIdentifier += fragment;
1273
4/6
✓ Branch 0 (49→50) taken 2243 times.
✗ Branch 1 (49→109) not taken.
✓ Branch 2 (50→51) taken 2243 times.
✗ Branch 3 (50→109) not taken.
✓ Branch 4 (51→52) taken 1961 times.
✓ Branch 5 (51→60) taken 282 times.
51209 } else if (terminal->getSymbol()->getType() == SpiceParser::TYPE_IDENTIFIER) {
1274
1/2
✓ Branch 0 (52→53) taken 1961 times.
✗ Branch 1 (52→108) not taken.
1961 std::string fragment = getIdentifier(terminal, false);
1275
1/2
✓ Branch 0 (53→54) taken 1961 times.
✗ Branch 1 (53→106) not taken.
1961 atomicExprNode->identifierFragments.push_back(fragment);
1276
2/2
✓ Branch 0 (55→56) taken 282 times.
✓ Branch 1 (55→57) taken 1679 times.
1961 if (!atomicExprNode->fqIdentifier.empty())
1277
1/2
✓ Branch 0 (56→57) taken 282 times.
✗ Branch 1 (56→106) not taken.
282 atomicExprNode->fqIdentifier += SCOPE_ACCESS_TOKEN;
1278
1/2
✓ Branch 0 (57→58) taken 1961 times.
✗ Branch 1 (57→106) not taken.
1961 atomicExprNode->fqIdentifier += fragment;
1279 1961 }
1280 }
1281
2/2
✓ Branch 0 (65→66) taken 2075 times.
✓ Branch 1 (65→71) taken 650 times.
2725 } else if (ctx->builtinCall()) {
1282
3/6
✓ Branch 0 (66→67) taken 2075 times.
✗ Branch 1 (66→112) not taken.
✓ Branch 2 (67→68) taken 2075 times.
✗ Branch 3 (67→112) not taken.
✓ Branch 4 (68→69) taken 2075 times.
✗ Branch 5 (68→110) not taken.
2075 atomicExprNode->builtinCall = std::any_cast<BuiltinCallNode *>(visit(ctx->builtinCall()));
1283
1/2
✓ Branch 0 (72→73) taken 650 times.
✗ Branch 1 (72→78) not taken.
650 } else if (ctx->assignExpr()) {
1284
3/6
✓ Branch 0 (73→74) taken 650 times.
✗ Branch 1 (73→115) not taken.
✓ Branch 2 (74→75) taken 650 times.
✗ Branch 3 (74→115) not taken.
✓ Branch 4 (75→76) taken 650 times.
✗ Branch 5 (75→113) not taken.
650 atomicExprNode->assignExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
1285 } else {
1286 assert_fail("Unknown atomic expression type"); // GCOV_EXCL_LINE
1287 }
1288
1289
1/2
✓ Branch 0 (85→86) taken 85398 times.
✗ Branch 1 (85→116) not taken.
85398 return concludeNode(atomicExprNode);
1290 }
1291
1292 16919 std::any ASTBuilder::visitValue(SpiceParser::ValueContext *ctx) {
1293 16919 const auto valueNode = createNode<ValueNode>(ctx);
1294
1295 // Visit children
1296
2/2
✓ Branch 0 (4→5) taken 15271 times.
✓ Branch 1 (4→10) taken 1648 times.
16919 if (ctx->fctCall()) {
1297
3/6
✓ Branch 0 (5→6) taken 15271 times.
✗ Branch 1 (5→65) not taken.
✓ Branch 2 (6→7) taken 15271 times.
✗ Branch 3 (6→65) not taken.
✓ Branch 4 (7→8) taken 15271 times.
✗ Branch 5 (7→63) not taken.
15271 valueNode->fctCall = std::any_cast<FctCallNode *>(visit(ctx->fctCall()));
1298
2/2
✓ Branch 0 (11→12) taken 70 times.
✓ Branch 1 (11→17) taken 1578 times.
1648 } else if (ctx->arrayInitialization()) {
1299
3/6
✓ Branch 0 (12→13) taken 70 times.
✗ Branch 1 (12→68) not taken.
✓ Branch 2 (13→14) taken 70 times.
✗ Branch 3 (13→68) not taken.
✓ Branch 4 (14→15) taken 70 times.
✗ Branch 5 (14→66) not taken.
70 valueNode->arrayInitialization = std::any_cast<ArrayInitializationNode *>(visit(ctx->arrayInitialization()));
1300
2/2
✓ Branch 0 (18→19) taken 216 times.
✓ Branch 1 (18→24) taken 1362 times.
1578 } else if (ctx->structInstantiation()) {
1301
3/6
✓ Branch 0 (19→20) taken 216 times.
✗ Branch 1 (19→71) not taken.
✓ Branch 2 (20→21) taken 216 times.
✗ Branch 3 (20→71) not taken.
✓ Branch 4 (21→22) taken 216 times.
✗ Branch 5 (21→69) not taken.
216 valueNode->structInstantiation = std::any_cast<StructInstantiationNode *>(visit(ctx->structInstantiation()));
1302
2/2
✓ Branch 0 (25→26) taken 12 times.
✓ Branch 1 (25→31) taken 1350 times.
1362 } else if (ctx->lambdaFunc()) {
1303
3/6
✓ Branch 0 (26→27) taken 12 times.
✗ Branch 1 (26→74) not taken.
✓ Branch 2 (27→28) taken 12 times.
✗ Branch 3 (27→74) not taken.
✓ Branch 4 (28→29) taken 12 times.
✗ Branch 5 (28→72) not taken.
12 valueNode->lambdaFunc = std::any_cast<LambdaFuncNode *>(visit(ctx->lambdaFunc()));
1304
2/2
✓ Branch 0 (32→33) taken 27 times.
✓ Branch 1 (32→38) taken 1323 times.
1350 } else if (ctx->lambdaProc()) {
1305
3/6
✓ Branch 0 (33→34) taken 27 times.
✗ Branch 1 (33→77) not taken.
✓ Branch 2 (34→35) taken 27 times.
✗ Branch 3 (34→77) not taken.
✓ Branch 4 (35→36) taken 27 times.
✗ Branch 5 (35→75) not taken.
27 valueNode->lambdaProc = std::any_cast<LambdaProcNode *>(visit(ctx->lambdaProc()));
1306
2/2
✓ Branch 0 (39→40) taken 1 times.
✓ Branch 1 (39→45) taken 1322 times.
1323 } else if (ctx->lambdaExpr()) {
1307
3/6
✓ Branch 0 (40→41) taken 1 times.
✗ Branch 1 (40→80) not taken.
✓ Branch 2 (41→42) taken 1 times.
✗ Branch 3 (41→80) not taken.
✓ Branch 4 (42→43) taken 1 times.
✗ Branch 5 (42→78) not taken.
1 valueNode->lambdaExpr = std::any_cast<LambdaExprNode *>(visit(ctx->lambdaExpr()));
1308
1/2
✓ Branch 0 (46→47) taken 1322 times.
✗ Branch 1 (46→52) not taken.
1322 } else if (ctx->dataType()) {
1309 1322 valueNode->isNil = true;
1310
3/6
✓ Branch 0 (47→48) taken 1322 times.
✗ Branch 1 (47→83) not taken.
✓ Branch 2 (48→49) taken 1322 times.
✗ Branch 3 (48→83) not taken.
✓ Branch 4 (49→50) taken 1322 times.
✗ Branch 5 (49→81) not taken.
1322 valueNode->nilType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
1311 } else {
1312 assert_fail("Unknown value type"); // GCOV_EXCL_LINE
1313 }
1314
1315
1/2
✓ Branch 0 (59→60) taken 16919 times.
✗ Branch 1 (59→84) not taken.
16919 return concludeNode(valueNode);
1316 }
1317
1318 17187 std::any ASTBuilder::visitConstant(SpiceParser::ConstantContext *ctx) {
1319 17187 const auto constantNode = createNode<ConstantNode>(ctx);
1320
1321 // Enrich
1322
2/2
✓ Branch 0 (4→5) taken 410 times.
✓ Branch 1 (4→10) taken 16777 times.
17187 if (ctx->DOUBLE_LIT()) {
1323 410 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_DOUBLE;
1324
3/6
✓ Branch 0 (5→6) taken 410 times.
✗ Branch 1 (5→59) not taken.
✓ Branch 2 (6→7) taken 410 times.
✗ Branch 3 (6→59) not taken.
✓ Branch 4 (7→8) taken 410 times.
✗ Branch 5 (7→57) not taken.
410 constantNode->compileTimeValue.doubleValue = std::stod(ctx->DOUBLE_LIT()->toString());
1325
2/2
✓ Branch 0 (11→12) taken 3781 times.
✓ Branch 1 (11→15) taken 12996 times.
16777 } else if (ctx->INT_LIT()) {
1326 3781 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_INT;
1327 3781 constantNode->compileTimeValue.intValue = parseInt(ctx->INT_LIT());
1328
2/2
✓ Branch 0 (16→17) taken 569 times.
✓ Branch 1 (16→20) taken 12427 times.
12996 } else if (ctx->SHORT_LIT()) {
1329 569 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_SHORT;
1330 569 constantNode->compileTimeValue.shortValue = parseShort(ctx->SHORT_LIT());
1331
2/2
✓ Branch 0 (21→22) taken 5407 times.
✓ Branch 1 (21→25) taken 7020 times.
12427 } else if (ctx->LONG_LIT()) {
1332 5407 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_LONG;
1333 5407 constantNode->compileTimeValue.longValue = parseLong(ctx->LONG_LIT());
1334
2/2
✓ Branch 0 (26→27) taken 2642 times.
✓ Branch 1 (26→30) taken 4378 times.
7020 } else if (ctx->CHAR_LIT()) {
1335 2642 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_CHAR;
1336 2642 constantNode->compileTimeValue.charValue = parseChar(ctx->CHAR_LIT());
1337
2/2
✓ Branch 0 (31→32) taken 2778 times.
✓ Branch 1 (31→40) taken 1600 times.
4378 } else if (ctx->STRING_LIT()) {
1338 // Save a pointer to the string in the compile time value
1339 2778 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_STRING;
1340 2778 constantNode->compileTimeValue.stringValueOffset = resourceManager.compileTimeStringValues.size();
1341 // Add the string to the global compile time string list
1342
4/8
✓ Branch 0 (33→34) taken 2778 times.
✗ Branch 1 (33→64) not taken.
✓ Branch 2 (34→35) taken 2778 times.
✗ Branch 3 (34→64) not taken.
✓ Branch 4 (35→36) taken 2778 times.
✗ Branch 5 (35→62) not taken.
✓ Branch 6 (36→37) taken 2778 times.
✗ Branch 7 (36→60) not taken.
2778 resourceManager.compileTimeStringValues.push_back(parseString(ctx->STRING_LIT()->toString()));
1343
2/2
✓ Branch 0 (41→42) taken 821 times.
✓ Branch 1 (41→43) taken 779 times.
1600 } else if (ctx->TRUE()) {
1344 821 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_BOOL;
1345 821 constantNode->compileTimeValue.boolValue = true;
1346
1/2
✓ Branch 0 (44→45) taken 779 times.
✗ Branch 1 (44→46) not taken.
779 } else if (ctx->FALSE()) {
1347 779 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_BOOL;
1348 779 constantNode->compileTimeValue.boolValue = false;
1349 } else {
1350 assert_fail("Unknown constant type"); // GCOV_EXCL_LINE
1351 }
1352
1353
1/2
✓ Branch 0 (53→54) taken 17185 times.
✗ Branch 1 (53→66) not taken.
17185 return concludeNode(constantNode);
1354 }
1355
1356 15271 std::any ASTBuilder::visitFctCall(SpiceParser::FctCallContext *ctx) {
1357 15271 const auto fctCallNode = createNode<FctCallNode>(ctx);
1358
1359
2/2
✓ Branch 0 (37→5) taken 74421 times.
✓ Branch 1 (37→38) taken 15271 times.
89692 for (antlr4::ParserRuleContext::ParseTree *subTree : ctx->children) {
1360
1/2
✓ Branch 0 (6→7) taken 74421 times.
✗ Branch 1 (6→8) not taken.
74421 const auto terminal = dynamic_cast<antlr4::tree::TerminalNode *>(subTree);
1361
2/2
✓ Branch 0 (9→10) taken 12304 times.
✓ Branch 1 (9→11) taken 62117 times.
74421 if (!terminal)
1362 12304 continue;
1363
1364
4/6
✓ Branch 0 (11→12) taken 62117 times.
✗ Branch 1 (11→68) not taken.
✓ Branch 2 (12→13) taken 62117 times.
✗ Branch 3 (12→68) not taken.
✓ Branch 4 (13→14) taken 20067 times.
✓ Branch 5 (13→19) taken 42050 times.
62117 if (terminal->getSymbol()->getType() == SpiceParser::IDENTIFIER) {
1365
1/2
✓ Branch 0 (14→15) taken 20067 times.
✗ Branch 1 (14→64) not taken.
20067 const std::string fragment = terminal->toString();
1366
1/2
✓ Branch 0 (15→16) taken 20067 times.
✗ Branch 1 (15→62) not taken.
20067 fctCallNode->functionNameFragments.push_back(fragment);
1367
1/2
✓ Branch 0 (16→17) taken 20067 times.
✗ Branch 1 (16→62) not taken.
20067 fctCallNode->fqFunctionName += fragment;
1368
4/6
✓ Branch 0 (19→20) taken 42050 times.
✗ Branch 1 (19→68) not taken.
✓ Branch 2 (20→21) taken 42050 times.
✗ Branch 3 (20→68) not taken.
✓ Branch 4 (21→22) taken 2789 times.
✓ Branch 5 (21→27) taken 39261 times.
62117 } else if (terminal->getSymbol()->getType() == SpiceParser::TYPE_IDENTIFIER) {
1369
1/2
✓ Branch 0 (22→23) taken 2789 times.
✗ Branch 1 (22→67) not taken.
2789 const std::string fragment = terminal->toString();
1370
1/2
✓ Branch 0 (23→24) taken 2789 times.
✗ Branch 1 (23→65) not taken.
2789 fctCallNode->functionNameFragments.push_back(fragment);
1371
1/2
✓ Branch 0 (24→25) taken 2789 times.
✗ Branch 1 (24→65) not taken.
2789 fctCallNode->fqFunctionName += fragment;
1372
4/6
✓ Branch 0 (27→28) taken 39261 times.
✗ Branch 1 (27→68) not taken.
✓ Branch 2 (28→29) taken 39261 times.
✗ Branch 3 (28→68) not taken.
✓ Branch 4 (29→30) taken 62 times.
✓ Branch 5 (29→31) taken 39199 times.
42050 } else if (terminal->getSymbol()->getType() == SpiceParser::SCOPE_ACCESS) {
1373
1/2
✓ Branch 0 (30→35) taken 62 times.
✗ Branch 1 (30→68) not taken.
62 fctCallNode->fqFunctionName += SCOPE_ACCESS_TOKEN;
1374
4/6
✓ Branch 0 (31→32) taken 39199 times.
✗ Branch 1 (31→68) not taken.
✓ Branch 2 (32→33) taken 39199 times.
✗ Branch 3 (32→68) not taken.
✓ Branch 4 (33→34) taken 7523 times.
✓ Branch 5 (33→35) taken 31676 times.
39199 } else if (terminal->getSymbol()->getType() == SpiceParser::DOT) {
1375
1/2
✓ Branch 0 (34→35) taken 7523 times.
✗ Branch 1 (34→68) not taken.
7523 fctCallNode->fqFunctionName += MEMBER_ACCESS_TOKEN;
1376 }
1377 }
1378
1379 // Visit children
1380
2/2
✓ Branch 0 (39→40) taken 567 times.
✓ Branch 1 (39→45) taken 14704 times.
15271 if (ctx->typeLst()) {
1381 567 fctCallNode->hasTemplateTypes = true;
1382
3/6
✓ Branch 0 (40→41) taken 567 times.
✗ Branch 1 (40→71) not taken.
✓ Branch 2 (41→42) taken 567 times.
✗ Branch 3 (41→71) not taken.
✓ Branch 4 (42→43) taken 567 times.
✗ Branch 5 (42→69) not taken.
567 fctCallNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
1383 }
1384
2/2
✓ Branch 0 (46→47) taken 11737 times.
✓ Branch 1 (46→52) taken 3534 times.
15271 if (ctx->argLst()) {
1385 11737 fctCallNode->hasArgs = true;
1386
3/6
✓ Branch 0 (47→48) taken 11737 times.
✗ Branch 1 (47→74) not taken.
✓ Branch 2 (48→49) taken 11737 times.
✗ Branch 3 (48→74) not taken.
✓ Branch 4 (49→50) taken 11737 times.
✗ Branch 5 (49→72) not taken.
11737 fctCallNode->argLst = std::any_cast<ArgLstNode *>(visit(ctx->argLst()));
1387 }
1388
1389
1/2
✓ Branch 0 (58→59) taken 15271 times.
✗ Branch 1 (58→75) not taken.
15271 return concludeNode(fctCallNode);
1390 }
1391
1392 70 std::any ASTBuilder::visitArrayInitialization(SpiceParser::ArrayInitializationContext *ctx) {
1393 70 const auto arrayInitializationNode = createNode<ArrayInitializationNode>(ctx);
1394
1395 // Visit children
1396
2/2
✓ Branch 0 (4→5) taken 69 times.
✓ Branch 1 (4→10) taken 1 times.
70 if (ctx->argLst())
1397
3/6
✓ Branch 0 (5→6) taken 69 times.
✗ Branch 1 (5→22) not taken.
✓ Branch 2 (6→7) taken 69 times.
✗ Branch 3 (6→22) not taken.
✓ Branch 4 (7→8) taken 69 times.
✗ Branch 5 (7→20) not taken.
69 arrayInitializationNode->itemLst = std::any_cast<ArgLstNode *>(visit(ctx->argLst()));
1398
1399
1/2
✓ Branch 0 (16→17) taken 70 times.
✗ Branch 1 (16→23) not taken.
70 return concludeNode(arrayInitializationNode);
1400 }
1401
1402 216 std::any ASTBuilder::visitStructInstantiation(SpiceParser::StructInstantiationContext *ctx) {
1403 216 const auto structInstantiationNode = createNode<StructInstantiationNode>(ctx);
1404
1405 // Enrich
1406
2/2
✓ Branch 0 (31→5) taken 911 times.
✓ Branch 1 (31→32) taken 216 times.
1127 for (antlr4::ParserRuleContext::ParseTree *subTree : ctx->children) {
1407
1/2
✓ Branch 0 (6→7) taken 911 times.
✗ Branch 1 (6→8) not taken.
911 const auto terminal = dynamic_cast<antlr4::tree::TerminalNode *>(subTree);
1408
2/2
✓ Branch 0 (9→10) taken 219 times.
✓ Branch 1 (9→11) taken 692 times.
911 if (!terminal)
1409 219 continue;
1410
1411
4/6
✓ Branch 0 (11→12) taken 692 times.
✗ Branch 1 (11→65) not taken.
✓ Branch 2 (12→13) taken 692 times.
✗ Branch 3 (12→65) not taken.
✓ Branch 4 (13→14) taken 3 times.
✓ Branch 5 (13→21) taken 689 times.
692 if (terminal->getSymbol()->getType() == SpiceParser::IDENTIFIER) {
1412
1/2
✓ Branch 0 (14→15) taken 3 times.
✗ Branch 1 (14→61) not taken.
3 const std::string fragment = terminal->toString();
1413
1/2
✓ Branch 0 (15→16) taken 3 times.
✗ Branch 1 (15→59) not taken.
3 structInstantiationNode->structNameFragments.push_back(fragment);
1414
2/4
✓ Branch 0 (16→17) taken 3 times.
✗ Branch 1 (16→58) not taken.
✓ Branch 2 (17→18) taken 3 times.
✗ Branch 3 (17→56) not taken.
3 structInstantiationNode->fqStructName += fragment + SCOPE_ACCESS_TOKEN;
1415
4/6
✓ Branch 0 (21→22) taken 689 times.
✗ Branch 1 (21→65) not taken.
✓ Branch 2 (22→23) taken 689 times.
✗ Branch 3 (22→65) not taken.
✓ Branch 4 (23→24) taken 216 times.
✓ Branch 5 (23→29) taken 473 times.
692 } else if (terminal->getSymbol()->getType() == SpiceParser::TYPE_IDENTIFIER) {
1416
1/2
✓ Branch 0 (24→25) taken 216 times.
✗ Branch 1 (24→64) not taken.
216 const std::string fragment = terminal->toString();
1417
1/2
✓ Branch 0 (25→26) taken 216 times.
✗ Branch 1 (25→62) not taken.
216 structInstantiationNode->structNameFragments.push_back(fragment);
1418
1/2
✓ Branch 0 (26→27) taken 216 times.
✗ Branch 1 (26→62) not taken.
216 structInstantiationNode->fqStructName += fragment;
1419 216 }
1420 }
1421
1422 // Visit children
1423
2/2
✓ Branch 0 (33→34) taken 19 times.
✓ Branch 1 (33→39) taken 197 times.
216 if (ctx->typeLst()) {
1424 19 structInstantiationNode->hasTemplateTypes = true;
1425
3/6
✓ Branch 0 (34→35) taken 19 times.
✗ Branch 1 (34→68) not taken.
✓ Branch 2 (35→36) taken 19 times.
✗ Branch 3 (35→68) not taken.
✓ Branch 4 (36→37) taken 19 times.
✗ Branch 5 (36→66) not taken.
19 structInstantiationNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
1426 }
1427
2/2
✓ Branch 0 (40→41) taken 200 times.
✓ Branch 1 (40→46) taken 16 times.
216 if (ctx->argLst())
1428
3/6
✓ Branch 0 (41→42) taken 200 times.
✗ Branch 1 (41→71) not taken.
✓ Branch 2 (42→43) taken 200 times.
✗ Branch 3 (42→71) not taken.
✓ Branch 4 (43→44) taken 200 times.
✗ Branch 5 (43→69) not taken.
200 structInstantiationNode->fieldLst = std::any_cast<ArgLstNode *>(visit(ctx->argLst()));
1429
1430
1/2
✓ Branch 0 (52→53) taken 216 times.
✗ Branch 1 (52→72) not taken.
216 return concludeNode(structInstantiationNode);
1431 }
1432
1433 12 std::any ASTBuilder::visitLambdaFunc(SpiceParser::LambdaFuncContext *ctx) {
1434 12 const auto lambdaFuncNode = createNode<LambdaFuncNode>(ctx);
1435
1436 // Visit children
1437
3/6
✓ Branch 0 (3→4) taken 12 times.
✗ Branch 1 (3→37) not taken.
✓ Branch 2 (4→5) taken 12 times.
✗ Branch 3 (4→37) not taken.
✓ Branch 4 (5→6) taken 12 times.
✗ Branch 5 (5→35) not taken.
12 lambdaFuncNode->returnType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
1438
2/2
✓ Branch 0 (8→9) taken 8 times.
✓ Branch 1 (8→14) taken 4 times.
12 if (ctx->paramLst()) {
1439 8 lambdaFuncNode->hasParams = true;
1440
3/6
✓ Branch 0 (9→10) taken 8 times.
✗ Branch 1 (9→40) not taken.
✓ Branch 2 (10→11) taken 8 times.
✗ Branch 3 (10→40) not taken.
✓ Branch 4 (11→12) taken 8 times.
✗ Branch 5 (11→38) not taken.
8 lambdaFuncNode->paramLst = std::any_cast<ParamLstNode *>(visit(ctx->paramLst()));
1441 }
1442
1/2
✗ Branch 0 (15→16) not taken.
✓ Branch 1 (15→21) taken 12 times.
12 if (ctx->lambdaAttr())
1443 lambdaFuncNode->lambdaAttr = std::any_cast<LambdaAttrNode *>(visit(ctx->lambdaAttr()));
1444
3/6
✓ Branch 0 (21→22) taken 12 times.
✗ Branch 1 (21→46) not taken.
✓ Branch 2 (22→23) taken 12 times.
✗ Branch 3 (22→46) not taken.
✓ Branch 4 (23→24) taken 12 times.
✗ Branch 5 (23→44) not taken.
12 lambdaFuncNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
1445
1446
1/2
✓ Branch 0 (31→32) taken 12 times.
✗ Branch 1 (31→47) not taken.
12 return concludeNode(lambdaFuncNode);
1447 }
1448
1449 27 std::any ASTBuilder::visitLambdaProc(SpiceParser::LambdaProcContext *ctx) {
1450 27 const auto lambdaProcNode = createNode<LambdaProcNode>(ctx);
1451
1452 // Visit children
1453
2/2
✓ Branch 0 (4→5) taken 7 times.
✓ Branch 1 (4→10) taken 20 times.
27 if (ctx->paramLst()) {
1454 7 lambdaProcNode->hasParams = true;
1455
3/6
✓ Branch 0 (5→6) taken 7 times.
✗ Branch 1 (5→33) not taken.
✓ Branch 2 (6→7) taken 7 times.
✗ Branch 3 (6→33) not taken.
✓ Branch 4 (7→8) taken 7 times.
✗ Branch 5 (7→31) not taken.
7 lambdaProcNode->paramLst = std::any_cast<ParamLstNode *>(visit(ctx->paramLst()));
1456 }
1457
2/2
✓ Branch 0 (11→12) taken 16 times.
✓ Branch 1 (11→17) taken 11 times.
27 if (ctx->lambdaAttr())
1458
3/6
✓ Branch 0 (12→13) taken 16 times.
✗ Branch 1 (12→36) not taken.
✓ Branch 2 (13→14) taken 16 times.
✗ Branch 3 (13→36) not taken.
✓ Branch 4 (14→15) taken 16 times.
✗ Branch 5 (14→34) not taken.
16 lambdaProcNode->lambdaAttr = std::any_cast<LambdaAttrNode *>(visit(ctx->lambdaAttr()));
1459
3/6
✓ Branch 0 (17→18) taken 27 times.
✗ Branch 1 (17→39) not taken.
✓ Branch 2 (18→19) taken 27 times.
✗ Branch 3 (18→39) not taken.
✓ Branch 4 (19→20) taken 27 times.
✗ Branch 5 (19→37) not taken.
27 lambdaProcNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
1460
1461
1/2
✓ Branch 0 (27→28) taken 27 times.
✗ Branch 1 (27→40) not taken.
27 return concludeNode(lambdaProcNode);
1462 }
1463
1464 1 std::any ASTBuilder::visitLambdaExpr(SpiceParser::LambdaExprContext *ctx) {
1465 1 const auto lambdaExprNode = createNode<LambdaExprNode>(ctx);
1466
1467 // Visit children
1468
1/2
✓ Branch 0 (4→5) taken 1 times.
✗ Branch 1 (4→10) not taken.
1 if (ctx->paramLst()) {
1469 1 lambdaExprNode->hasParams = true;
1470
3/6
✓ Branch 0 (5→6) taken 1 times.
✗ Branch 1 (5→26) not taken.
✓ Branch 2 (6→7) taken 1 times.
✗ Branch 3 (6→26) not taken.
✓ Branch 4 (7→8) taken 1 times.
✗ Branch 5 (7→24) not taken.
1 lambdaExprNode->paramLst = std::any_cast<ParamLstNode *>(visit(ctx->paramLst()));
1471 }
1472
3/6
✓ Branch 0 (10→11) taken 1 times.
✗ Branch 1 (10→29) not taken.
✓ Branch 2 (11→12) taken 1 times.
✗ Branch 3 (11→29) not taken.
✓ Branch 4 (12→13) taken 1 times.
✗ Branch 5 (12→27) not taken.
1 lambdaExprNode->lambdaExpr = std::any_cast<AssignExprNode *>(visit(ctx->assignExpr()));
1473
1474
1/2
✓ Branch 0 (20→21) taken 1 times.
✗ Branch 1 (20→30) not taken.
1 return concludeNode(lambdaExprNode);
1475 }
1476
1477 44418 std::any ASTBuilder::visitDataType(SpiceParser::DataTypeContext *ctx) {
1478 44418 const auto dataTypeNode = createNode<DataTypeNode>(ctx);
1479
1480 // Visit children
1481
2/2
✓ Branch 0 (4→5) taken 17607 times.
✓ Branch 1 (4→10) taken 26811 times.
44418 if (ctx->qualifierLst())
1482
4/6
✓ Branch 0 (5→6) taken 17607 times.
✗ Branch 1 (5→74) not taken.
✓ Branch 2 (6→7) taken 17606 times.
✓ Branch 3 (6→74) taken 1 times.
✓ Branch 4 (7→8) taken 17606 times.
✗ Branch 5 (7→72) not taken.
17607 dataTypeNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
1483
3/6
✓ Branch 0 (10→11) taken 44417 times.
✗ Branch 1 (10→77) not taken.
✓ Branch 2 (11→12) taken 44417 times.
✗ Branch 3 (11→77) not taken.
✓ Branch 4 (12→13) taken 44417 times.
✗ Branch 5 (12→75) not taken.
44417 dataTypeNode->baseDataType = std::any_cast<BaseDataTypeNode *>(visit(ctx->baseDataType()));
1484
1485 // Enrich
1486
2/2
✓ Branch 0 (61→15) taken 72707 times.
✓ Branch 1 (61→62) taken 44417 times.
117124 for (size_t i = 0; i < ctx->children.size(); i++) {
1487 72707 antlr4::tree::ParseTree *subTree = ctx->children.at(i);
1488
1/2
✓ Branch 0 (16→17) taken 72707 times.
✗ Branch 1 (16→18) not taken.
72707 auto terminal = dynamic_cast<TerminalNode *>(subTree);
1489
2/2
✓ Branch 0 (19→20) taken 62023 times.
✓ Branch 1 (19→21) taken 10684 times.
72707 if (!terminal)
1490 62023 continue;
1491
1492
2/2
✓ Branch 0 (23→24) taken 5538 times.
✓ Branch 1 (23→26) taken 5146 times.
10684 if (terminal->getSymbol()->getType() == SpiceParser::MUL) {
1493
1/2
✓ Branch 0 (24→25) taken 5538 times.
✗ Branch 1 (24→78) not taken.
5538 dataTypeNode->tmQueue.emplace(DataTypeNode::TypeModifierType::TYPE_PTR, false, 0);
1494
2/2
✓ Branch 0 (28→29) taken 5045 times.
✓ Branch 1 (28→31) taken 101 times.
5146 } else if (terminal->getSymbol()->getType() == SpiceParser::BITWISE_AND) {
1495
1/2
✓ Branch 0 (29→30) taken 5045 times.
✗ Branch 1 (29→81) not taken.
5045 dataTypeNode->tmQueue.emplace(DataTypeNode::TypeModifierType::TYPE_REF, false, 0);
1496
1/2
✓ Branch 0 (33→34) taken 101 times.
✗ Branch 1 (33→59) not taken.
101 } else if (terminal->getSymbol()->getType() == SpiceParser::LBRACKET) {
1497 101 i++; // Consume LBRACKET
1498
1/2
✓ Branch 0 (34→35) taken 101 times.
✗ Branch 1 (34→93) not taken.
101 subTree = ctx->children.at(i);
1499
1/2
✓ Branch 0 (35→36) taken 101 times.
✗ Branch 1 (35→37) not taken.
101 terminal = dynamic_cast<TerminalNode *>(subTree);
1500 101 bool hasSize = false;
1501 101 unsigned int hardCodedSize = 0;
1502 101 std::string sizeVarName;
1503
4/6
✓ Branch 0 (39→40) taken 101 times.
✗ Branch 1 (39→91) not taken.
✓ Branch 2 (40→41) taken 101 times.
✗ Branch 3 (40→91) not taken.
✓ Branch 4 (41→42) taken 47 times.
✓ Branch 5 (41→47) taken 54 times.
101 if (terminal->getSymbol()->getType() == SpiceParser::INT_LIT) {
1504 47 hasSize = true;
1505
3/6
✓ Branch 0 (42→43) taken 47 times.
✗ Branch 1 (42→86) not taken.
✓ Branch 2 (43→44) taken 47 times.
✗ Branch 3 (43→86) not taken.
✓ Branch 4 (44→45) taken 47 times.
✗ Branch 5 (44→84) not taken.
47 hardCodedSize = std::stoi(terminal->getSymbol()->getText());
1506 47 i++; // Consume INT_LIT
1507
4/6
✓ Branch 0 (47→48) taken 54 times.
✗ Branch 1 (47→91) not taken.
✓ Branch 2 (48→49) taken 54 times.
✗ Branch 3 (48→91) not taken.
✓ Branch 4 (49→50) taken 24 times.
✓ Branch 5 (49→54) taken 30 times.
54 } else if (terminal->getSymbol()->getType() == SpiceParser::TYPE_IDENTIFIER) {
1508 24 hasSize = true;
1509
1/2
✓ Branch 0 (50→51) taken 24 times.
✗ Branch 1 (50→87) not taken.
24 sizeVarName = getIdentifier(terminal, true);
1510 24 i++; // Consume TYPE_IDENTIFIER
1511 }
1512
1/2
✓ Branch 0 (55→56) taken 101 times.
✗ Branch 1 (55→88) not taken.
101 dataTypeNode->tmQueue.push({DataTypeNode::TypeModifierType::TYPE_ARRAY, hasSize, hardCodedSize, sizeVarName});
1513 101 }
1514 }
1515
1516
1/2
✓ Branch 0 (68→69) taken 44417 times.
✗ Branch 1 (68→94) not taken.
44417 return concludeNode(dataTypeNode);
1517
1/2
✓ Branch 0 (54→55) taken 101 times.
✗ Branch 1 (54→90) not taken.
101 }
1518
1519 44417 std::any ASTBuilder::visitBaseDataType(SpiceParser::BaseDataTypeContext *ctx) {
1520 44417 const auto baseDataTypeNode = createNode<BaseDataTypeNode>(ctx);
1521
1522 // Enrich
1523
2/2
✓ Branch 0 (4→5) taken 411 times.
✓ Branch 1 (4→6) taken 44006 times.
44417 if (ctx->TYPE_DOUBLE()) {
1524 411 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_DOUBLE;
1525
2/2
✓ Branch 0 (7→8) taken 2894 times.
✓ Branch 1 (7→9) taken 41112 times.
44006 } else if (ctx->TYPE_INT()) {
1526 2894 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_INT;
1527
2/2
✓ Branch 0 (10→11) taken 967 times.
✓ Branch 1 (10→12) taken 40145 times.
41112 } else if (ctx->TYPE_SHORT()) {
1528 967 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_SHORT;
1529
2/2
✓ Branch 0 (13→14) taken 8476 times.
✓ Branch 1 (13→15) taken 31669 times.
40145 } else if (ctx->TYPE_LONG()) {
1530 8476 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_LONG;
1531
2/2
✓ Branch 0 (16→17) taken 2421 times.
✓ Branch 1 (16→18) taken 29248 times.
31669 } else if (ctx->TYPE_BYTE()) {
1532 2421 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_BYTE;
1533
2/2
✓ Branch 0 (19→20) taken 4937 times.
✓ Branch 1 (19→21) taken 24311 times.
29248 } else if (ctx->TYPE_CHAR()) {
1534 4937 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_CHAR;
1535
2/2
✓ Branch 0 (22→23) taken 3825 times.
✓ Branch 1 (22→24) taken 20486 times.
24311 } else if (ctx->TYPE_STRING()) {
1536 3825 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_STRING;
1537
2/2
✓ Branch 0 (25→26) taken 3608 times.
✓ Branch 1 (25→27) taken 16878 times.
20486 } else if (ctx->TYPE_BOOL()) {
1538 3608 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_BOOL;
1539
2/2
✓ Branch 0 (28→29) taken 420 times.
✓ Branch 1 (28→30) taken 16458 times.
16878 } else if (ctx->TYPE_DYN()) {
1540 420 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_DYN;
1541
2/2
✓ Branch 0 (31→32) taken 16376 times.
✓ Branch 1 (31→37) taken 82 times.
16458 } else if (ctx->customDataType()) {
1542 16376 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_CUSTOM;
1543
3/6
✓ Branch 0 (32→33) taken 16376 times.
✗ Branch 1 (32→57) not taken.
✓ Branch 2 (33→34) taken 16376 times.
✗ Branch 3 (33→57) not taken.
✓ Branch 4 (34→35) taken 16376 times.
✗ Branch 5 (34→55) not taken.
16376 baseDataTypeNode->customDataType = std::any_cast<CustomDataTypeNode *>(visit(ctx->customDataType()));
1544
1/2
✓ Branch 0 (38→39) taken 82 times.
✗ Branch 1 (38→44) not taken.
82 } else if (ctx->functionDataType()) {
1545 82 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_FUNCTION;
1546
3/6
✓ Branch 0 (39→40) taken 82 times.
✗ Branch 1 (39→60) not taken.
✓ Branch 2 (40→41) taken 82 times.
✗ Branch 3 (40→60) not taken.
✓ Branch 4 (41→42) taken 82 times.
✗ Branch 5 (41→58) not taken.
82 baseDataTypeNode->functionDataType = std::any_cast<FunctionDataTypeNode *>(visit(ctx->functionDataType()));
1547 } else {
1548 assert_fail("Unknown base data type");
1549 }
1550
1551
1/2
✓ Branch 0 (51→52) taken 44417 times.
✗ Branch 1 (51→61) not taken.
44417 return concludeNode(baseDataTypeNode);
1552 }
1553
1554 16376 std::any ASTBuilder::visitCustomDataType(SpiceParser::CustomDataTypeContext *ctx) {
1555 16376 const auto customDataTypeNode = createNode<CustomDataTypeNode>(ctx);
1556
1557 // Enrich
1558
2/2
✓ Branch 0 (31→5) taken 23358 times.
✓ Branch 1 (31→32) taken 16376 times.
39734 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
1559
1/2
✓ Branch 0 (6→7) taken 23358 times.
✗ Branch 1 (6→8) not taken.
23358 const auto terminal = dynamic_cast<TerminalNode *>(subTree);
1560
2/2
✓ Branch 0 (9→10) taken 2310 times.
✓ Branch 1 (9→11) taken 21048 times.
23358 if (!terminal)
1561 2310 continue;
1562
1563
4/6
✓ Branch 0 (11→12) taken 21048 times.
✗ Branch 1 (11→58) not taken.
✓ Branch 2 (12→13) taken 21048 times.
✗ Branch 3 (12→58) not taken.
✓ Branch 4 (13→14) taken 26 times.
✓ Branch 5 (13→21) taken 21022 times.
21048 if (terminal->getSymbol()->getType() == SpiceParser::IDENTIFIER) {
1564
1/2
✓ Branch 0 (14→15) taken 26 times.
✗ Branch 1 (14→54) not taken.
26 const std::string fragment = terminal->toString();
1565
1/2
✓ Branch 0 (15→16) taken 26 times.
✗ Branch 1 (15→52) not taken.
26 customDataTypeNode->typeNameFragments.push_back(fragment);
1566
2/4
✓ Branch 0 (16→17) taken 26 times.
✗ Branch 1 (16→51) not taken.
✓ Branch 2 (17→18) taken 26 times.
✗ Branch 3 (17→49) not taken.
26 customDataTypeNode->fqTypeName += fragment + SCOPE_ACCESS_TOKEN;
1567
4/6
✓ Branch 0 (21→22) taken 21022 times.
✗ Branch 1 (21→58) not taken.
✓ Branch 2 (22→23) taken 21022 times.
✗ Branch 3 (22→58) not taken.
✓ Branch 4 (23→24) taken 16376 times.
✓ Branch 5 (23→29) taken 4646 times.
21048 } else if (terminal->getSymbol()->getType() == SpiceParser::TYPE_IDENTIFIER) {
1568
1/2
✓ Branch 0 (24→25) taken 16376 times.
✗ Branch 1 (24→57) not taken.
16376 const std::string fragment = terminal->toString();
1569
1/2
✓ Branch 0 (25→26) taken 16376 times.
✗ Branch 1 (25→55) not taken.
16376 customDataTypeNode->typeNameFragments.push_back(fragment);
1570
1/2
✓ Branch 0 (26→27) taken 16376 times.
✗ Branch 1 (26→55) not taken.
16376 customDataTypeNode->fqTypeName += fragment;
1571 16376 }
1572 }
1573
1574 // Visit children
1575
2/2
✓ Branch 0 (33→34) taken 2310 times.
✓ Branch 1 (33→39) taken 14066 times.
16376 if (ctx->typeLst())
1576
3/6
✓ Branch 0 (34→35) taken 2310 times.
✗ Branch 1 (34→61) not taken.
✓ Branch 2 (35→36) taken 2310 times.
✗ Branch 3 (35→61) not taken.
✓ Branch 4 (36→37) taken 2310 times.
✗ Branch 5 (36→59) not taken.
2310 customDataTypeNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
1577
1578
1/2
✓ Branch 0 (45→46) taken 16376 times.
✗ Branch 1 (45→62) not taken.
16376 return concludeNode(customDataTypeNode);
1579 }
1580
1581 82 std::any ASTBuilder::visitFunctionDataType(SpiceParser::FunctionDataTypeContext *ctx) {
1582 82 const auto functionDataTypeNode = createNode<FunctionDataTypeNode>(ctx);
1583
1584 // Enrich
1585
2/2
✓ Branch 0 (4→5) taken 24 times.
✓ Branch 1 (4→11) taken 58 times.
82 if (ctx->dataType()) {
1586 24 functionDataTypeNode->isFunction = ctx->dataType();
1587
3/6
✓ Branch 0 (6→7) taken 24 times.
✗ Branch 1 (6→30) not taken.
✓ Branch 2 (7→8) taken 24 times.
✗ Branch 3 (7→30) not taken.
✓ Branch 4 (8→9) taken 24 times.
✗ Branch 5 (8→28) not taken.
24 functionDataTypeNode->returnType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
1588 }
1589
2/2
✓ Branch 0 (12→13) taken 50 times.
✓ Branch 1 (12→18) taken 32 times.
82 if (ctx->typeLst())
1590
3/6
✓ Branch 0 (13→14) taken 50 times.
✗ Branch 1 (13→33) not taken.
✓ Branch 2 (14→15) taken 50 times.
✗ Branch 3 (14→33) not taken.
✓ Branch 4 (15→16) taken 50 times.
✗ Branch 5 (15→31) not taken.
50 functionDataTypeNode->paramTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
1591
1592
1/2
✓ Branch 0 (24→25) taken 82 times.
✗ Branch 1 (24→34) not taken.
82 return concludeNode(functionDataTypeNode);
1593 }
1594
1595 7148 std::any ASTBuilder::visitAssignOp(SpiceParser::AssignOpContext *ctx) {
1596 7148 const auto assignExprNode = resumeForExpansion<AssignExprNode>();
1597
1598 // Extract assign operator
1599
2/2
✓ Branch 0 (13→14) taken 6308 times.
✓ Branch 1 (13→15) taken 840 times.
7148 if (ctx->ASSIGN())
1600 6308 assignExprNode->op = AssignExprNode::AssignOp::OP_ASSIGN;
1601
2/2
✓ Branch 0 (16→17) taken 360 times.
✓ Branch 1 (16→18) taken 480 times.
840 else if (ctx->PLUS_EQUAL())
1602 360 assignExprNode->op = AssignExprNode::AssignOp::OP_PLUS_EQUAL;
1603
2/2
✓ Branch 0 (19→20) taken 60 times.
✓ Branch 1 (19→21) taken 420 times.
480 else if (ctx->MINUS_EQUAL())
1604 60 assignExprNode->op = AssignExprNode::AssignOp::OP_MINUS_EQUAL;
1605
2/2
✓ Branch 0 (22→23) taken 41 times.
✓ Branch 1 (22→24) taken 379 times.
420 else if (ctx->MUL_EQUAL())
1606 41 assignExprNode->op = AssignExprNode::AssignOp::OP_MUL_EQUAL;
1607
2/2
✓ Branch 0 (25→26) taken 43 times.
✓ Branch 1 (25→27) taken 336 times.
379 else if (ctx->DIV_EQUAL())
1608 43 assignExprNode->op = AssignExprNode::AssignOp::OP_DIV_EQUAL;
1609
2/2
✓ Branch 0 (28→29) taken 7 times.
✓ Branch 1 (28→30) taken 329 times.
336 else if (ctx->REM_EQUAL())
1610 7 assignExprNode->op = AssignExprNode::AssignOp::OP_REM_EQUAL;
1611
2/2
✓ Branch 0 (31→32) taken 2 times.
✓ Branch 1 (31→33) taken 327 times.
329 else if (ctx->SHL_EQUAL())
1612 2 assignExprNode->op = AssignExprNode::AssignOp::OP_SHL_EQUAL;
1613
2/2
✓ Branch 0 (34→35) taken 3 times.
✓ Branch 1 (34→36) taken 324 times.
327 else if (ctx->SHR_EQUAL())
1614 3 assignExprNode->op = AssignExprNode::AssignOp::OP_SHR_EQUAL;
1615
2/2
✓ Branch 0 (37→38) taken 1 times.
✓ Branch 1 (37→39) taken 323 times.
324 else if (ctx->AND_EQUAL())
1616 1 assignExprNode->op = AssignExprNode::AssignOp::OP_AND_EQUAL;
1617
2/2
✓ Branch 0 (40→41) taken 1 times.
✓ Branch 1 (40→42) taken 322 times.
323 else if (ctx->OR_EQUAL())
1618 1 assignExprNode->op = AssignExprNode::AssignOp::OP_OR_EQUAL;
1619
1/2
✓ Branch 0 (43→44) taken 322 times.
✗ Branch 1 (43→45) not taken.
322 else if (ctx->XOR_EQUAL())
1620 322 assignExprNode->op = AssignExprNode::AssignOp::OP_XOR_EQUAL;
1621 else
1622 assert_fail("Unknown assign operator");
1623
1624
1/2
✓ Branch 0 (46→47) taken 7148 times.
✗ Branch 1 (46→49) not taken.
7148 return nullptr;
1625 }
1626
1627 1640 std::any ASTBuilder::visitOverloadableOp(SpiceParser::OverloadableOpContext *ctx) {
1628 1640 const auto fctNameNode = resumeForExpansion<FctNameNode>();
1629
1630 // Enrich
1631
2/2
✓ Branch 0 (13→14) taken 87 times.
✓ Branch 1 (13→15) taken 1553 times.
1640 if (ctx->PLUS())
1632 87 fctNameNode->name = OP_FCT_PLUS;
1633
2/2
✓ Branch 0 (16→17) taken 1 times.
✓ Branch 1 (16→18) taken 1552 times.
1553 else if (ctx->MINUS())
1634 1 fctNameNode->name = OP_FCT_MINUS;
1635
2/2
✓ Branch 0 (19→20) taken 173 times.
✓ Branch 1 (19→21) taken 1379 times.
1552 else if (ctx->MUL())
1636 173 fctNameNode->name = OP_FCT_MUL;
1637
2/2
✓ Branch 0 (22→23) taken 22 times.
✓ Branch 1 (22→24) taken 1357 times.
1379 else if (ctx->DIV())
1638 22 fctNameNode->name = OP_FCT_DIV;
1639
2/2
✓ Branch 0 (25→26) taken 388 times.
✓ Branch 1 (25→27) taken 969 times.
1357 else if (ctx->EQUAL())
1640 388 fctNameNode->name = OP_FCT_EQUAL;
1641
2/2
✓ Branch 0 (28→29) taken 385 times.
✓ Branch 1 (28→30) taken 584 times.
969 else if (ctx->NOT_EQUAL())
1642 385 fctNameNode->name = OP_FCT_NOT_EQUAL;
1643
3/4
✓ Branch 0 (30→31) taken 584 times.
✗ Branch 1 (30→67) not taken.
✓ Branch 2 (33→34) taken 13 times.
✓ Branch 3 (33→35) taken 571 times.
584 else if (ctx->LESS().size() == 2)
1644 13 fctNameNode->name = OP_FCT_SHL;
1645
3/4
✓ Branch 0 (35→36) taken 571 times.
✗ Branch 1 (35→68) not taken.
✓ Branch 2 (38→39) taken 1 times.
✓ Branch 3 (38→40) taken 570 times.
571 else if (ctx->GREATER().size() == 2)
1646 1 fctNameNode->name = OP_FCT_SHR;
1647
2/2
✓ Branch 0 (41→42) taken 124 times.
✓ Branch 1 (41→43) taken 446 times.
570 else if (ctx->PLUS_EQUAL())
1648 124 fctNameNode->name = OP_FCT_PLUS_EQUAL;
1649
2/2
✓ Branch 0 (44→45) taken 38 times.
✓ Branch 1 (44→46) taken 408 times.
446 else if (ctx->MINUS_EQUAL())
1650 38 fctNameNode->name = OP_FCT_MINUS_EQUAL;
1651
2/2
✓ Branch 0 (47→48) taken 87 times.
✓ Branch 1 (47→49) taken 321 times.
408 else if (ctx->MUL_EQUAL())
1652 87 fctNameNode->name = OP_FCT_MUL_EQUAL;
1653
2/2
✓ Branch 0 (50→51) taken 22 times.
✓ Branch 1 (50→52) taken 299 times.
321 else if (ctx->DIV_EQUAL())
1654 22 fctNameNode->name = OP_FCT_DIV_EQUAL;
1655
2/2
✓ Branch 0 (53→54) taken 45 times.
✓ Branch 1 (53→55) taken 254 times.
299 else if (ctx->PLUS_PLUS())
1656 45 fctNameNode->name = OP_FCT_POSTFIX_PLUS_PLUS;
1657
2/2
✓ Branch 0 (56→57) taken 38 times.
✓ Branch 1 (56→58) taken 216 times.
254 else if (ctx->MINUS_MINUS())
1658 38 fctNameNode->name = OP_FCT_POSTFIX_MINUS_MINUS;
1659
1/2
✓ Branch 0 (59→60) taken 216 times.
✗ Branch 1 (59→61) not taken.
216 else if (ctx->LBRACKET())
1660 216 fctNameNode->name = OP_FCT_SUBSCRIPT;
1661 else
1662 assert_fail("Unsupported overloadable operator"); // GCOV_EXCL_LINE
1663
1664 1640 fctNameNode->fqName = fctNameNode->name;
1665 1640 fctNameNode->nameFragments.push_back(fctNameNode->name);
1666
1667
1/2
✓ Branch 0 (64→65) taken 1640 times.
✗ Branch 1 (64→69) not taken.
1640 return nullptr;
1668 }
1669
1670 4190 int32_t ASTBuilder::parseInt(TerminalNode *terminal) {
1671 8380 const NumericParserCallback<int32_t> cb = [](const std::string &substr, short base, bool isSigned) -> int32_t {
1672 // Prepare limits
1673
2/2
✓ Branch 0 (2→3) taken 4183 times.
✓ Branch 1 (2→4) taken 7 times.
4190 const int64_t upperLimit = isSigned ? INT32_MAX : UINT32_MAX;
1674
2/2
✓ Branch 0 (5→6) taken 4183 times.
✓ Branch 1 (5→7) taken 7 times.
4190 const int64_t lowerLimit = isSigned ? INT32_MIN : 0;
1675 // Parse number and check for limits
1676 4190 const int64_t number = std::stoll(substr, nullptr, base);
1677
2/4
✓ Branch 0 (9→10) taken 4189 times.
✗ Branch 1 (9→11) not taken.
✗ Branch 2 (10→11) not taken.
✓ Branch 3 (10→14) taken 4189 times.
4189 if (number < lowerLimit || number > upperLimit)
1678 throw std::out_of_range("Number out of range");
1679 4189 return static_cast<int32_t>(number);
1680 4190 };
1681
2/2
✓ Branch 0 (3→4) taken 4189 times.
✓ Branch 1 (3→8) taken 1 times.
8379 return parseNumeric(terminal, cb);
1682 4190 }
1683
1684 569 int16_t ASTBuilder::parseShort(TerminalNode *terminal) {
1685 1138 const NumericParserCallback<int16_t> cb = [](const std::string &substr, short base, bool isSigned) -> int16_t {
1686 // Prepare limits
1687
2/2
✓ Branch 0 (2→3) taken 235 times.
✓ Branch 1 (2→4) taken 334 times.
569 const int64_t upperLimit = isSigned ? INT16_MAX : UINT16_MAX;
1688
2/2
✓ Branch 0 (5→6) taken 235 times.
✓ Branch 1 (5→7) taken 334 times.
569 const int64_t lowerLimit = isSigned ? INT16_MIN : 0;
1689 // Parse number and check for limits
1690 569 const int64_t number = std::stoll(substr, nullptr, base);
1691
2/4
✓ Branch 0 (9→10) taken 569 times.
✗ Branch 1 (9→11) not taken.
✗ Branch 2 (10→11) not taken.
✓ Branch 3 (10→14) taken 569 times.
569 if (number < lowerLimit || number > upperLimit)
1692 throw std::out_of_range("Number out of range");
1693 569 return static_cast<int16_t>(number);
1694 569 };
1695
1/2
✓ Branch 0 (3→4) taken 569 times.
✗ Branch 1 (3→8) not taken.
1138 return parseNumeric(terminal, cb);
1696 569 }
1697
1698 5407 int64_t ASTBuilder::parseLong(TerminalNode *terminal) {
1699 10814 const NumericParserCallback<int64_t> cb = [](const std::string &substr, short base, bool isSigned) -> int64_t {
1700
2/2
✓ Branch 0 (2→3) taken 5269 times.
✓ Branch 1 (2→5) taken 138 times.
5407 return isSigned ? std::stoll(substr, nullptr, base) : static_cast<int64_t>(std::stoull(substr, nullptr, base));
1701 5407 };
1702
1/2
✓ Branch 0 (3→4) taken 5407 times.
✗ Branch 1 (3→8) not taken.
10814 return parseNumeric(terminal, cb);
1703 5407 }
1704
1705 2642 int8_t ASTBuilder::parseChar(TerminalNode *terminal) const {
1706
1/2
✓ Branch 0 (2→3) taken 2642 times.
✗ Branch 1 (2→59) not taken.
2642 const std::string input = terminal->toString();
1707
2/2
✓ Branch 0 (4→5) taken 1661 times.
✓ Branch 1 (4→7) taken 981 times.
2642 if (input.length() == 3) // Normal char literals
1708 1661 return input[1];
1709
1710
3/6
✓ Branch 0 (8→9) taken 981 times.
✗ Branch 1 (8→12) not taken.
✓ Branch 2 (10→11) taken 981 times.
✗ Branch 3 (10→12) not taken.
✓ Branch 4 (13→14) taken 981 times.
✗ Branch 5 (13→34) not taken.
981 if (input.length() == 4 && input[1] == '\\') { // Char literals with escape sequence
1711
7/11
✓ Branch 0 (15→16) taken 5 times.
✗ Branch 1 (15→17) not taken.
✓ Branch 2 (15→18) taken 11 times.
✓ Branch 3 (15→19) taken 102 times.
✓ Branch 4 (15→20) taken 86 times.
✓ Branch 5 (15→21) taken 86 times.
✗ Branch 6 (15→22) not taken.
✗ Branch 7 (15→23) not taken.
✗ Branch 8 (15→24) not taken.
✓ Branch 9 (15→25) taken 690 times.
✓ Branch 10 (15→26) taken 1 times.
981 switch (input[2]) {
1712 5 case '\'':
1713 5 return '\'';
1714 case '"':
1715 return '\"';
1716 11 case '\\':
1717 11 return '\\';
1718 102 case 'n':
1719 102 return '\n';
1720 86 case 'r':
1721 86 return '\r';
1722 86 case 't':
1723 86 return '\t';
1724 case 'b':
1725 return '\b';
1726 case 'f':
1727 return '\f';
1728 case 'v':
1729 return '\v';
1730 690 case '0':
1731 690 return '\0';
1732 1 default:
1733
2/4
✓ Branch 0 (26→27) taken 1 times.
✗ Branch 1 (26→50) not taken.
✓ Branch 2 (27→28) taken 1 times.
✗ Branch 3 (27→50) not taken.
1 const CodeLoc codeLoc(terminal->getSymbol(), sourceFile);
1734
2/4
✓ Branch 0 (29→30) taken 1 times.
✗ Branch 1 (29→47) not taken.
✓ Branch 2 (30→31) taken 1 times.
✗ Branch 3 (30→44) not taken.
1 throw ParserError(codeLoc, INVALID_CHAR_LITERAL, "Invalid escape sequence " + input);
1735 }
1736 }
1737
1738 const CodeLoc codeLoc(terminal->getSymbol(), sourceFile);
1739 throw ParserError(codeLoc, INVALID_CHAR_LITERAL, "Invalid char literal " + input);
1740 2642 }
1741
1742 2778 std::string ASTBuilder::parseString(std::string input) {
1743
1/2
✓ Branch 0 (3→4) taken 2778 times.
✗ Branch 1 (3→9) not taken.
2778 input = input.substr(1, input.size() - 2);
1744 2778 replaceEscapeChars(input);
1745 2778 return input;
1746 }
1747
1748 10166 template <typename T> T ASTBuilder::parseNumeric(TerminalNode *terminal, const NumericParserCallback<T> &cb) {
1749
1/2
✓ Branch 0 (2→3) taken 10166 times.
✗ Branch 1 (2→87) not taken.
10166 const std::string input = terminal->toString();
1750
1751 // Set to signed if the input string does not end with 'u'
1752
6/6
✓ Branch 0 (4→5) taken 10159 times.
✓ Branch 1 (4→9) taken 7 times.
✓ Branch 2 (6→7) taken 9825 times.
✓ Branch 3 (6→9) taken 334 times.
✓ Branch 4 (8→9) taken 138 times.
✓ Branch 5 (8→10) taken 9687 times.
10166 const bool isUnsigned = input.ends_with('u') || input.ends_with("us") || input.ends_with("ul");
1753
1754 try {
1755
2/2
✓ Branch 0 (12→13) taken 2108 times.
✓ Branch 1 (12→30) taken 8058 times.
10166 if (input.length() >= 3) {
1756
2/2
✓ Branch 0 (14→15) taken 354 times.
✓ Branch 1 (14→30) taken 1754 times.
2108 if (input[0] == '0') {
1757
1/2
✓ Branch 0 (15→16) taken 354 times.
✗ Branch 1 (15→37) not taken.
354 const std::string subStr = input.substr(2);
1758
3/5
✗ Branch 0 (17→18) not taken.
✗ Branch 1 (17→20) not taken.
✓ Branch 2 (17→22) taken 38 times.
✓ Branch 3 (17→24) taken 307 times.
✓ Branch 4 (17→26) taken 9 times.
354 switch (input[1]) {
1759 case 'd': // fall-through
1760 case 'D':
1761 return cb(subStr, 10, !isUnsigned);
1762 case 'b': // fall-through
1763 case 'B':
1764 return cb(subStr, 2, !isUnsigned);
1765 38 case 'h': // fall-through
1766 case 'H': // fall-through
1767 case 'x': // fall-through
1768 case 'X':
1769
1/2
✓ Branch 0 (22→23) taken 38 times.
✗ Branch 1 (22→35) not taken.
38 return cb(subStr, 16, !isUnsigned);
1770 307 case 'o': // fall-through
1771 case 'O':
1772
1/2
✓ Branch 0 (24→25) taken 307 times.
✗ Branch 1 (24→35) not taken.
307 return cb(subStr, 8, !isUnsigned);
1773 9 default: // default is decimal
1774
1/2
✓ Branch 0 (26→27) taken 9 times.
✗ Branch 1 (26→35) not taken.
9 return cb(input, 10, !isUnsigned);
1775 }
1776 354 }
1777 }
1778
2/2
✓ Branch 0 (30→31) taken 9811 times.
✓ Branch 1 (30→38) taken 1 times.
9812 return cb(input, 10, !isUnsigned);
1779
1/3
✗ Branch 0 (38→39) not taken.
✓ Branch 1 (38→40) taken 1 times.
✗ Branch 2 (38→51) not taken.
2 } catch (std::out_of_range &) {
1780
2/4
✓ Branch 0 (41→42) taken 1 times.
✗ Branch 1 (41→70) not taken.
✓ Branch 2 (42→43) taken 1 times.
✗ Branch 3 (42→70) not taken.
1 const CodeLoc codeLoc(terminal->getSymbol(), sourceFile);
1781
2/4
✓ Branch 0 (46→47) taken 1 times.
✗ Branch 1 (46→64) not taken.
✓ Branch 2 (47→48) taken 1 times.
✗ Branch 3 (47→61) not taken.
3 throw ParserError(codeLoc, NUMBER_OUT_OF_RANGE, "The provided number is out of range");
1782 } catch (std::invalid_argument &) {
1783 const CodeLoc codeLoc(terminal->getSymbol(), sourceFile);
1784 throw ParserError(codeLoc, NUMBER_OUT_OF_RANGE, "You tried to parse '" + input + "' as an integer, but it was no integer");
1785 }
1786 10166 }
1787
1788 3586 void ASTBuilder::replaceEscapeChars(std::string &input) {
1789 const std::unordered_map<char, char> escapeMap = {
1790 {'a', '\a'}, {'b', '\b'}, {'f', '\f'}, {'n', '\n'}, {'r', '\r'}, {'t', '\t'},
1791 {'v', '\v'}, {'\\', '\\'}, {'?', '\?'}, {'\'', '\''}, {'"', '\"'},
1792
1/2
✓ Branch 0 (4→5) taken 3586 times.
✗ Branch 1 (4→40) not taken.
7172 };
1793
1794 3586 size_t writeIndex = 0;
1795 3586 size_t readIndex = 0;
1796 3586 const size_t len = input.length();
1797
1798
2/2
✓ Branch 0 (36→8) taken 53482 times.
✓ Branch 1 (36→37) taken 3586 times.
57068 while (readIndex < len) {
1799 53482 const char c = input[readIndex];
1800
3/4
✓ Branch 0 (9→10) taken 671 times.
✓ Branch 1 (9→33) taken 52811 times.
✓ Branch 2 (10→11) taken 671 times.
✗ Branch 3 (10→33) not taken.
53482 if (c == '\\' && readIndex + 1 < len) {
1801 671 char next = input[readIndex + 1];
1802
1/2
✓ Branch 0 (12→13) taken 671 times.
✗ Branch 1 (12→45) not taken.
671 auto it = escapeMap.find(next);
1803
2/2
✓ Branch 0 (15→16) taken 662 times.
✓ Branch 1 (15→19) taken 9 times.
671 if (it != escapeMap.end()) {
1804 662 input[writeIndex++] = it->second;
1805 662 readIndex += 2;
1806 668 continue;
1807 }
1808
1809 // Handle octal escape sequences (up to 3 digits)
1810
3/4
✓ Branch 0 (19→20) taken 9 times.
✗ Branch 1 (19→31) not taken.
✓ Branch 2 (20→21) taken 6 times.
✓ Branch 3 (20→31) taken 3 times.
9 if (next >= '0' && next <= '7') {
1811 6 int value = 0;
1812 6 size_t octalDigits = 0;
1813
1814 // Look ahead up to 3 digits
1815
3/4
✓ Branch 0 (26→27) taken 18 times.
✓ Branch 1 (26→28) taken 6 times.
✓ Branch 2 (27→22) taken 18 times.
✗ Branch 3 (27→28) not taken.
24 for (size_t i = 1; i <= 3 && readIndex + i < len; ++i) {
1816 18 const char oc = input[readIndex + i];
1817
2/4
✓ Branch 0 (23→24) taken 18 times.
✗ Branch 1 (23→28) not taken.
✓ Branch 2 (24→25) taken 18 times.
✗ Branch 3 (24→28) not taken.
18 if (oc >= '0' && oc <= '7') {
1818 18 value = value << 3 | oc - '0'; // multiply by 8 and add digit
1819 18 octalDigits++;
1820 } else {
1821 break;
1822 }
1823 }
1824
1825
1/2
✓ Branch 0 (28→29) taken 6 times.
✗ Branch 1 (28→31) not taken.
6 if (octalDigits > 0) {
1826 6 input[writeIndex++] = static_cast<char>(value);
1827 6 readIndex += 1 + octalDigits; // backslash + octal digits
1828 6 continue;
1829 }
1830 }
1831 }
1832
1833 // Copy current character
1834 52814 input[writeIndex++] = c;
1835 52814 readIndex++;
1836 }
1837
1838
1/2
✓ Branch 0 (37→38) taken 3586 times.
✗ Branch 1 (37→46) not taken.
3586 input.resize(writeIndex);
1839 3586 }
1840
1841 108971 std::string ASTBuilder::getIdentifier(TerminalNode *terminal, bool isTypeIdentifier) const {
1842 108971 const std::string identifier = terminal->getText();
1843
1844 // Check if the list of reserved keywords contains the given identifier
1845
3/4
✓ Branch 0 (3→4) taken 108971 times.
✗ Branch 1 (3→56) not taken.
✓ Branch 2 (6→7) taken 1 times.
✓ Branch 3 (6→16) taken 108970 times.
217942 if (std::ranges::find(RESERVED_KEYWORDS, identifier) != std::end(RESERVED_KEYWORDS)) {
1846
2/4
✓ Branch 0 (7→8) taken 1 times.
✗ Branch 1 (7→45) not taken.
✓ Branch 2 (8→9) taken 1 times.
✗ Branch 3 (8→45) not taken.
1 const CodeLoc codeLoc(terminal->getSymbol(), sourceFile);
1847
3/6
✓ Branch 0 (10→11) taken 1 times.
✗ Branch 1 (10→41) not taken.
✓ Branch 2 (11→12) taken 1 times.
✗ Branch 3 (11→39) not taken.
✓ Branch 4 (12→13) taken 1 times.
✗ Branch 5 (12→36) not taken.
1 throw ParserError(codeLoc, RESERVED_KEYWORD, "'" + identifier + "' is a reserved keyword. Please use another name instead");
1848 }
1849
1850 // Check if the identifier is a type identifier and is reserved
1851
6/6
✓ Branch 0 (16→17) taken 9038 times.
✓ Branch 1 (16→23) taken 99932 times.
✓ Branch 2 (17→18) taken 767 times.
✓ Branch 3 (17→23) taken 8271 times.
✓ Branch 4 (24→25) taken 1 times.
✓ Branch 5 (24→34) taken 108969 times.
109737 if (isTypeIdentifier && !sourceFile->isStdFile &&
1852
3/4
✓ Branch 0 (18→19) taken 767 times.
✗ Branch 1 (18→56) not taken.
✓ Branch 2 (21→22) taken 1 times.
✓ Branch 3 (21→23) taken 766 times.
1534 std::ranges::find(RESERVED_TYPE_NAMES, identifier) != std::end(RESERVED_TYPE_NAMES)) {
1853
2/4
✓ Branch 0 (25→26) taken 1 times.
✗ Branch 1 (25→55) not taken.
✓ Branch 2 (26→27) taken 1 times.
✗ Branch 3 (26→55) not taken.
1 const CodeLoc codeLoc(terminal->getSymbol(), sourceFile);
1854
3/6
✓ Branch 0 (28→29) taken 1 times.
✗ Branch 1 (28→51) not taken.
✓ Branch 2 (29→30) taken 1 times.
✗ Branch 3 (29→49) not taken.
✓ Branch 4 (30→31) taken 1 times.
✗ Branch 5 (30→46) not taken.
1 throw ParserError(codeLoc, RESERVED_TYPENAME, "'" + identifier + "' is a reserved type name. Please use another one instead");
1855 }
1856
1857 108969 return identifier;
1858 2 }
1859
1860 } // namespace spice::compiler
1861