GCC Code Coverage Report


Directory: ../
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 95.7% 1148 / 16 / 1215
Functions: 100.0% 96 / 0 / 96
Branches: 58.5% 1579 / 2 / 2703

src/ast/ASTBuilder.cpp
Line Branch Exec Source
1 // Copyright (c) 2021-2026 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 6063 ASTBuilder::ASTBuilder(GlobalResourceManager &resourceManager, SourceFile *sourceFile, antlr4::ANTLRInputStream *inputStream)
17
1/2
✓ Branch 4 → 5 taken 6063 times.
✗ Branch 4 → 6 not taken.
6063 : CompilerPass(resourceManager, sourceFile), inputStream(inputStream) {}
18
19 6059 std::any ASTBuilder::visitEntry(SpiceParser::EntryContext *ctx) {
20 6059 const auto entryNode = createNode<EntryNode>(ctx);
21
22 // Visit children
23
2/2
✓ Branch 135 → 5 taken 122875 times.
✓ Branch 135 → 136 taken 6047 times.
134981 for (ParserRuleContext::ParseTree *child : ctx->children) {
24
3/4
✓ Branch 7 → 8 taken 122875 times.
✗ Branch 7 → 9 not taken.
✓ Branch 10 → 11 taken 1222 times.
✓ Branch 10 → 16 taken 121653 times.
122875 if (auto *mainFctDefCtx = dynamic_cast<SpiceParser::MainFunctionDefContext *>(child))
25
4/6
✓ Branch 11 → 12 taken 1214 times.
✓ Branch 11 → 148 taken 8 times.
✓ Branch 12 → 13 taken 1214 times.
✗ Branch 12 → 146 not taken.
✓ Branch 13 → 14 taken 1214 times.
✗ Branch 13 → 146 not taken.
1222 entryNode->topLevelDefs.push_back(std::any_cast<MainFctDefNode *>(visit(mainFctDefCtx)));
26
3/4
✓ Branch 16 → 17 taken 121653 times.
✗ Branch 16 → 18 not taken.
✓ Branch 19 → 20 taken 48728 times.
✓ Branch 19 → 25 taken 72925 times.
121653 else if (auto *fctDefCtx = dynamic_cast<SpiceParser::FunctionDefContext *>(child))
27
3/6
✓ Branch 20 → 21 taken 48728 times.
✗ Branch 20 → 152 not taken.
✓ Branch 21 → 22 taken 48728 times.
✗ Branch 21 → 150 not taken.
✓ Branch 22 → 23 taken 48728 times.
✗ Branch 22 → 150 not taken.
48728 entryNode->topLevelDefs.push_back(std::any_cast<FctDefNode *>(visit(fctDefCtx)));
28
3/4
✓ Branch 25 → 26 taken 72925 times.
✗ Branch 25 → 27 not taken.
✓ Branch 28 → 29 taken 29254 times.
✓ Branch 28 → 34 taken 43671 times.
72925 else if (auto *procDefCtx = dynamic_cast<SpiceParser::ProcedureDefContext *>(child))
29
3/6
✓ Branch 29 → 30 taken 29254 times.
✗ Branch 29 → 156 not taken.
✓ Branch 30 → 31 taken 29254 times.
✗ Branch 30 → 154 not taken.
✓ Branch 31 → 32 taken 29254 times.
✗ Branch 31 → 154 not taken.
29254 entryNode->topLevelDefs.push_back(std::any_cast<ProcDefNode *>(visit(procDefCtx)));
30
3/4
✓ Branch 34 → 35 taken 43671 times.
✗ Branch 34 → 36 not taken.
✓ Branch 37 → 38 taken 7491 times.
✓ Branch 37 → 43 taken 36180 times.
43671 else if (auto *structDefCtx = dynamic_cast<SpiceParser::StructDefContext *>(child))
31
4/6
✓ Branch 38 → 39 taken 7489 times.
✓ Branch 38 → 160 taken 2 times.
✓ Branch 39 → 40 taken 7489 times.
✗ Branch 39 → 158 not taken.
✓ Branch 40 → 41 taken 7489 times.
✗ Branch 40 → 158 not taken.
7491 entryNode->topLevelDefs.push_back(std::any_cast<StructDefNode *>(visit(structDefCtx)));
32
3/4
✓ Branch 43 → 44 taken 36180 times.
✗ Branch 43 → 45 not taken.
✓ Branch 46 → 47 taken 805 times.
✓ Branch 46 → 52 taken 35375 times.
36180 else if (auto *interfaceDefCtx = dynamic_cast<SpiceParser::InterfaceDefContext *>(child))
33
3/6
✓ Branch 47 → 48 taken 805 times.
✗ Branch 47 → 164 not taken.
✓ Branch 48 → 49 taken 805 times.
✗ Branch 48 → 162 not taken.
✓ Branch 49 → 50 taken 805 times.
✗ Branch 49 → 162 not taken.
805 entryNode->topLevelDefs.push_back(std::any_cast<InterfaceDefNode *>(visit(interfaceDefCtx)));
34
3/4
✓ Branch 52 → 53 taken 35375 times.
✗ Branch 52 → 54 not taken.
✓ Branch 55 → 56 taken 1232 times.
✓ Branch 55 → 61 taken 34143 times.
35375 else if (auto *enumDefCtx = dynamic_cast<SpiceParser::EnumDefContext *>(child))
35
3/6
✓ Branch 56 → 57 taken 1232 times.
✗ Branch 56 → 168 not taken.
✓ Branch 57 → 58 taken 1232 times.
✗ Branch 57 → 166 not taken.
✓ Branch 58 → 59 taken 1232 times.
✗ Branch 58 → 166 not taken.
1232 entryNode->topLevelDefs.push_back(std::any_cast<EnumDefNode *>(visit(enumDefCtx)));
36
3/4
✓ Branch 61 → 62 taken 34143 times.
✗ Branch 61 → 63 not taken.
✓ Branch 64 → 65 taken 4495 times.
✓ Branch 64 → 70 taken 29648 times.
34143 else if (auto *genericTypeDefCtx = dynamic_cast<SpiceParser::GenericTypeDefContext *>(child))
37
3/6
✓ Branch 65 → 66 taken 4495 times.
✗ Branch 65 → 172 not taken.
✓ Branch 66 → 67 taken 4495 times.
✗ Branch 66 → 170 not taken.
✓ Branch 67 → 68 taken 4495 times.
✗ Branch 67 → 170 not taken.
4495 entryNode->topLevelDefs.push_back(std::any_cast<GenericTypeDefNode *>(visit(genericTypeDefCtx)));
38
3/4
✓ Branch 70 → 71 taken 29648 times.
✗ Branch 70 → 72 not taken.
✓ Branch 73 → 74 taken 707 times.
✓ Branch 73 → 79 taken 28941 times.
29648 else if (auto *aliasDefCtx = dynamic_cast<SpiceParser::AliasDefContext *>(child))
39
3/6
✓ Branch 74 → 75 taken 707 times.
✗ Branch 74 → 176 not taken.
✓ Branch 75 → 76 taken 707 times.
✗ Branch 75 → 174 not taken.
✓ Branch 76 → 77 taken 707 times.
✗ Branch 76 → 174 not taken.
707 entryNode->topLevelDefs.push_back(std::any_cast<AliasDefNode *>(visit(aliasDefCtx)));
40
3/4
✓ Branch 79 → 80 taken 28941 times.
✗ Branch 79 → 81 not taken.
✓ Branch 82 → 83 taken 5945 times.
✓ Branch 82 → 88 taken 22996 times.
28941 else if (auto *globalVarDefCtx = dynamic_cast<SpiceParser::GlobalVarDefContext *>(child))
41
3/6
✓ Branch 83 → 84 taken 5945 times.
✗ Branch 83 → 180 not taken.
✓ Branch 84 → 85 taken 5945 times.
✗ Branch 84 → 178 not taken.
✓ Branch 85 → 86 taken 5945 times.
✗ Branch 85 → 178 not taken.
5945 entryNode->topLevelDefs.push_back(std::any_cast<GlobalVarDefNode *>(visit(globalVarDefCtx)));
42
3/4
✓ Branch 88 → 89 taken 22996 times.
✗ Branch 88 → 90 not taken.
✓ Branch 91 → 92 taken 5908 times.
✓ Branch 91 → 97 taken 17088 times.
22996 else if (auto *importDefCtx = dynamic_cast<SpiceParser::ImportDefContext *>(child))
43
3/6
✓ Branch 92 → 93 taken 5908 times.
✗ Branch 92 → 184 not taken.
✓ Branch 93 → 94 taken 5908 times.
✗ Branch 93 → 182 not taken.
✓ Branch 94 → 95 taken 5908 times.
✗ Branch 94 → 182 not taken.
5908 entryNode->importDefs.push_back(std::any_cast<ImportDefNode *>(visit(importDefCtx)));
44
3/4
✓ Branch 97 → 98 taken 17088 times.
✗ Branch 97 → 99 not taken.
✓ Branch 100 → 101 taken 8887 times.
✓ Branch 100 → 106 taken 8201 times.
17088 else if (auto *extDeclCtx = dynamic_cast<SpiceParser::ExtDeclContext *>(child))
45
3/6
✓ Branch 101 → 102 taken 8887 times.
✗ Branch 101 → 188 not taken.
✓ Branch 102 → 103 taken 8887 times.
✗ Branch 102 → 186 not taken.
✓ Branch 103 → 104 taken 8887 times.
✗ Branch 103 → 186 not taken.
8887 entryNode->topLevelDefs.push_back(std::any_cast<ExtDeclNode *>(visit(extDeclCtx)));
46
3/4
✓ Branch 106 → 107 taken 8201 times.
✗ Branch 106 → 108 not taken.
✓ Branch 109 → 110 taken 2154 times.
✓ Branch 109 → 115 taken 6047 times.
8201 else if (auto *modAttrCtx = dynamic_cast<SpiceParser::ModAttrContext *>(child))
47
4/6
✓ Branch 110 → 111 taken 2152 times.
✓ Branch 110 → 192 taken 2 times.
✓ Branch 111 → 112 taken 2152 times.
✗ Branch 111 → 190 not taken.
✓ Branch 112 → 113 taken 2152 times.
✗ Branch 112 → 190 not taken.
2154 entryNode->modAttrs.push_back(std::any_cast<ModAttrNode *>(visit(modAttrCtx)));
48
1/2
✓ Branch 115 → 116 taken 6047 times.
✗ Branch 115 → 117 not taken.
6047 else if (const auto *eofCtx = dynamic_cast<TerminalNode *>(child);
49
5/10
✓ Branch 118 → 119 taken 6047 times.
✗ Branch 118 → 122 not taken.
✓ Branch 119 → 120 taken 6047 times.
✗ Branch 119 → 194 not taken.
✓ Branch 120 → 121 taken 6047 times.
✗ Branch 120 → 194 not taken.
✗ Branch 121 → 122 not taken.
✓ Branch 121 → 123 taken 6047 times.
✗ Branch 124 → 125 not taken.
✓ Branch 124 → 126 taken 6047 times.
6047 !eofCtx || eofCtx->getSymbol()->getType() != SpiceParser::EOF)
50 assert_fail("Unknown top level definition type"); // GCOV_EXCL_LINE
51 }
52
53
1/2
✓ Branch 142 → 143 taken 6047 times.
✗ Branch 142 → 195 not taken.
12094 return concludeNode(entryNode);
54 }
55
56 1222 std::any ASTBuilder::visitMainFunctionDef(SpiceParser::MainFunctionDefContext *ctx) {
57 1222 const auto mainFctDefNode = createNode<MainFctDefNode>(ctx);
58
59 // Visit children
60
2/2
✓ Branch 4 → 5 taken 2 times.
✓ Branch 4 → 10 taken 1220 times.
1222 if (ctx->topLevelDefAttr())
61
3/6
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 33 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 33 not taken.
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 31 not taken.
2 mainFctDefNode->attrs = std::any_cast<TopLevelDefAttrNode *>(visit(ctx->topLevelDefAttr()));
62
2/2
✓ Branch 11 → 12 taken 14 times.
✓ Branch 11 → 17 taken 1208 times.
1222 if (ctx->paramLst()) {
63 14 mainFctDefNode->takesArgs = true;
64
3/6
✓ Branch 12 → 13 taken 14 times.
✗ Branch 12 → 36 not taken.
✓ Branch 13 → 14 taken 14 times.
✗ Branch 13 → 36 not taken.
✓ Branch 14 → 15 taken 14 times.
✗ Branch 14 → 34 not taken.
14 mainFctDefNode->paramLst = std::any_cast<ParamLstNode *>(visit(ctx->paramLst()));
65 }
66
5/8
✓ Branch 17 → 18 taken 1222 times.
✗ Branch 17 → 39 not taken.
✓ Branch 18 → 19 taken 1214 times.
✓ Branch 18 → 39 taken 8 times.
✓ Branch 19 → 20 taken 1214 times.
✗ Branch 19 → 37 not taken.
✓ Branch 21 → 22 taken 1214 times.
✗ Branch 21 → 40 not taken.
1222 mainFctDefNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
67
68
1/2
✓ Branch 27 → 28 taken 1214 times.
✗ Branch 27 → 40 not taken.
2428 return concludeNode(mainFctDefNode);
69 }
70
71 48728 std::any ASTBuilder::visitFunctionDef(SpiceParser::FunctionDefContext *ctx) {
72 48728 const auto fctDefNode = createNode<FctDefNode>(ctx);
73
74 // Visit children
75
2/2
✓ Branch 4 → 5 taken 1612 times.
✓ Branch 4 → 24 taken 47116 times.
48728 if (ctx->topLevelDefAttr()) {
76
3/6
✓ Branch 5 → 6 taken 1612 times.
✗ Branch 5 → 70 not taken.
✓ Branch 6 → 7 taken 1612 times.
✗ Branch 6 → 70 not taken.
✓ Branch 7 → 8 taken 1612 times.
✗ Branch 7 → 68 not taken.
1612 fctDefNode->attrs = std::any_cast<TopLevelDefAttrNode *>(visit(ctx->topLevelDefAttr()));
77 // Tell the attributes that they are function attributes
78
2/2
✓ Branch 22 → 11 taken 1816 times.
✓ Branch 22 → 23 taken 1612 times.
5040 for (AttrNode *attr : fctDefNode->attrs->attrLst->attributes)
79 1816 attr->target = AttrNode::TARGET_FCT_PROC;
80 }
81
2/2
✓ Branch 25 → 26 taken 46597 times.
✓ Branch 25 → 31 taken 2131 times.
48728 if (ctx->qualifierLst())
82
3/6
✓ Branch 26 → 27 taken 46597 times.
✗ Branch 26 → 73 not taken.
✓ Branch 27 → 28 taken 46597 times.
✗ Branch 27 → 73 not taken.
✓ Branch 28 → 29 taken 46597 times.
✗ Branch 28 → 71 not taken.
46597 fctDefNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
83
3/6
✓ Branch 31 → 32 taken 48728 times.
✗ Branch 31 → 76 not taken.
✓ Branch 32 → 33 taken 48728 times.
✗ Branch 32 → 76 not taken.
✓ Branch 33 → 34 taken 48728 times.
✗ Branch 33 → 74 not taken.
48728 fctDefNode->returnType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
84 48728 fctDefNode->returnType->isReturnType = true;
85
3/6
✓ Branch 35 → 36 taken 48728 times.
✗ Branch 35 → 79 not taken.
✓ Branch 36 → 37 taken 48728 times.
✗ Branch 36 → 79 not taken.
✓ Branch 37 → 38 taken 48728 times.
✗ Branch 37 → 77 not taken.
48728 fctDefNode->name = std::any_cast<FctNameNode *>(visit(ctx->fctName()));
86 48728 fctDefNode->isMethod = fctDefNode->name->nameFragments.size() > 1;
87
2/2
✓ Branch 41 → 42 taken 4932 times.
✓ Branch 41 → 47 taken 43796 times.
48728 if (ctx->typeLst()) {
88 4932 fctDefNode->hasTemplateTypes = true;
89
3/6
✓ Branch 42 → 43 taken 4932 times.
✗ Branch 42 → 82 not taken.
✓ Branch 43 → 44 taken 4932 times.
✗ Branch 43 → 82 not taken.
✓ Branch 44 → 45 taken 4932 times.
✗ Branch 44 → 80 not taken.
4932 fctDefNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
90 }
91
2/2
✓ Branch 48 → 49 taken 35398 times.
✓ Branch 48 → 54 taken 13330 times.
48728 if (ctx->paramLst()) {
92 35398 fctDefNode->hasParams = true;
93
3/6
✓ Branch 49 → 50 taken 35398 times.
✗ Branch 49 → 85 not taken.
✓ Branch 50 → 51 taken 35398 times.
✗ Branch 50 → 85 not taken.
✓ Branch 51 → 52 taken 35398 times.
✗ Branch 51 → 83 not taken.
35398 fctDefNode->paramLst = std::any_cast<ParamLstNode *>(visit(ctx->paramLst()));
94 }
95
4/8
✓ Branch 54 → 55 taken 48728 times.
✗ Branch 54 → 88 not taken.
✓ Branch 55 → 56 taken 48728 times.
✗ Branch 55 → 88 not taken.
✓ Branch 56 → 57 taken 48728 times.
✗ Branch 56 → 86 not taken.
✓ Branch 58 → 59 taken 48728 times.
✗ Branch 58 → 89 not taken.
48728 fctDefNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
96
97
1/2
✓ Branch 64 → 65 taken 48728 times.
✗ Branch 64 → 89 not taken.
97456 return concludeNode(fctDefNode);
98 }
99
100 29254 std::any ASTBuilder::visitProcedureDef(SpiceParser::ProcedureDefContext *ctx) {
101 29254 const auto procDefNode = createNode<ProcDefNode>(ctx);
102
103 // Visit children
104
2/2
✓ Branch 4 → 5 taken 2 times.
✓ Branch 4 → 24 taken 29252 times.
29254 if (ctx->topLevelDefAttr()) {
105
3/6
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 66 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 66 not taken.
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 64 not taken.
2 procDefNode->attrs = std::any_cast<TopLevelDefAttrNode *>(visit(ctx->topLevelDefAttr()));
106 // Tell the attributes that they are function attributes
107
2/2
✓ Branch 22 → 11 taken 2 times.
✓ Branch 22 → 23 taken 2 times.
6 for (AttrNode *attr : procDefNode->attrs->attrLst->attributes)
108 2 attr->target = AttrNode::TARGET_FCT_PROC;
109 }
110
2/2
✓ Branch 25 → 26 taken 24643 times.
✓ Branch 25 → 31 taken 4611 times.
29254 if (ctx->qualifierLst())
111
3/6
✓ Branch 26 → 27 taken 24643 times.
✗ Branch 26 → 69 not taken.
✓ Branch 27 → 28 taken 24643 times.
✗ Branch 27 → 69 not taken.
✓ Branch 28 → 29 taken 24643 times.
✗ Branch 28 → 67 not taken.
24643 procDefNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
112
3/6
✓ Branch 31 → 32 taken 29254 times.
✗ Branch 31 → 72 not taken.
✓ Branch 32 → 33 taken 29254 times.
✗ Branch 32 → 72 not taken.
✓ Branch 33 → 34 taken 29254 times.
✗ Branch 33 → 70 not taken.
29254 procDefNode->name = std::any_cast<FctNameNode *>(visit(ctx->fctName()));
113 29254 procDefNode->isMethod = procDefNode->name->nameFragments.size() > 1;
114
2/2
✓ Branch 37 → 38 taken 5042 times.
✓ Branch 37 → 43 taken 24212 times.
29254 if (ctx->typeLst()) {
115 5042 procDefNode->hasTemplateTypes = true;
116
3/6
✓ Branch 38 → 39 taken 5042 times.
✗ Branch 38 → 75 not taken.
✓ Branch 39 → 40 taken 5042 times.
✗ Branch 39 → 75 not taken.
✓ Branch 40 → 41 taken 5042 times.
✗ Branch 40 → 73 not taken.
5042 procDefNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
117 }
118
2/2
✓ Branch 44 → 45 taken 21629 times.
✓ Branch 44 → 50 taken 7625 times.
29254 if (ctx->paramLst()) {
119 21629 procDefNode->hasParams = true;
120
3/6
✓ Branch 45 → 46 taken 21629 times.
✗ Branch 45 → 78 not taken.
✓ Branch 46 → 47 taken 21629 times.
✗ Branch 46 → 78 not taken.
✓ Branch 47 → 48 taken 21629 times.
✗ Branch 47 → 76 not taken.
21629 procDefNode->paramLst = std::any_cast<ParamLstNode *>(visit(ctx->paramLst()));
121 }
122
4/8
✓ Branch 50 → 51 taken 29254 times.
✗ Branch 50 → 81 not taken.
✓ Branch 51 → 52 taken 29254 times.
✗ Branch 51 → 81 not taken.
✓ Branch 52 → 53 taken 29254 times.
✗ Branch 52 → 79 not taken.
✓ Branch 54 → 55 taken 29254 times.
✗ Branch 54 → 82 not taken.
29254 procDefNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
123
124
1/2
✓ Branch 60 → 61 taken 29254 times.
✗ Branch 60 → 82 not taken.
58508 return concludeNode(procDefNode);
125 }
126
127 77982 std::any ASTBuilder::visitFctName(SpiceParser::FctNameContext *ctx) {
128
1/2
✓ Branch 2 → 3 taken 77982 times.
✗ Branch 2 → 54 not taken.
77982 const auto fctNameNode = createNode<FctNameNode>(ctx);
129
130 // Extract function name
131
1/2
✓ Branch 3 → 4 taken 77982 times.
✗ Branch 3 → 54 not taken.
77982 std::stringstream fqName;
132
3/4
✓ Branch 4 → 5 taken 77982 times.
✗ Branch 4 → 52 not taken.
✓ Branch 5 → 6 taken 48843 times.
✓ Branch 5 → 14 taken 29139 times.
77982 if (ctx->TYPE_IDENTIFIER()) {
133
2/4
✓ Branch 6 → 7 taken 48843 times.
✗ Branch 6 → 45 not taken.
✓ Branch 7 → 8 taken 48843 times.
✗ Branch 7 → 45 not taken.
48843 const std::string typeIdentifier = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
134
1/2
✓ Branch 8 → 9 taken 48843 times.
✗ Branch 8 → 43 not taken.
48843 fctNameNode->structName = typeIdentifier;
135
2/4
✓ Branch 9 → 10 taken 48843 times.
✗ Branch 9 → 43 not taken.
✓ Branch 10 → 11 taken 48843 times.
✗ Branch 10 → 43 not taken.
48843 fqName << typeIdentifier << MEMBER_ACCESS_TOKEN;
136
1/2
✓ Branch 11 → 12 taken 48843 times.
✗ Branch 11 → 43 not taken.
48843 fctNameNode->nameFragments.push_back(typeIdentifier);
137 48843 }
138
3/4
✓ Branch 14 → 15 taken 77982 times.
✗ Branch 14 → 52 not taken.
✓ Branch 15 → 16 taken 69874 times.
✓ Branch 15 → 23 taken 8108 times.
77982 if (ctx->IDENTIFIER()) {
139
2/4
✓ Branch 16 → 17 taken 69874 times.
✗ Branch 16 → 48 not taken.
✓ Branch 17 → 18 taken 69874 times.
✗ Branch 17 → 48 not taken.
69874 const std::string fctIdentifier = getIdentifier(ctx->IDENTIFIER(), false);
140
1/2
✓ Branch 18 → 19 taken 69874 times.
✗ Branch 18 → 46 not taken.
69874 fctNameNode->name = fctIdentifier;
141
1/2
✓ Branch 19 → 20 taken 69874 times.
✗ Branch 19 → 46 not taken.
69874 fqName << fctIdentifier;
142
1/2
✓ Branch 20 → 21 taken 69874 times.
✗ Branch 20 → 46 not taken.
69874 fctNameNode->nameFragments.push_back(fctIdentifier);
143 69874 }
144
1/2
✓ Branch 23 → 24 taken 77982 times.
✗ Branch 23 → 49 not taken.
77982 fctNameNode->fqName = fqName.str();
145
146 // Visit children
147
3/4
✓ Branch 26 → 27 taken 77982 times.
✗ Branch 26 → 52 not taken.
✓ Branch 27 → 28 taken 8108 times.
✓ Branch 27 → 32 taken 69874 times.
77982 if (ctx->overloadableOp())
148
2/4
✓ Branch 28 → 29 taken 8108 times.
✗ Branch 28 → 50 not taken.
✓ Branch 29 → 30 taken 8108 times.
✗ Branch 29 → 50 not taken.
8108 visit(ctx->overloadableOp());
149
150
1/2
✓ Branch 38 → 39 taken 77982 times.
✗ Branch 38 → 51 not taken.
155964 return concludeNode(fctNameNode);
151 77982 }
152
153 7491 std::any ASTBuilder::visitStructDef(SpiceParser::StructDefContext *ctx) {
154 7491 const auto structDefNode = createNode<StructDefNode>(ctx);
155
156 // Enrich
157
3/4
✓ Branch 3 → 4 taken 7491 times.
✗ Branch 3 → 103 not taken.
✓ Branch 4 → 5 taken 7489 times.
✓ Branch 4 → 103 taken 2 times.
7491 structDefNode->structName = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
158 7489 structDefNode->typeId = resourceManager.getNextCustomTypeId();
159
160 // Visit children
161
2/2
✓ Branch 9 → 10 taken 248 times.
✓ Branch 9 → 49 taken 7241 times.
7489 if (ctx->topLevelDefAttr()) {
162
3/6
✓ Branch 10 → 11 taken 248 times.
✗ Branch 10 → 106 not taken.
✓ Branch 11 → 12 taken 248 times.
✗ Branch 11 → 106 not taken.
✓ Branch 12 → 13 taken 248 times.
✗ Branch 12 → 104 not taken.
248 structDefNode->attrs = std::any_cast<TopLevelDefAttrNode *>(visit(ctx->topLevelDefAttr()));
163
164 // Tell the attributes that they are struct attributes
165
2/2
✓ Branch 27 → 16 taken 248 times.
✓ Branch 27 → 28 taken 248 times.
744 for (AttrNode *attr : structDefNode->attrs->attrLst->attributes)
166 248 attr->target = AttrNode::TARGET_STRUCT;
167
168 // Check if a custom type id was set
169
7/18
✓ Branch 28 → 29 taken 248 times.
✗ Branch 28 → 35 not taken.
✓ Branch 31 → 32 taken 248 times.
✗ Branch 31 → 107 not taken.
✓ Branch 32 → 33 taken 248 times.
✗ Branch 32 → 107 not taken.
✗ Branch 33 → 34 not taken.
✓ Branch 33 → 35 taken 248 times.
✓ Branch 36 → 37 taken 248 times.
✗ Branch 36 → 38 not taken.
✓ Branch 38 → 39 taken 248 times.
✗ Branch 38 → 41 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 49 taken 248 times.
✗ Branch 107 → 108 not taken.
✗ Branch 107 → 109 not taken.
✗ Branch 111 → 112 not taken.
✗ Branch 111 → 114 not taken.
744 if (structDefNode->attrs && structDefNode->attrs->attrLst->hasAttr(ATTR_CORE_COMPILER_FIXED_TYPE_ID))
170 structDefNode->typeId = structDefNode->attrs->attrLst->getAttrValueByName(ATTR_CORE_COMPILER_FIXED_TYPE_ID)->intValue;
171 }
172
2/2
✓ Branch 50 → 51 taken 5979 times.
✓ Branch 50 → 56 taken 1510 times.
7489 if (ctx->qualifierLst())
173
3/6
✓ Branch 51 → 52 taken 5979 times.
✗ Branch 51 → 124 not taken.
✓ Branch 52 → 53 taken 5979 times.
✗ Branch 52 → 124 not taken.
✓ Branch 53 → 54 taken 5979 times.
✗ Branch 53 → 122 not taken.
5979 structDefNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
174
2/2
✓ Branch 57 → 58 taken 1462 times.
✓ Branch 57 → 63 taken 6027 times.
7489 if (ctx->LESS()) {
175 1462 structDefNode->hasTemplateTypes = true;
176
3/6
✓ Branch 58 → 59 taken 1462 times.
✗ Branch 58 → 127 not taken.
✓ Branch 59 → 60 taken 1462 times.
✗ Branch 59 → 127 not taken.
✓ Branch 60 → 61 taken 1462 times.
✗ Branch 60 → 125 not taken.
1462 structDefNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst(0)));
177 }
178
2/2
✓ Branch 64 → 65 taken 742 times.
✓ Branch 64 → 73 taken 6747 times.
7489 if (ctx->COLON()) {
179 742 structDefNode->hasInterfaces = true;
180
5/8
✓ Branch 65 → 66 taken 612 times.
✓ Branch 65 → 67 taken 130 times.
✓ Branch 68 → 69 taken 742 times.
✗ Branch 68 → 130 not taken.
✓ Branch 69 → 70 taken 742 times.
✗ Branch 69 → 130 not taken.
✓ Branch 70 → 71 taken 742 times.
✗ Branch 70 → 128 not taken.
742 structDefNode->interfaceTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst(structDefNode->hasTemplateTypes ? 1 : 0)));
181 }
182
3/4
✓ Branch 73 → 74 taken 7489 times.
✗ Branch 73 → 137 not taken.
✓ Branch 91 → 76 taken 15279 times.
✓ Branch 91 → 92 taken 7489 times.
30257 for (SpiceParser::FieldContext *field : ctx->field())
183
3/6
✓ Branch 78 → 79 taken 15279 times.
✗ Branch 78 → 133 not taken.
✓ Branch 79 → 80 taken 15279 times.
✗ Branch 79 → 131 not taken.
✓ Branch 80 → 81 taken 15279 times.
✗ Branch 80 → 131 not taken.
22768 structDefNode->fields.push_back(std::any_cast<FieldNode *>(visit(field)));
184
185
1/2
✓ Branch 99 → 100 taken 7489 times.
✗ Branch 99 → 138 not taken.
14978 return concludeNode(structDefNode);
186 }
187
188 805 std::any ASTBuilder::visitInterfaceDef(SpiceParser::InterfaceDefContext *ctx) {
189 805 const auto interfaceDefNode = createNode<InterfaceDefNode>(ctx);
190
191 // Enrich
192
2/4
✓ Branch 3 → 4 taken 805 times.
✗ Branch 3 → 93 not taken.
✓ Branch 4 → 5 taken 805 times.
✗ Branch 4 → 93 not taken.
805 interfaceDefNode->interfaceName = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
193 805 interfaceDefNode->typeId = resourceManager.getNextCustomTypeId();
194
195 // Visit children
196
2/2
✓ Branch 9 → 10 taken 370 times.
✓ Branch 9 → 49 taken 435 times.
805 if (ctx->topLevelDefAttr()) {
197
3/6
✓ Branch 10 → 11 taken 370 times.
✗ Branch 10 → 96 not taken.
✓ Branch 11 → 12 taken 370 times.
✗ Branch 11 → 96 not taken.
✓ Branch 12 → 13 taken 370 times.
✗ Branch 12 → 94 not taken.
370 interfaceDefNode->attrs = std::any_cast<TopLevelDefAttrNode *>(visit(ctx->topLevelDefAttr()));
198
199 // Tell the attributes that they are struct attributes
200
2/2
✓ Branch 27 → 16 taken 370 times.
✓ Branch 27 → 28 taken 370 times.
1110 for (AttrNode *attr : interfaceDefNode->attrs->attrLst->attributes)
201 370 attr->target = AttrNode::TARGET_INTERFACE;
202
203 // Check if a custom type id was set
204
7/18
✓ Branch 28 → 29 taken 370 times.
✗ Branch 28 → 35 not taken.
✓ Branch 31 → 32 taken 370 times.
✗ Branch 31 → 97 not taken.
✓ Branch 32 → 33 taken 370 times.
✗ Branch 32 → 97 not taken.
✓ Branch 33 → 34 taken 370 times.
✗ Branch 33 → 35 not taken.
✓ Branch 36 → 37 taken 370 times.
✗ Branch 36 → 38 not taken.
✓ Branch 38 → 39 taken 370 times.
✗ Branch 38 → 41 not taken.
✓ Branch 41 → 42 taken 370 times.
✗ Branch 41 → 49 not taken.
✗ Branch 97 → 98 not taken.
✗ Branch 97 → 99 not taken.
✗ Branch 101 → 102 not taken.
✗ Branch 101 → 104 not taken.
1110 if (interfaceDefNode->attrs && interfaceDefNode->attrs->attrLst->hasAttr(ATTR_CORE_COMPILER_FIXED_TYPE_ID))
205
2/4
✓ Branch 44 → 45 taken 370 times.
✗ Branch 44 → 108 not taken.
✓ Branch 45 → 46 taken 370 times.
✗ Branch 45 → 106 not taken.
1110 interfaceDefNode->typeId = interfaceDefNode->attrs->attrLst->getAttrValueByName(ATTR_CORE_COMPILER_FIXED_TYPE_ID)->intValue;
206 }
207
2/2
✓ Branch 50 → 51 taken 763 times.
✓ Branch 50 → 56 taken 42 times.
805 if (ctx->qualifierLst())
208
3/6
✓ Branch 51 → 52 taken 763 times.
✗ Branch 51 → 114 not taken.
✓ Branch 52 → 53 taken 763 times.
✗ Branch 52 → 114 not taken.
✓ Branch 53 → 54 taken 763 times.
✗ Branch 53 → 112 not taken.
763 interfaceDefNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
209
2/2
✓ Branch 57 → 58 taken 378 times.
✓ Branch 57 → 63 taken 427 times.
805 if (ctx->LESS()) {
210 378 interfaceDefNode->hasTemplateTypes = true;
211
3/6
✓ Branch 58 → 59 taken 378 times.
✗ Branch 58 → 117 not taken.
✓ Branch 59 → 60 taken 378 times.
✗ Branch 59 → 117 not taken.
✓ Branch 60 → 61 taken 378 times.
✗ Branch 60 → 115 not taken.
378 interfaceDefNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
212 }
213
3/4
✓ Branch 63 → 64 taken 805 times.
✗ Branch 63 → 124 not taken.
✓ Branch 81 → 66 taken 4869 times.
✓ Branch 81 → 82 taken 805 times.
6479 for (SpiceParser::SignatureContext *signature : ctx->signature())
214
3/6
✓ Branch 68 → 69 taken 4869 times.
✗ Branch 68 → 120 not taken.
✓ Branch 69 → 70 taken 4869 times.
✗ Branch 69 → 118 not taken.
✓ Branch 70 → 71 taken 4869 times.
✗ Branch 70 → 118 not taken.
5674 interfaceDefNode->signatures.push_back(std::any_cast<SignatureNode *>(visit(signature)));
215
216
1/2
✓ Branch 89 → 90 taken 805 times.
✗ Branch 89 → 125 not taken.
1610 return concludeNode(interfaceDefNode);
217 }
218
219 1232 std::any ASTBuilder::visitEnumDef(SpiceParser::EnumDefContext *ctx) {
220 1232 const auto enumDefNode = createNode<EnumDefNode>(ctx);
221
222 // Enrich
223
2/4
✓ Branch 3 → 4 taken 1232 times.
✗ Branch 3 → 43 not taken.
✓ Branch 4 → 5 taken 1232 times.
✗ Branch 4 → 43 not taken.
1232 enumDefNode->enumName = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
224 1232 enumDefNode->typeId = resourceManager.getNextCustomTypeId();
225
226 // Visit children
227
2/2
✓ Branch 9 → 10 taken 1149 times.
✓ Branch 9 → 15 taken 83 times.
1232 if (ctx->qualifierLst())
228
3/6
✓ Branch 10 → 11 taken 1149 times.
✗ Branch 10 → 46 not taken.
✓ Branch 11 → 12 taken 1149 times.
✗ Branch 11 → 46 not taken.
✓ Branch 12 → 13 taken 1149 times.
✗ Branch 12 → 44 not taken.
1149 enumDefNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
229
3/6
✓ Branch 15 → 16 taken 1232 times.
✗ Branch 15 → 49 not taken.
✓ Branch 16 → 17 taken 1232 times.
✗ Branch 16 → 49 not taken.
✓ Branch 17 → 18 taken 1232 times.
✗ Branch 17 → 47 not taken.
1232 enumDefNode->itemLst = std::any_cast<EnumItemLstNode *>(visit(ctx->enumItemLst()));
230
231 // Tell all items about the enum def
232
2/2
✓ Branch 32 → 21 taken 11054 times.
✓ Branch 32 → 33 taken 1232 times.
13518 for (EnumItemNode *enumItem : enumDefNode->itemLst->items)
233 11054 enumItem->enumDef = enumDefNode;
234
235
1/2
✓ Branch 39 → 40 taken 1232 times.
✗ Branch 39 → 50 not taken.
2464 return concludeNode(enumDefNode);
236 }
237
238 4495 std::any ASTBuilder::visitGenericTypeDef(SpiceParser::GenericTypeDefContext *ctx) {
239 4495 const auto genericTypeDefNode = createNode<GenericTypeDefNode>(ctx);
240
241 // Enrich
242
2/4
✓ Branch 3 → 4 taken 4495 times.
✗ Branch 3 → 21 not taken.
✓ Branch 4 → 5 taken 4495 times.
✗ Branch 4 → 21 not taken.
4495 genericTypeDefNode->typeName = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
243
244 // Visit children
245
4/8
✓ Branch 7 → 8 taken 4495 times.
✗ Branch 7 → 24 not taken.
✓ Branch 8 → 9 taken 4495 times.
✗ Branch 8 → 24 not taken.
✓ Branch 9 → 10 taken 4495 times.
✗ Branch 9 → 22 not taken.
✓ Branch 11 → 12 taken 4495 times.
✗ Branch 11 → 25 not taken.
4495 genericTypeDefNode->typeAltsLst = std::any_cast<TypeAltsLstNode *>(visit(ctx->typeAltsLst()));
246
247
1/2
✓ Branch 17 → 18 taken 4495 times.
✗ Branch 17 → 25 not taken.
8990 return concludeNode(genericTypeDefNode);
248 }
249
250 707 std::any ASTBuilder::visitAliasDef(SpiceParser::AliasDefContext *ctx) {
251 707 const auto aliasDefNode = createNode<AliasDefNode>(ctx);
252
253 // Enrich
254
2/4
✓ Branch 3 → 4 taken 707 times.
✗ Branch 3 → 33 not taken.
✓ Branch 4 → 5 taken 707 times.
✗ Branch 4 → 33 not taken.
707 aliasDefNode->aliasName = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
255
2/4
✓ Branch 7 → 8 taken 707 times.
✗ Branch 7 → 34 not taken.
✓ Branch 8 → 9 taken 707 times.
✗ Branch 8 → 34 not taken.
707 aliasDefNode->dataTypeString = ctx->dataType()->getText();
256 707 aliasDefNode->typeId = resourceManager.getNextCustomTypeId();
257
258 // Visit children
259
2/2
✓ Branch 13 → 14 taken 221 times.
✓ Branch 13 → 19 taken 486 times.
707 if (ctx->qualifierLst())
260
3/6
✓ Branch 14 → 15 taken 221 times.
✗ Branch 14 → 37 not taken.
✓ Branch 15 → 16 taken 221 times.
✗ Branch 15 → 37 not taken.
✓ Branch 16 → 17 taken 221 times.
✗ Branch 16 → 35 not taken.
221 aliasDefNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
261
4/8
✓ Branch 19 → 20 taken 707 times.
✗ Branch 19 → 40 not taken.
✓ Branch 20 → 21 taken 707 times.
✗ Branch 20 → 40 not taken.
✓ Branch 21 → 22 taken 707 times.
✗ Branch 21 → 38 not taken.
✓ Branch 23 → 24 taken 707 times.
✗ Branch 23 → 41 not taken.
707 aliasDefNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
262
263
1/2
✓ Branch 29 → 30 taken 707 times.
✗ Branch 29 → 41 not taken.
1414 return concludeNode(aliasDefNode);
264 }
265
266 5945 std::any ASTBuilder::visitGlobalVarDef(SpiceParser::GlobalVarDefContext *ctx) {
267 5945 const auto globalVarDefNode = createNode<GlobalVarDefNode>(ctx);
268
269 // Enrich
270
2/4
✓ Branch 3 → 4 taken 5945 times.
✗ Branch 3 → 28 not taken.
✓ Branch 4 → 5 taken 5945 times.
✗ Branch 4 → 28 not taken.
5945 globalVarDefNode->varName = getIdentifier(ctx->TYPE_IDENTIFIER(), true);
271
272 // Visit children
273
3/6
✓ Branch 7 → 8 taken 5945 times.
✗ Branch 7 → 31 not taken.
✓ Branch 8 → 9 taken 5945 times.
✗ Branch 8 → 31 not taken.
✓ Branch 9 → 10 taken 5945 times.
✗ Branch 9 → 29 not taken.
5945 globalVarDefNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
274 5945 globalVarDefNode->dataType->isGlobalType = true;
275
2/2
✓ Branch 12 → 13 taken 5941 times.
✓ Branch 12 → 18 taken 4 times.
5945 if (ctx->constant()) {
276 5941 globalVarDefNode->hasValue = true;
277
3/6
✓ Branch 13 → 14 taken 5941 times.
✗ Branch 13 → 34 not taken.
✓ Branch 14 → 15 taken 5941 times.
✗ Branch 14 → 34 not taken.
✓ Branch 15 → 16 taken 5941 times.
✗ Branch 15 → 32 not taken.
5941 globalVarDefNode->constant = std::any_cast<ConstantNode *>(visit(ctx->constant()));
278 }
279
280
1/2
✓ Branch 24 → 25 taken 5945 times.
✗ Branch 24 → 35 not taken.
11890 return concludeNode(globalVarDefNode);
281 }
282
283 8887 std::any ASTBuilder::visitExtDecl(SpiceParser::ExtDeclContext *ctx) {
284 8887 const auto extDeclNode = createNode<ExtDeclNode>(ctx);
285
286 // Enrich
287
6/10
✓ Branch 3 → 4 taken 8887 times.
✗ Branch 3 → 57 not taken.
✓ Branch 4 → 5 taken 6093 times.
✓ Branch 4 → 7 taken 2794 times.
✓ Branch 5 → 6 taken 6093 times.
✗ Branch 5 → 57 not taken.
✓ Branch 7 → 8 taken 2794 times.
✗ Branch 7 → 57 not taken.
✓ Branch 9 → 10 taken 8887 times.
✗ Branch 9 → 57 not taken.
8887 extDeclNode->extFunctionName = getIdentifier(ctx->IDENTIFIER() ? ctx->IDENTIFIER() : ctx->TYPE_IDENTIFIER(), false);
288
289 // Visit children
290
2/2
✓ Branch 13 → 14 taken 2 times.
✓ Branch 13 → 33 taken 8885 times.
8887 if (ctx->topLevelDefAttr()) {
291
3/6
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 60 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ Branch 15 → 60 not taken.
✓ Branch 16 → 17 taken 2 times.
✗ Branch 16 → 58 not taken.
2 extDeclNode->attrs = std::any_cast<TopLevelDefAttrNode *>(visit(ctx->topLevelDefAttr()));
292
293 // Tell the attributes that they are ext decl attributes
294
2/2
✓ Branch 31 → 20 taken 2 times.
✓ Branch 31 → 32 taken 2 times.
6 for (AttrNode *attr : extDeclNode->attrs->attrLst->attributes)
295 2 attr->target = AttrNode::TARGET_EXT_DECL;
296 }
297
2/2
✓ Branch 34 → 35 taken 7270 times.
✓ Branch 34 → 40 taken 1617 times.
8887 if (ctx->F()) {
298
3/6
✓ Branch 35 → 36 taken 7270 times.
✗ Branch 35 → 63 not taken.
✓ Branch 36 → 37 taken 7270 times.
✗ Branch 36 → 63 not taken.
✓ Branch 37 → 38 taken 7270 times.
✗ Branch 37 → 61 not taken.
7270 extDeclNode->returnType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
299 7270 extDeclNode->returnType->isReturnType = true;
300 }
301
2/2
✓ Branch 41 → 42 taken 8467 times.
✓ Branch 41 → 47 taken 420 times.
8887 if (ctx->typeLstWithEllipsis()) {
302 8467 extDeclNode->hasArgs = true;
303
3/6
✓ Branch 42 → 43 taken 8467 times.
✗ Branch 42 → 66 not taken.
✓ Branch 43 → 44 taken 8467 times.
✗ Branch 43 → 66 not taken.
✓ Branch 44 → 45 taken 8467 times.
✗ Branch 44 → 64 not taken.
8467 extDeclNode->argTypeLst = std::any_cast<TypeLstWithEllipsisNode *>(visit(ctx->typeLstWithEllipsis()));
304 }
305
306
1/2
✓ Branch 53 → 54 taken 8887 times.
✗ Branch 53 → 67 not taken.
17774 return concludeNode(extDeclNode);
307 }
308
309 5908 std::any ASTBuilder::visitImportDef(SpiceParser::ImportDefContext *ctx) {
310
1/2
✓ Branch 2 → 3 taken 5908 times.
✗ Branch 2 → 32 not taken.
5908 const auto importDefNode = createNode<ImportDefNode>(ctx);
311
312 // Extract path
313
2/4
✓ Branch 3 → 4 taken 5908 times.
✗ Branch 3 → 32 not taken.
✓ Branch 4 → 5 taken 5908 times.
✗ Branch 4 → 32 not taken.
5908 const std::string pathStr = ctx->STRING_LIT()->getText();
314
1/2
✓ Branch 6 → 7 taken 5908 times.
✗ Branch 6 → 27 not taken.
5908 importDefNode->importPath = pathStr.substr(1, pathStr.size() - 2);
315
316 // If no name is given, use the path as name
317
7/12
✓ Branch 9 → 10 taken 5908 times.
✗ Branch 9 → 28 not taken.
✓ Branch 10 → 11 taken 202 times.
✓ Branch 10 → 13 taken 5706 times.
✓ Branch 11 → 12 taken 202 times.
✗ Branch 11 → 28 not taken.
✓ Branch 12 → 14 taken 202 times.
✗ Branch 12 → 28 not taken.
✓ Branch 13 → 14 taken 5706 times.
✗ Branch 13 → 28 not taken.
✓ Branch 16 → 17 taken 5908 times.
✗ Branch 16 → 29 not taken.
5908 importDefNode->importName = ctx->AS() ? getIdentifier(ctx->IDENTIFIER(), false) : importDefNode->importPath;
318
319
1/2
✓ Branch 22 → 23 taken 5908 times.
✗ Branch 22 → 29 not taken.
11816 return concludeNode(importDefNode);
320 5908 }
321
322 17404 std::any ASTBuilder::visitUnsafeBlock(SpiceParser::UnsafeBlockContext *ctx) {
323 17404 const auto unsafeBlockDefNode = createNode<UnsafeBlockNode>(ctx);
324
325 // Visit children
326
4/8
✓ Branch 3 → 4 taken 17404 times.
✗ Branch 3 → 19 not taken.
✓ Branch 4 → 5 taken 17404 times.
✗ Branch 4 → 19 not taken.
✓ Branch 5 → 6 taken 17404 times.
✗ Branch 5 → 17 not taken.
✓ Branch 7 → 8 taken 17404 times.
✗ Branch 7 → 20 not taken.
17404 unsafeBlockDefNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
327
328
1/2
✓ Branch 13 → 14 taken 17404 times.
✗ Branch 13 → 20 not taken.
34808 return concludeNode(unsafeBlockDefNode);
329 }
330
331 6412 std::any ASTBuilder::visitForLoop(SpiceParser::ForLoopContext *ctx) {
332 6412 const auto forLoopNode = createNode<ForLoopNode>(ctx);
333
334
2/4
✓ Branch 3 → 4 taken 6412 times.
✗ Branch 3 → 20 not taken.
✓ Branch 4 → 5 taken 6412 times.
✗ Branch 4 → 20 not taken.
6412 visit(ctx->forHead());
335
4/8
✓ Branch 6 → 7 taken 6412 times.
✗ Branch 6 → 23 not taken.
✓ Branch 7 → 8 taken 6412 times.
✗ Branch 7 → 23 not taken.
✓ Branch 8 → 9 taken 6412 times.
✗ Branch 8 → 21 not taken.
✓ Branch 10 → 11 taken 6412 times.
✗ Branch 10 → 24 not taken.
6412 forLoopNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
336
337
1/2
✓ Branch 16 → 17 taken 6412 times.
✗ Branch 16 → 24 not taken.
12824 return concludeNode(forLoopNode);
338 }
339
340 6412 std::any ASTBuilder::visitForHead(SpiceParser::ForHeadContext *ctx) {
341 6412 const auto forLoopNode = resumeForExpansion<ForLoopNode>();
342
343 // Visit children
344
3/6
✓ Branch 14 → 15 taken 6412 times.
✗ Branch 14 → 32 not taken.
✓ Branch 15 → 16 taken 6412 times.
✗ Branch 15 → 32 not taken.
✓ Branch 16 → 17 taken 6412 times.
✗ Branch 16 → 30 not taken.
6412 forLoopNode->initDecl = std::any_cast<DeclStmtNode *>(visit(ctx->declStmt()));
345
3/6
✓ Branch 18 → 19 taken 6412 times.
✗ Branch 18 → 35 not taken.
✓ Branch 19 → 20 taken 6412 times.
✗ Branch 19 → 35 not taken.
✓ Branch 20 → 21 taken 6412 times.
✗ Branch 20 → 33 not taken.
6412 forLoopNode->condAssign = std::any_cast<ExprNode *>(visit(ctx->assignExpr(0)));
346
3/6
✓ Branch 22 → 23 taken 6412 times.
✗ Branch 22 → 38 not taken.
✓ Branch 23 → 24 taken 6412 times.
✗ Branch 23 → 38 not taken.
✓ Branch 24 → 25 taken 6412 times.
✗ Branch 24 → 36 not taken.
6412 forLoopNode->incAssign = std::any_cast<ExprNode *>(visit(ctx->assignExpr(1)));
347
348
1/2
✓ Branch 26 → 27 taken 6412 times.
✗ Branch 26 → 39 not taken.
12824 return nullptr;
349 }
350
351 819 std::any ASTBuilder::visitForeachLoop(SpiceParser::ForeachLoopContext *ctx) {
352 819 const auto foreachLoopNode = createNode<ForeachLoopNode>(ctx);
353
354 // Visit children
355
2/4
✓ Branch 3 → 4 taken 819 times.
✗ Branch 3 → 20 not taken.
✓ Branch 4 → 5 taken 819 times.
✗ Branch 4 → 20 not taken.
819 visit(ctx->foreachHead());
356
3/6
✓ Branch 6 → 7 taken 819 times.
✗ Branch 6 → 23 not taken.
✓ Branch 7 → 8 taken 819 times.
✗ Branch 7 → 23 not taken.
✓ Branch 8 → 9 taken 819 times.
✗ Branch 8 → 21 not taken.
819 foreachLoopNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
357
358 // Tell the foreach item that it is one
359
1/2
✓ Branch 10 → 11 taken 819 times.
✗ Branch 10 → 24 not taken.
819 foreachLoopNode->itemVarDecl->isForEachItem = true;
360
361
1/2
✓ Branch 16 → 17 taken 819 times.
✗ Branch 16 → 24 not taken.
1638 return concludeNode(foreachLoopNode);
362 }
363
364 819 std::any ASTBuilder::visitForeachHead(SpiceParser::ForeachHeadContext *ctx) {
365 819 const auto foreachLoopNode = resumeForExpansion<ForeachLoopNode>();
366
367 // Visit children
368
3/4
✓ Branch 14 → 15 taken 819 times.
✗ Branch 14 → 45 not taken.
✓ Branch 17 → 18 taken 703 times.
✓ Branch 17 → 23 taken 116 times.
819 if (ctx->declStmt().size() == 1) {
369
3/6
✓ Branch 18 → 19 taken 703 times.
✗ Branch 18 → 48 not taken.
✓ Branch 19 → 20 taken 703 times.
✗ Branch 19 → 48 not taken.
✓ Branch 20 → 21 taken 703 times.
✗ Branch 20 → 46 not taken.
703 foreachLoopNode->itemVarDecl = std::any_cast<DeclStmtNode *>(visit(ctx->declStmt(0)));
370
2/4
✓ Branch 23 → 24 taken 116 times.
✗ Branch 23 → 49 not taken.
✓ Branch 26 → 27 taken 116 times.
✗ Branch 26 → 36 not taken.
116 } else if (ctx->declStmt().size() == 2) {
371
3/6
✓ Branch 27 → 28 taken 116 times.
✗ Branch 27 → 52 not taken.
✓ Branch 28 → 29 taken 116 times.
✗ Branch 28 → 52 not taken.
✓ Branch 29 → 30 taken 116 times.
✗ Branch 29 → 50 not taken.
116 foreachLoopNode->idxVarDecl = std::any_cast<DeclStmtNode *>(visit(ctx->declStmt(0)));
372
3/6
✓ Branch 31 → 32 taken 116 times.
✗ Branch 31 → 55 not taken.
✓ Branch 32 → 33 taken 116 times.
✗ Branch 32 → 55 not taken.
✓ Branch 33 → 34 taken 116 times.
✗ Branch 33 → 53 not taken.
116 foreachLoopNode->itemVarDecl = std::any_cast<DeclStmtNode *>(visit(ctx->declStmt(1)));
373 } else {
374 assert_fail("Invalid number of decl statements in foreach loop"); // GCOV_EXCL_LINE
375 }
376
3/6
✓ Branch 37 → 38 taken 819 times.
✗ Branch 37 → 58 not taken.
✓ Branch 38 → 39 taken 819 times.
✗ Branch 38 → 58 not taken.
✓ Branch 39 → 40 taken 819 times.
✗ Branch 39 → 56 not taken.
819 foreachLoopNode->iteratorAssign = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
377
378
1/2
✓ Branch 41 → 42 taken 819 times.
✗ Branch 41 → 59 not taken.
1638 return nullptr;
379 }
380
381 2987 std::any ASTBuilder::visitWhileLoop(SpiceParser::WhileLoopContext *ctx) {
382 2987 const auto whileLoopNode = createNode<WhileLoopNode>(ctx);
383
384 // Visit children
385
3/6
✓ Branch 3 → 4 taken 2987 times.
✗ Branch 3 → 23 not taken.
✓ Branch 4 → 5 taken 2987 times.
✗ Branch 4 → 23 not taken.
✓ Branch 5 → 6 taken 2987 times.
✗ Branch 5 → 21 not taken.
2987 whileLoopNode->condition = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
386
4/8
✓ Branch 7 → 8 taken 2987 times.
✗ Branch 7 → 26 not taken.
✓ Branch 8 → 9 taken 2987 times.
✗ Branch 8 → 26 not taken.
✓ Branch 9 → 10 taken 2987 times.
✗ Branch 9 → 24 not taken.
✓ Branch 11 → 12 taken 2987 times.
✗ Branch 11 → 27 not taken.
2987 whileLoopNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
387
388
1/2
✓ Branch 17 → 18 taken 2987 times.
✗ Branch 17 → 27 not taken.
5974 return concludeNode(whileLoopNode);
389 }
390
391 33 std::any ASTBuilder::visitDoWhileLoop(SpiceParser::DoWhileLoopContext *ctx) {
392 33 const auto doWhileLoopNode = createNode<DoWhileLoopNode>(ctx);
393
394 // Visit children
395
3/6
✓ Branch 3 → 4 taken 33 times.
✗ Branch 3 → 23 not taken.
✓ Branch 4 → 5 taken 33 times.
✗ Branch 4 → 23 not taken.
✓ Branch 5 → 6 taken 33 times.
✗ Branch 5 → 21 not taken.
33 doWhileLoopNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
396
4/8
✓ Branch 7 → 8 taken 33 times.
✗ Branch 7 → 26 not taken.
✓ Branch 8 → 9 taken 33 times.
✗ Branch 8 → 26 not taken.
✓ Branch 9 → 10 taken 33 times.
✗ Branch 9 → 24 not taken.
✓ Branch 11 → 12 taken 33 times.
✗ Branch 11 → 27 not taken.
33 doWhileLoopNode->condition = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
397
398
1/2
✓ Branch 17 → 18 taken 33 times.
✗ Branch 17 → 27 not taken.
66 return concludeNode(doWhileLoopNode);
399 }
400
401 37620 std::any ASTBuilder::visitIfStmt(SpiceParser::IfStmtContext *ctx) {
402 37620 const auto ifStmtNode = createNode<IfStmtNode>(ctx);
403
404 // Visit children
405
3/6
✓ Branch 3 → 4 taken 37620 times.
✗ Branch 3 → 30 not taken.
✓ Branch 4 → 5 taken 37620 times.
✗ Branch 4 → 30 not taken.
✓ Branch 5 → 6 taken 37620 times.
✗ Branch 5 → 28 not taken.
37620 ifStmtNode->condition = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
406
3/6
✓ Branch 7 → 8 taken 37620 times.
✗ Branch 7 → 33 not taken.
✓ Branch 8 → 9 taken 37620 times.
✗ Branch 8 → 33 not taken.
✓ Branch 9 → 10 taken 37620 times.
✗ Branch 9 → 31 not taken.
37620 ifStmtNode->thenBody = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
407
2/2
✓ Branch 12 → 13 taken 2933 times.
✓ Branch 12 → 18 taken 34687 times.
37620 if (ctx->elseStmt())
408
3/6
✓ Branch 13 → 14 taken 2933 times.
✗ Branch 13 → 36 not taken.
✓ Branch 14 → 15 taken 2933 times.
✗ Branch 14 → 36 not taken.
✓ Branch 15 → 16 taken 2933 times.
✗ Branch 15 → 34 not taken.
2933 ifStmtNode->elseStmt = std::any_cast<ElseStmtNode *>(visit(ctx->elseStmt()));
409
410
1/2
✓ Branch 24 → 25 taken 37620 times.
✗ Branch 24 → 37 not taken.
75240 return concludeNode(ifStmtNode);
411 }
412
413 2933 std::any ASTBuilder::visitElseStmt(SpiceParser::ElseStmtContext *ctx) {
414 2933 const auto elseStmtNode = createNode<ElseStmtNode>(ctx);
415
416 // Visit children
417
2/2
✓ Branch 4 → 5 taken 1185 times.
✓ Branch 4 → 10 taken 1748 times.
2933 if (ctx->ifStmt()) {
418 1185 elseStmtNode->isElseIf = true;
419
3/6
✓ Branch 5 → 6 taken 1185 times.
✗ Branch 5 → 27 not taken.
✓ Branch 6 → 7 taken 1185 times.
✗ Branch 6 → 27 not taken.
✓ Branch 7 → 8 taken 1185 times.
✗ Branch 7 → 25 not taken.
1185 elseStmtNode->ifStmt = std::any_cast<IfStmtNode *>(visit(ctx->ifStmt()));
420 } else {
421
3/6
✓ Branch 10 → 11 taken 1748 times.
✗ Branch 10 → 30 not taken.
✓ Branch 11 → 12 taken 1748 times.
✗ Branch 11 → 30 not taken.
✓ Branch 12 → 13 taken 1748 times.
✗ Branch 12 → 28 not taken.
1748 elseStmtNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
422 }
423
424
1/2
✓ Branch 21 → 22 taken 2933 times.
✗ Branch 21 → 31 not taken.
5866 return concludeNode(elseStmtNode);
425 }
426
427 189 std::any ASTBuilder::visitSwitchStmt(SpiceParser::SwitchStmtContext *ctx) {
428 189 const auto switchStmtNode = createNode<SwitchStmtNode>(ctx);
429
430 // Visit children
431
3/6
✓ Branch 3 → 4 taken 189 times.
✗ Branch 3 → 29 not taken.
✓ Branch 4 → 5 taken 189 times.
✗ Branch 4 → 29 not taken.
✓ Branch 5 → 6 taken 189 times.
✗ Branch 5 → 27 not taken.
189 switchStmtNode->assignExpr = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
432
2/4
✓ Branch 7 → 8 taken 189 times.
✗ Branch 7 → 32 not taken.
✓ Branch 8 → 9 taken 189 times.
✗ Branch 8 → 30 not taken.
189 fetchChildrenIntoVector(switchStmtNode->caseBranches, ctx->caseBranch());
433
2/2
✓ Branch 11 → 12 taken 157 times.
✓ Branch 11 → 17 taken 32 times.
189 if (ctx->defaultBranch()) {
434 157 switchStmtNode->hasDefaultBranch = true;
435
3/6
✓ Branch 12 → 13 taken 157 times.
✗ Branch 12 → 35 not taken.
✓ Branch 13 → 14 taken 157 times.
✗ Branch 13 → 35 not taken.
✓ Branch 14 → 15 taken 157 times.
✗ Branch 14 → 33 not taken.
157 switchStmtNode->defaultBranch = std::any_cast<DefaultBranchNode *>(visit(ctx->defaultBranch()));
436 }
437
438
1/2
✓ Branch 23 → 24 taken 189 times.
✗ Branch 23 → 36 not taken.
378 return concludeNode(switchStmtNode);
439 }
440
441 1539 std::any ASTBuilder::visitCaseBranch(SpiceParser::CaseBranchContext *ctx) {
442 1539 const auto caseBranchNode = createNode<CaseBranchNode>(ctx);
443
444 // Visit children
445
2/4
✓ Branch 3 → 4 taken 1539 times.
✗ Branch 3 → 22 not taken.
✓ Branch 4 → 5 taken 1539 times.
✗ Branch 4 → 20 not taken.
1539 fetchChildrenIntoVector(caseBranchNode->caseConstants, ctx->caseConstant());
446
4/8
✓ Branch 6 → 7 taken 1539 times.
✗ Branch 6 → 25 not taken.
✓ Branch 7 → 8 taken 1539 times.
✗ Branch 7 → 25 not taken.
✓ Branch 8 → 9 taken 1539 times.
✗ Branch 8 → 23 not taken.
✓ Branch 10 → 11 taken 1539 times.
✗ Branch 10 → 26 not taken.
1539 caseBranchNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
447
448
1/2
✓ Branch 16 → 17 taken 1539 times.
✗ Branch 16 → 26 not taken.
3078 return concludeNode(caseBranchNode);
449 }
450
451 157 std::any ASTBuilder::visitDefaultBranch(SpiceParser::DefaultBranchContext *ctx) {
452 157 const auto defaultBranchNode = createNode<DefaultBranchNode>(ctx);
453
454 // Visit children
455
4/8
✓ Branch 3 → 4 taken 157 times.
✗ Branch 3 → 19 not taken.
✓ Branch 4 → 5 taken 157 times.
✗ Branch 4 → 19 not taken.
✓ Branch 5 → 6 taken 157 times.
✗ Branch 5 → 17 not taken.
✓ Branch 7 → 8 taken 157 times.
✗ Branch 7 → 20 not taken.
157 defaultBranchNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
456
457
1/2
✓ Branch 13 → 14 taken 157 times.
✗ Branch 13 → 20 not taken.
314 return concludeNode(defaultBranchNode);
458 }
459
460 123 std::any ASTBuilder::visitAnonymousBlockStmt(SpiceParser::AnonymousBlockStmtContext *ctx) {
461 123 const auto anonymousBlockStmtNode = createNode<AnonymousBlockStmtNode>(ctx);
462
463 // Visit children
464
4/8
✓ Branch 3 → 4 taken 123 times.
✗ Branch 3 → 19 not taken.
✓ Branch 4 → 5 taken 123 times.
✗ Branch 4 → 19 not taken.
✓ Branch 5 → 6 taken 123 times.
✗ Branch 5 → 17 not taken.
✓ Branch 7 → 8 taken 123 times.
✗ Branch 7 → 20 not taken.
123 anonymousBlockStmtNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
465
466
1/2
✓ Branch 13 → 14 taken 123 times.
✗ Branch 13 → 20 not taken.
246 return concludeNode(anonymousBlockStmtNode);
467 }
468
469 148305 std::any ASTBuilder::visitStmtLst(SpiceParser::StmtLstContext *ctx) {
470 148305 const auto stmtLstNode = createNode<StmtLstNode>(ctx);
471
472 // Enrich
473
2/4
✓ Branch 3 → 4 taken 148305 times.
✗ Branch 3 → 126 not taken.
✓ Branch 4 → 5 taken 148305 times.
✗ Branch 4 → 126 not taken.
148305 stmtLstNode->closingBraceCodeLoc = CodeLoc(ctx->getStop(), sourceFile);
474
475 // Visit children
476
2/2
✓ Branch 115 → 7 taken 579096 times.
✓ Branch 115 → 116 taken 148297 times.
875698 for (ParserRuleContext::ParseTree *stmt : ctx->children) {
477
3/4
✓ Branch 9 → 10 taken 579096 times.
✗ Branch 9 → 11 not taken.
✓ Branch 12 → 13 taken 209763 times.
✓ Branch 12 → 18 taken 369333 times.
579096 if (auto *stmtCtx = dynamic_cast<SpiceParser::StmtContext *>(stmt))
478
4/6
✓ Branch 13 → 14 taken 209755 times.
✓ Branch 13 → 129 taken 8 times.
✓ Branch 14 → 15 taken 209755 times.
✗ Branch 14 → 127 not taken.
✓ Branch 15 → 16 taken 209755 times.
✗ Branch 15 → 127 not taken.
209763 stmtLstNode->statements.push_back(std::any_cast<StmtNode *>(visit(stmtCtx)));
479
3/4
✓ Branch 18 → 19 taken 369333 times.
✗ Branch 18 → 20 not taken.
✓ Branch 21 → 22 taken 6412 times.
✓ Branch 21 → 27 taken 362921 times.
369333 else if (auto *forLoopCtx = dynamic_cast<SpiceParser::ForLoopContext *>(stmt))
480
3/6
✓ Branch 22 → 23 taken 6412 times.
✗ Branch 22 → 133 not taken.
✓ Branch 23 → 24 taken 6412 times.
✗ Branch 23 → 131 not taken.
✓ Branch 24 → 25 taken 6412 times.
✗ Branch 24 → 131 not taken.
6412 stmtLstNode->statements.push_back(std::any_cast<ForLoopNode *>(visit(forLoopCtx)));
481
3/4
✓ Branch 27 → 28 taken 362921 times.
✗ Branch 27 → 29 not taken.
✓ Branch 30 → 31 taken 819 times.
✓ Branch 30 → 36 taken 362102 times.
362921 else if (auto *foreachLoopCtx = dynamic_cast<SpiceParser::ForeachLoopContext *>(stmt))
482
3/6
✓ Branch 31 → 32 taken 819 times.
✗ Branch 31 → 137 not taken.
✓ Branch 32 → 33 taken 819 times.
✗ Branch 32 → 135 not taken.
✓ Branch 33 → 34 taken 819 times.
✗ Branch 33 → 135 not taken.
819 stmtLstNode->statements.push_back(std::any_cast<ForeachLoopNode *>(visit(foreachLoopCtx)));
483
3/4
✓ Branch 36 → 37 taken 362102 times.
✗ Branch 36 → 38 not taken.
✓ Branch 39 → 40 taken 2987 times.
✓ Branch 39 → 45 taken 359115 times.
362102 else if (auto *whileLoopCtx = dynamic_cast<SpiceParser::WhileLoopContext *>(stmt))
484
3/6
✓ Branch 40 → 41 taken 2987 times.
✗ Branch 40 → 141 not taken.
✓ Branch 41 → 42 taken 2987 times.
✗ Branch 41 → 139 not taken.
✓ Branch 42 → 43 taken 2987 times.
✗ Branch 42 → 139 not taken.
2987 stmtLstNode->statements.push_back(std::any_cast<WhileLoopNode *>(visit(whileLoopCtx)));
485
3/4
✓ Branch 45 → 46 taken 359115 times.
✗ Branch 45 → 47 not taken.
✓ Branch 48 → 49 taken 33 times.
✓ Branch 48 → 54 taken 359082 times.
359115 else if (auto *doWhileLoopCtx = dynamic_cast<SpiceParser::DoWhileLoopContext *>(stmt))
486
3/6
✓ Branch 49 → 50 taken 33 times.
✗ Branch 49 → 145 not taken.
✓ Branch 50 → 51 taken 33 times.
✗ Branch 50 → 143 not taken.
✓ Branch 51 → 52 taken 33 times.
✗ Branch 51 → 143 not taken.
33 stmtLstNode->statements.push_back(std::any_cast<DoWhileLoopNode *>(visit(doWhileLoopCtx)));
487
3/4
✓ Branch 54 → 55 taken 359082 times.
✗ Branch 54 → 56 not taken.
✓ Branch 57 → 58 taken 36435 times.
✓ Branch 57 → 63 taken 322647 times.
359082 else if (auto *ifStmtCtx = dynamic_cast<SpiceParser::IfStmtContext *>(stmt))
488
3/6
✓ Branch 58 → 59 taken 36435 times.
✗ Branch 58 → 149 not taken.
✓ Branch 59 → 60 taken 36435 times.
✗ Branch 59 → 147 not taken.
✓ Branch 60 → 61 taken 36435 times.
✗ Branch 60 → 147 not taken.
36435 stmtLstNode->statements.push_back(std::any_cast<IfStmtNode *>(visit(ifStmtCtx)));
489
3/4
✓ Branch 63 → 64 taken 322647 times.
✗ Branch 63 → 65 not taken.
✓ Branch 66 → 67 taken 189 times.
✓ Branch 66 → 72 taken 322458 times.
322647 else if (auto *switchStmtCtx = dynamic_cast<SpiceParser::SwitchStmtContext *>(stmt))
490
3/6
✓ Branch 67 → 68 taken 189 times.
✗ Branch 67 → 153 not taken.
✓ Branch 68 → 69 taken 189 times.
✗ Branch 68 → 151 not taken.
✓ Branch 69 → 70 taken 189 times.
✗ Branch 69 → 151 not taken.
189 stmtLstNode->statements.push_back(std::any_cast<SwitchStmtNode *>(visit(switchStmtCtx)));
491
3/4
✓ Branch 72 → 73 taken 322458 times.
✗ Branch 72 → 74 not taken.
✓ Branch 75 → 76 taken 8329 times.
✓ Branch 75 → 81 taken 314129 times.
322458 else if (auto *assetStmtCtx = dynamic_cast<SpiceParser::AssertStmtContext *>(stmt))
492
3/6
✓ Branch 76 → 77 taken 8329 times.
✗ Branch 76 → 157 not taken.
✓ Branch 77 → 78 taken 8329 times.
✗ Branch 77 → 155 not taken.
✓ Branch 78 → 79 taken 8329 times.
✗ Branch 78 → 155 not taken.
8329 stmtLstNode->statements.push_back(std::any_cast<AssertStmtNode *>(visit(assetStmtCtx)));
493
3/4
✓ Branch 81 → 82 taken 314129 times.
✗ Branch 81 → 83 not taken.
✓ Branch 84 → 85 taken 17404 times.
✓ Branch 84 → 90 taken 296725 times.
314129 else if (auto *unsafeBlockCtx = dynamic_cast<SpiceParser::UnsafeBlockContext *>(stmt))
494
3/6
✓ Branch 85 → 86 taken 17404 times.
✗ Branch 85 → 161 not taken.
✓ Branch 86 → 87 taken 17404 times.
✗ Branch 86 → 159 not taken.
✓ Branch 87 → 88 taken 17404 times.
✗ Branch 87 → 159 not taken.
17404 stmtLstNode->statements.push_back(std::any_cast<UnsafeBlockNode *>(visit(unsafeBlockCtx)));
495
3/4
✓ Branch 90 → 91 taken 296725 times.
✗ Branch 90 → 92 not taken.
✓ Branch 93 → 94 taken 123 times.
✓ Branch 93 → 99 taken 296602 times.
296725 else if (auto *anonymousScopeCtx = dynamic_cast<SpiceParser::AnonymousBlockStmtContext *>(stmt))
496
3/6
✓ Branch 94 → 95 taken 123 times.
✗ Branch 94 → 165 not taken.
✓ Branch 95 → 96 taken 123 times.
✗ Branch 95 → 163 not taken.
✓ Branch 96 → 97 taken 123 times.
✗ Branch 96 → 163 not taken.
123 stmtLstNode->statements.push_back(std::any_cast<AnonymousBlockStmtNode *>(visit(anonymousScopeCtx)));
497 else
498 assert(is<TerminalNode *>(stmt)); // GCOV_EXCL_LINE
499 }
500
501
1/2
✓ Branch 122 → 123 taken 148297 times.
✗ Branch 122 → 168 not taken.
296594 return concludeNode(stmtLstNode);
502 }
503
504 51073 std::any ASTBuilder::visitTypeLst(SpiceParser::TypeLstContext *ctx) {
505 51073 const auto typeLstNode = createNode<TypeLstNode>(ctx);
506
507 // Visit children
508
3/6
✓ Branch 3 → 4 taken 51073 times.
✗ Branch 3 → 18 not taken.
✓ Branch 4 → 5 taken 51073 times.
✗ Branch 4 → 16 not taken.
✓ Branch 6 → 7 taken 51073 times.
✗ Branch 6 → 19 not taken.
51073 fetchChildrenIntoVector(typeLstNode->dataTypes, ctx->dataType());
509
510
1/2
✓ Branch 12 → 13 taken 51073 times.
✗ Branch 12 → 19 not taken.
102146 return concludeNode(typeLstNode);
511 }
512
513 8467 std::any ASTBuilder::visitTypeLstWithEllipsis(SpiceParser::TypeLstWithEllipsisContext *ctx) {
514 8467 const auto typeLstWithEllipsisNode = createNode<TypeLstWithEllipsisNode>(ctx);
515
516 // Visit children
517
3/6
✓ Branch 3 → 4 taken 8467 times.
✗ Branch 3 → 20 not taken.
✓ Branch 4 → 5 taken 8467 times.
✗ Branch 4 → 20 not taken.
✓ Branch 5 → 6 taken 8467 times.
✗ Branch 5 → 18 not taken.
8467 typeLstWithEllipsisNode->typeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
518
519 // Set some flags
520
1/2
✓ Branch 8 → 9 taken 8467 times.
✗ Branch 8 → 21 not taken.
8467 typeLstWithEllipsisNode->hasEllipsis = ctx->ELLIPSIS() != nullptr;
521
522
1/2
✓ Branch 14 → 15 taken 8467 times.
✗ Branch 14 → 21 not taken.
16934 return concludeNode(typeLstWithEllipsisNode);
523 }
524
525 4495 std::any ASTBuilder::visitTypeAltsLst(SpiceParser::TypeAltsLstContext *ctx) {
526 4495 const auto typeAltsLstNode = createNode<TypeAltsLstNode>(ctx);
527
528 // Visit children
529
3/6
✓ Branch 3 → 4 taken 4495 times.
✗ Branch 3 → 18 not taken.
✓ Branch 4 → 5 taken 4495 times.
✗ Branch 4 → 16 not taken.
✓ Branch 6 → 7 taken 4495 times.
✗ Branch 6 → 19 not taken.
4495 fetchChildrenIntoVector(typeAltsLstNode->dataTypes, ctx->dataType());
530
531
1/2
✓ Branch 12 → 13 taken 4495 times.
✗ Branch 12 → 19 not taken.
8990 return concludeNode(typeAltsLstNode);
532 }
533
534 57260 std::any ASTBuilder::visitParamLst(SpiceParser::ParamLstContext *ctx) {
535 57260 const auto paramLstNode = createNode<ParamLstNode>(ctx);
536
537 // Visit children
538
2/4
✓ Branch 3 → 4 taken 57260 times.
✗ Branch 3 → 32 not taken.
✓ Branch 4 → 5 taken 57260 times.
✗ Branch 4 → 30 not taken.
57260 fetchChildrenIntoVector(paramLstNode->params, ctx->declStmt());
539
540 // Set some flags to later detect that the decl statements are parameters
541
2/2
✓ Branch 19 → 8 taken 88144 times.
✓ Branch 19 → 20 taken 57260 times.
202664 for (DeclStmtNode *declStmt : paramLstNode->params) {
542 88144 declStmt->isFctParam = true;
543 88144 declStmt->dataType->isParamType = true;
544 }
545
546
1/2
✓ Branch 26 → 27 taken 57260 times.
✗ Branch 26 → 33 not taken.
114520 return concludeNode(paramLstNode);
547 }
548
549 102532 std::any ASTBuilder::visitArgLst(SpiceParser::ArgLstContext *ctx) {
550 102532 const auto argLstNode = createNode<ArgLstNode>(ctx);
551
552 // Visit children
553
2/4
✓ Branch 3 → 4 taken 102532 times.
✗ Branch 3 → 20 not taken.
✓ Branch 4 → 5 taken 102532 times.
✗ Branch 4 → 18 not taken.
102532 fetchChildrenIntoVector(argLstNode->args, ctx->assignExpr());
554 102532 argLstNode->argInfos.reserve(argLstNode->args.size());
555
556
1/2
✓ Branch 14 → 15 taken 102532 times.
✗ Branch 14 → 21 not taken.
205064 return concludeNode(argLstNode);
557 }
558
559 1232 std::any ASTBuilder::visitEnumItemLst(SpiceParser::EnumItemLstContext *ctx) {
560 1232 const auto enumItemLstNode = createNode<EnumItemLstNode>(ctx);
561
562 // Visit children
563
3/6
✓ Branch 3 → 4 taken 1232 times.
✗ Branch 3 → 18 not taken.
✓ Branch 4 → 5 taken 1232 times.
✗ Branch 4 → 16 not taken.
✓ Branch 6 → 7 taken 1232 times.
✗ Branch 6 → 19 not taken.
1232 fetchChildrenIntoVector(enumItemLstNode->items, ctx->enumItem());
564
565
1/2
✓ Branch 12 → 13 taken 1232 times.
✗ Branch 12 → 19 not taken.
2464 return concludeNode(enumItemLstNode);
566 }
567
568 11054 std::any ASTBuilder::visitEnumItem(SpiceParser::EnumItemContext *ctx) {
569 11054 const auto enumItemNode = createNode<EnumItemNode>(ctx);
570
571 // Enrich
572
2/4
✓ Branch 3 → 4 taken 11054 times.
✗ Branch 3 → 22 not taken.
✓ Branch 4 → 5 taken 11054 times.
✗ Branch 4 → 22 not taken.
11054 enumItemNode->itemName = getIdentifier(ctx->TYPE_IDENTIFIER(), false);
573
2/2
✓ Branch 8 → 9 taken 6274 times.
✓ Branch 8 → 12 taken 4780 times.
11054 if (ctx->ASSIGN()) {
574 6274 enumItemNode->itemValue = parseInt(ctx->INT_LIT());
575 6274 enumItemNode->hasValue = true;
576 }
577
578
1/2
✓ Branch 18 → 19 taken 11054 times.
✗ Branch 18 → 23 not taken.
22108 return concludeNode(enumItemNode);
579 }
580
581 15279 std::any ASTBuilder::visitField(SpiceParser::FieldContext *ctx) {
582 15279 const auto fieldNode = createNode<FieldNode>(ctx);
583
584 // Enrich
585
2/4
✓ Branch 3 → 4 taken 15279 times.
✗ Branch 3 → 29 not taken.
✓ Branch 4 → 5 taken 15279 times.
✗ Branch 4 → 29 not taken.
15279 fieldNode->fieldName = getIdentifier(ctx->IDENTIFIER(), false);
586
587 // Visit children
588
3/6
✓ Branch 7 → 8 taken 15279 times.
✗ Branch 7 → 32 not taken.
✓ Branch 8 → 9 taken 15279 times.
✗ Branch 8 → 32 not taken.
✓ Branch 9 → 10 taken 15279 times.
✗ Branch 9 → 30 not taken.
15279 fieldNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
589 15279 fieldNode->dataType->setFieldTypeRecursive();
590
2/2
✓ Branch 13 → 14 taken 3887 times.
✓ Branch 13 → 19 taken 11392 times.
15279 if (ctx->ternaryExpr())
591
3/6
✓ Branch 14 → 15 taken 3887 times.
✗ Branch 14 → 35 not taken.
✓ Branch 15 → 16 taken 3887 times.
✗ Branch 15 → 35 not taken.
✓ Branch 16 → 17 taken 3887 times.
✗ Branch 16 → 33 not taken.
3887 fieldNode->defaultValue = std::any_cast<ExprNode *>(visit(ctx->ternaryExpr()));
592
593
1/2
✓ Branch 25 → 26 taken 15279 times.
✗ Branch 25 → 36 not taken.
30558 return concludeNode(fieldNode);
594 }
595
596 4869 std::any ASTBuilder::visitSignature(SpiceParser::SignatureContext *ctx) {
597 4869 const auto signatureNode = createNode<SignatureNode>(ctx);
598
599 // Extract method name
600
2/4
✓ Branch 3 → 4 taken 4869 times.
✗ Branch 3 → 73 not taken.
✓ Branch 4 → 5 taken 4869 times.
✗ Branch 4 → 73 not taken.
4869 signatureNode->methodName = getIdentifier(ctx->IDENTIFIER(), false);
601
602 // Visit children
603
2/2
✓ Branch 8 → 9 taken 4775 times.
✓ Branch 8 → 14 taken 94 times.
4869 if (ctx->qualifierLst()) {
604
3/6
✓ Branch 9 → 10 taken 4775 times.
✗ Branch 9 → 76 not taken.
✓ Branch 10 → 11 taken 4775 times.
✗ Branch 10 → 76 not taken.
✓ Branch 11 → 12 taken 4775 times.
✗ Branch 11 → 74 not taken.
4775 signatureNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
605 }
606
2/2
✓ Branch 15 → 16 taken 4583 times.
✓ Branch 15 → 22 taken 286 times.
4869 if (ctx->F()) {
607 4583 signatureNode->hasReturnType = true;
608 4583 signatureNode->signatureType = SignatureNode::SignatureType::TYPE_FUNCTION;
609 4583 signatureNode->signatureQualifiers = TypeQualifiers::of(TY_FUNCTION);
610
3/6
✓ Branch 17 → 18 taken 4583 times.
✗ Branch 17 → 79 not taken.
✓ Branch 18 → 19 taken 4583 times.
✗ Branch 18 → 79 not taken.
✓ Branch 19 → 20 taken 4583 times.
✗ Branch 19 → 77 not taken.
4583 signatureNode->returnType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
611 } else {
612 286 signatureNode->signatureType = SignatureNode::SignatureType::TYPE_PROCEDURE;
613 286 signatureNode->signatureQualifiers = TypeQualifiers::of(TY_PROCEDURE);
614 }
615
10/16
✓ Branch 24 → 25 taken 4583 times.
✓ Branch 24 → 28 taken 286 times.
✓ Branch 25 → 26 taken 4583 times.
✗ Branch 25 → 80 not taken.
✓ Branch 28 → 29 taken 286 times.
✗ Branch 28 → 80 not taken.
✓ Branch 31 → 32 taken 286 times.
✓ Branch 31 → 33 taken 4583 times.
✓ Branch 33 → 34 taken 4583 times.
✓ Branch 33 → 35 taken 286 times.
✓ Branch 35 → 36 taken 572 times.
✓ Branch 35 → 41 taken 4297 times.
✗ Branch 80 → 81 not taken.
✗ Branch 80 → 82 not taken.
✗ Branch 84 → 85 not taken.
✗ Branch 84 → 86 not taken.
4869 if (ctx->F() ? ctx->LESS().size() == 2 : ctx->LESS().size() == 1) {
616 572 signatureNode->hasTemplateTypes = true;
617
3/6
✓ Branch 36 → 37 taken 572 times.
✗ Branch 36 → 90 not taken.
✓ Branch 37 → 38 taken 572 times.
✗ Branch 37 → 90 not taken.
✓ Branch 38 → 39 taken 572 times.
✗ Branch 38 → 88 not taken.
572 signatureNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst(0)));
618 }
619
13/20
✓ Branch 41 → 42 taken 4869 times.
✗ Branch 41 → 91 not taken.
✓ Branch 43 → 44 taken 4865 times.
✓ Branch 43 → 48 taken 4 times.
✓ Branch 44 → 45 taken 4865 times.
✗ Branch 44 → 91 not taken.
✓ Branch 46 → 47 taken 3450 times.
✓ Branch 46 → 49 taken 1415 times.
✓ Branch 47 → 48 taken 2882 times.
✓ Branch 47 → 49 taken 568 times.
✓ Branch 50 → 51 taken 4865 times.
✓ Branch 50 → 52 taken 4 times.
✓ Branch 52 → 53 taken 4869 times.
✗ Branch 52 → 54 not taken.
✓ Branch 54 → 55 taken 2886 times.
✓ Branch 54 → 63 taken 1983 times.
✗ Branch 91 → 92 not taken.
✗ Branch 91 → 93 not taken.
✗ Branch 95 → 96 not taken.
✗ Branch 95 → 97 not taken.
4869 if (ctx->typeLst().size() == 2 || (ctx->typeLst().size() == 1 && !signatureNode->hasTemplateTypes)) {
620 2886 signatureNode->hasParams = true;
621
5/8
✓ Branch 55 → 56 taken 4 times.
✓ Branch 55 → 57 taken 2882 times.
✓ Branch 58 → 59 taken 2886 times.
✗ Branch 58 → 101 not taken.
✓ Branch 59 → 60 taken 2886 times.
✗ Branch 59 → 101 not taken.
✓ Branch 60 → 61 taken 2886 times.
✗ Branch 60 → 99 not taken.
2886 signatureNode->paramTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst(signatureNode->hasTemplateTypes ? 1 : 0)));
622 }
623
624
1/2
✓ Branch 69 → 70 taken 4869 times.
✗ Branch 69 → 102 not taken.
9738 return concludeNode(signatureNode);
625 }
626
627 209763 std::any ASTBuilder::visitStmt(SpiceParser::StmtContext *ctx) {
628
2/2
✓ Branch 3 → 4 taken 39570 times.
✓ Branch 3 → 11 taken 170193 times.
209763 if (ctx->declStmt())
629
5/8
✓ Branch 4 → 5 taken 39570 times.
✗ Branch 4 → 60 not taken.
✓ Branch 5 → 6 taken 39562 times.
✓ Branch 5 → 60 taken 8 times.
✓ Branch 6 → 7 taken 39562 times.
✗ Branch 6 → 58 not taken.
✓ Branch 7 → 8 taken 39562 times.
✗ Branch 7 → 58 not taken.
79132 return static_cast<StmtNode *>(std::any_cast<DeclStmtNode *>(visit(ctx->declStmt())));
630
2/2
✓ Branch 12 → 13 taken 100774 times.
✓ Branch 12 → 20 taken 69419 times.
170193 if (ctx->exprStmt())
631
4/8
✓ Branch 13 → 14 taken 100774 times.
✗ Branch 13 → 64 not taken.
✓ Branch 14 → 15 taken 100774 times.
✗ Branch 14 → 64 not taken.
✓ Branch 15 → 16 taken 100774 times.
✗ Branch 15 → 62 not taken.
✓ Branch 16 → 17 taken 100774 times.
✗ Branch 16 → 62 not taken.
201548 return static_cast<StmtNode *>(std::any_cast<ExprStmtNode *>(visit(ctx->exprStmt())));
632
2/2
✓ Branch 21 → 22 taken 67431 times.
✓ Branch 21 → 29 taken 1988 times.
69419 if (ctx->returnStmt())
633
4/8
✓ Branch 22 → 23 taken 67431 times.
✗ Branch 22 → 68 not taken.
✓ Branch 23 → 24 taken 67431 times.
✗ Branch 23 → 68 not taken.
✓ Branch 24 → 25 taken 67431 times.
✗ Branch 24 → 66 not taken.
✓ Branch 25 → 26 taken 67431 times.
✗ Branch 25 → 66 not taken.
134862 return static_cast<StmtNode *>(std::any_cast<ReturnStmtNode *>(visit(ctx->returnStmt())));
634
2/2
✓ Branch 30 → 31 taken 1020 times.
✓ Branch 30 → 38 taken 968 times.
1988 if (ctx->breakStmt())
635
4/8
✓ Branch 31 → 32 taken 1020 times.
✗ Branch 31 → 72 not taken.
✓ Branch 32 → 33 taken 1020 times.
✗ Branch 32 → 72 not taken.
✓ Branch 33 → 34 taken 1020 times.
✗ Branch 33 → 70 not taken.
✓ Branch 34 → 35 taken 1020 times.
✗ Branch 34 → 70 not taken.
2040 return static_cast<StmtNode *>(std::any_cast<BreakStmtNode *>(visit(ctx->breakStmt())));
636
2/2
✓ Branch 39 → 40 taken 956 times.
✓ Branch 39 → 47 taken 12 times.
968 if (ctx->continueStmt())
637
4/8
✓ Branch 40 → 41 taken 956 times.
✗ Branch 40 → 76 not taken.
✓ Branch 41 → 42 taken 956 times.
✗ Branch 41 → 76 not taken.
✓ Branch 42 → 43 taken 956 times.
✗ Branch 42 → 74 not taken.
✓ Branch 43 → 44 taken 956 times.
✗ Branch 43 → 74 not taken.
1912 return static_cast<StmtNode *>(std::any_cast<ContinueStmtNode *>(visit(ctx->continueStmt())));
638
1/2
✓ Branch 48 → 49 taken 12 times.
✗ Branch 48 → 56 not taken.
12 if (ctx->fallthroughStmt())
639
4/8
✓ Branch 49 → 50 taken 12 times.
✗ Branch 49 → 80 not taken.
✓ Branch 50 → 51 taken 12 times.
✗ Branch 50 → 80 not taken.
✓ Branch 51 → 52 taken 12 times.
✗ Branch 51 → 78 not taken.
✓ Branch 52 → 53 taken 12 times.
✗ Branch 52 → 78 not taken.
24 return static_cast<StmtNode *>(std::any_cast<FallthroughStmtNode *>(visit(ctx->fallthroughStmt())));
640 assert_fail("Unknown statement type"); // GCOV_EXCL_LINE
641 return nullptr; // GCOV_EXCL_LINE
642 }
643
644 135061 std::any ASTBuilder::visitDeclStmt(SpiceParser::DeclStmtContext *ctx) {
645 135061 const auto declStmtNode = createNode<DeclStmtNode>(ctx);
646
647 // Enrich
648
3/4
✓ Branch 3 → 4 taken 135061 times.
✗ Branch 3 → 28 not taken.
✓ Branch 4 → 5 taken 135059 times.
✓ Branch 4 → 28 taken 2 times.
135061 declStmtNode->varName = getIdentifier(ctx->IDENTIFIER(), false);
649
650 // Visit children
651
4/6
✓ Branch 7 → 8 taken 135059 times.
✗ Branch 7 → 31 not taken.
✓ Branch 8 → 9 taken 135057 times.
✓ Branch 8 → 31 taken 2 times.
✓ Branch 9 → 10 taken 135057 times.
✗ Branch 9 → 29 not taken.
135059 declStmtNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
652
2/2
✓ Branch 12 → 13 taken 48927 times.
✓ Branch 12 → 18 taken 86130 times.
135057 if (ctx->assignExpr()) {
653 48927 declStmtNode->hasAssignment = true;
654
4/6
✓ Branch 13 → 14 taken 48927 times.
✗ Branch 13 → 34 not taken.
✓ Branch 14 → 15 taken 48923 times.
✓ Branch 14 → 34 taken 4 times.
✓ Branch 15 → 16 taken 48923 times.
✗ Branch 15 → 32 not taken.
48927 declStmtNode->assignExpr = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
655 }
656
657
1/2
✓ Branch 24 → 25 taken 135053 times.
✗ Branch 24 → 35 not taken.
270106 return concludeNode(declStmtNode);
658 }
659
660 100774 std::any ASTBuilder::visitExprStmt(SpiceParser::ExprStmtContext *ctx) {
661 100774 const auto exprStmtNode = createNode<ExprStmtNode>(ctx);
662
663 // Enrich
664
4/8
✓ Branch 3 → 4 taken 100774 times.
✗ Branch 3 → 19 not taken.
✓ Branch 4 → 5 taken 100774 times.
✗ Branch 4 → 19 not taken.
✓ Branch 5 → 6 taken 100774 times.
✗ Branch 5 → 17 not taken.
✓ Branch 7 → 8 taken 100774 times.
✗ Branch 7 → 20 not taken.
100774 exprStmtNode->expr = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
665
666
1/2
✓ Branch 13 → 14 taken 100774 times.
✗ Branch 13 → 20 not taken.
201548 return concludeNode(exprStmtNode);
667 }
668
669 204913 std::any ASTBuilder::visitQualifierLst(SpiceParser::QualifierLstContext *ctx) {
670 204913 const auto qualifierLstNode = createNode<QualifierLstNode>(ctx);
671
672 // Visit children
673
2/4
✓ Branch 3 → 4 taken 204913 times.
✗ Branch 3 → 45 not taken.
✓ Branch 4 → 5 taken 204913 times.
✗ Branch 4 → 43 not taken.
204913 fetchChildrenIntoVector(qualifierLstNode->qualifiers, ctx->qualifier());
674
675 // Check if qualifier combination is invalid
676 204913 bool seenSignedOrUnsigned = false;
677
2/2
✓ Branch 32 → 8 taken 244584 times.
✓ Branch 32 → 33 taken 204911 times.
654408 for (const QualifierNode *qualifier : qualifierLstNode->qualifiers) {
678 // Check if we have both, signed and unsigned qualifier
679
2/2
✓ Branch 10 → 11 taken 244570 times.
✓ Branch 10 → 13 taken 14 times.
244584 if (qualifier->type != QualifierNode::QualifierType::TY_SIGNED &&
680
2/2
✓ Branch 11 → 12 taken 190862 times.
✓ Branch 11 → 13 taken 53708 times.
244570 qualifier->type != QualifierNode::QualifierType::TY_UNSIGNED)
681 190862 continue;
682
2/2
✓ Branch 13 → 14 taken 2 times.
✓ Branch 13 → 22 taken 53720 times.
53722 if (seenSignedOrUnsigned)
683
2/4
✓ Branch 17 → 18 taken 2 times.
✗ Branch 17 → 49 not taken.
✓ Branch 18 → 19 taken 2 times.
✗ Branch 18 → 46 not taken.
6 throw ParserError(qualifier->codeLoc, INVALID_QUALIFIER_COMBINATION, "A variable can not be signed and unsigned");
684 53720 seenSignedOrUnsigned = true;
685 }
686
687
1/2
✓ Branch 39 → 40 taken 204911 times.
✗ Branch 39 → 56 not taken.
409822 return concludeNode(qualifierLstNode);
688 }
689
690 244584 std::any ASTBuilder::visitQualifier(SpiceParser::QualifierContext *ctx) {
691 244584 const auto qualifierNode = createNode<QualifierNode>(ctx);
692
693
3/4
✓ Branch 7 → 8 taken 244584 times.
✗ Branch 7 → 9 not taken.
✓ Branch 42 → 5 taken 244584 times.
✓ Branch 42 → 43 taken 244584 times.
978336 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
694 244584 const auto token = spice_pointer_cast<TerminalNode *>(subTree);
695
2/4
✓ Branch 16 → 17 taken 244584 times.
✗ Branch 16 → 53 not taken.
✓ Branch 17 → 18 taken 244584 times.
✗ Branch 17 → 53 not taken.
244584 const size_t symbolType = token->getSymbol()->getType();
696
2/2
✓ Branch 18 → 19 taken 52559 times.
✓ Branch 18 → 20 taken 192025 times.
244584 if (symbolType == SpiceParser::CONST)
697 52559 qualifierNode->type = QualifierNode::QualifierType::TY_CONST;
698
2/2
✓ Branch 20 → 21 taken 14 times.
✓ Branch 20 → 22 taken 192011 times.
192025 else if (symbolType == SpiceParser::SIGNED)
699 14 qualifierNode->type = QualifierNode::QualifierType::TY_SIGNED;
700
2/2
✓ Branch 22 → 23 taken 53708 times.
✓ Branch 22 → 24 taken 138303 times.
192011 else if (symbolType == SpiceParser::UNSIGNED)
701 53708 qualifierNode->type = QualifierNode::QualifierType::TY_UNSIGNED;
702
2/2
✓ Branch 24 → 25 taken 19272 times.
✓ Branch 24 → 26 taken 119031 times.
138303 else if (symbolType == SpiceParser::INLINE)
703 19272 qualifierNode->type = QualifierNode::QualifierType::TY_INLINE;
704
2/2
✓ Branch 26 → 27 taken 90395 times.
✓ Branch 26 → 28 taken 28636 times.
119031 else if (symbolType == SpiceParser::PUBLIC)
705 90395 qualifierNode->type = QualifierNode::QualifierType::TY_PUBLIC;
706
2/2
✓ Branch 28 → 29 taken 26120 times.
✓ Branch 28 → 30 taken 2516 times.
28636 else if (symbolType == SpiceParser::HEAP)
707 26120 qualifierNode->type = QualifierNode::QualifierType::TY_HEAP;
708
1/2
✓ Branch 30 → 31 taken 2516 times.
✗ Branch 30 → 32 not taken.
2516 else if (symbolType == SpiceParser::COMPOSE)
709 2516 qualifierNode->type = QualifierNode::QualifierType::TY_COMPOSITION;
710 else
711 assert_fail("Unknown qualifier type"); // GCOV_EXCL_LINE
712 }
713
714
1/2
✓ Branch 49 → 50 taken 244584 times.
✗ Branch 49 → 54 not taken.
489168 return concludeNode(qualifierNode);
715 }
716
717 2154 std::any ASTBuilder::visitModAttr(SpiceParser::ModAttrContext *ctx) {
718 2154 const auto modAttrNode = createNode<ModAttrNode>(ctx);
719
720 // Visit children
721
4/6
✓ Branch 3 → 4 taken 2154 times.
✗ Branch 3 → 33 not taken.
✓ Branch 4 → 5 taken 2152 times.
✓ Branch 4 → 33 taken 2 times.
✓ Branch 5 → 6 taken 2152 times.
✗ Branch 5 → 31 not taken.
2154 modAttrNode->attrLst = std::any_cast<AttrLstNode *>(visit(ctx->attrLst()));
722
723 // Tell the attributes that they are module attributes
724
2/2
✓ Branch 20 → 9 taken 5424 times.
✓ Branch 20 → 21 taken 2152 times.
9728 for (AttrNode *attr : modAttrNode->attrLst->attributes)
725 5424 attr->target = AttrNode::TARGET_MODULE;
726
727
1/2
✓ Branch 27 → 28 taken 2152 times.
✗ Branch 27 → 34 not taken.
4304 return concludeNode(modAttrNode);
728 }
729
730 2236 std::any ASTBuilder::visitTopLevelDefAttr(SpiceParser::TopLevelDefAttrContext *ctx) {
731 2236 const auto fctAttrNode = createNode<TopLevelDefAttrNode>(ctx);
732
733 // Visit children
734
4/8
✓ Branch 3 → 4 taken 2236 times.
✗ Branch 3 → 19 not taken.
✓ Branch 4 → 5 taken 2236 times.
✗ Branch 4 → 19 not taken.
✓ Branch 5 → 6 taken 2236 times.
✗ Branch 5 → 17 not taken.
✓ Branch 7 → 8 taken 2236 times.
✗ Branch 7 → 20 not taken.
2236 fctAttrNode->attrLst = std::any_cast<AttrLstNode *>(visit(ctx->attrLst()));
735
736
1/2
✓ Branch 13 → 14 taken 2236 times.
✗ Branch 13 → 20 not taken.
4472 return concludeNode(fctAttrNode);
737 }
738
739 16 std::any ASTBuilder::visitLambdaAttr(SpiceParser::LambdaAttrContext *ctx) {
740 16 const auto lambdaAttrNode = createNode<LambdaAttrNode>(ctx);
741
742 // Visit children
743
3/6
✓ Branch 3 → 4 taken 16 times.
✗ Branch 3 → 33 not taken.
✓ Branch 4 → 5 taken 16 times.
✗ Branch 4 → 33 not taken.
✓ Branch 5 → 6 taken 16 times.
✗ Branch 5 → 31 not taken.
16 lambdaAttrNode->attrLst = std::any_cast<AttrLstNode *>(visit(ctx->attrLst()));
744
745 // Tell the attributes that they are module attributes
746
2/2
✓ Branch 20 → 9 taken 16 times.
✓ Branch 20 → 21 taken 16 times.
48 for (AttrNode *attr : lambdaAttrNode->attrLst->attributes)
747 16 attr->target = AttrNode::TARGET_LAMBDA;
748
749
1/2
✓ Branch 27 → 28 taken 16 times.
✗ Branch 27 → 34 not taken.
32 return concludeNode(lambdaAttrNode);
750 }
751
752 4406 std::any ASTBuilder::visitAttrLst(SpiceParser::AttrLstContext *ctx) {
753 4406 const auto attrLstNode = createNode<AttrLstNode>(ctx);
754
755 // Visit children
756
4/6
✓ Branch 3 → 4 taken 4406 times.
✗ Branch 3 → 18 not taken.
✓ Branch 4 → 5 taken 4404 times.
✓ Branch 4 → 16 taken 2 times.
✓ Branch 6 → 7 taken 4404 times.
✗ Branch 6 → 19 not taken.
4408 fetchChildrenIntoVector(attrLstNode->attributes, ctx->attr());
757
758
1/2
✓ Branch 12 → 13 taken 4404 times.
✗ Branch 12 → 19 not taken.
8808 return concludeNode(attrLstNode);
759 }
760
761 7882 std::any ASTBuilder::visitAttr(SpiceParser::AttrContext *ctx) {
762
1/2
✓ Branch 2 → 3 taken 7882 times.
✗ Branch 2 → 83 not taken.
7882 const auto attrNode = createNode<AttrNode>(ctx);
763
764 // Extract key
765
1/2
✓ Branch 3 → 4 taken 7882 times.
✗ Branch 3 → 83 not taken.
7882 std::stringstream key;
766
3/4
✓ Branch 12 → 13 taken 28566 times.
✗ Branch 12 → 66 not taken.
✓ Branch 15 → 5 taken 20684 times.
✓ Branch 15 → 16 taken 7882 times.
28566 for (size_t i = 0; i < ctx->IDENTIFIER().size(); i++) {
767
2/2
✓ Branch 5 → 6 taken 12802 times.
✓ Branch 5 → 7 taken 7882 times.
20684 if (i > 0)
768
1/2
✓ Branch 6 → 7 taken 12802 times.
✗ Branch 6 → 81 not taken.
12802 key << MEMBER_ACCESS_TOKEN;
769
3/6
✓ Branch 7 → 8 taken 20684 times.
✗ Branch 7 → 65 not taken.
✓ Branch 8 → 9 taken 20684 times.
✗ Branch 8 → 65 not taken.
✓ Branch 9 → 10 taken 20684 times.
✗ Branch 9 → 63 not taken.
20684 key << ctx->IDENTIFIER(i)->getText();
770 }
771
1/2
✓ Branch 16 → 17 taken 7882 times.
✗ Branch 16 → 67 not taken.
7882 attrNode->key = key.str();
772
773 // Visit children
774
3/4
✓ Branch 19 → 20 taken 7882 times.
✗ Branch 19 → 81 not taken.
✓ Branch 20 → 21 taken 6226 times.
✓ Branch 20 → 51 taken 1656 times.
7882 if (ctx->constant()) {
775
3/6
✓ Branch 21 → 22 taken 6226 times.
✗ Branch 21 → 70 not taken.
✓ Branch 22 → 23 taken 6226 times.
✗ Branch 22 → 70 not taken.
✓ Branch 23 → 24 taken 6226 times.
✗ Branch 23 → 68 not taken.
6226 attrNode->value = std::any_cast<ConstantNode *>(visit(ctx->constant()));
776
777
4/6
✓ Branch 25 → 26 taken 6226 times.
✗ Branch 25 → 81 not taken.
✓ Branch 26 → 27 taken 6226 times.
✗ Branch 26 → 81 not taken.
✓ Branch 27 → 28 taken 3518 times.
✓ Branch 27 → 29 taken 2708 times.
6226 if (ctx->constant()->STRING_LIT())
778 3518 attrNode->type = AttrNode::AttrType::TYPE_STRING;
779
4/6
✓ Branch 29 → 30 taken 2708 times.
✗ Branch 29 → 81 not taken.
✓ Branch 30 → 31 taken 2708 times.
✗ Branch 30 → 81 not taken.
✓ Branch 31 → 32 taken 372 times.
✓ Branch 31 → 33 taken 2336 times.
2708 else if (ctx->constant()->INT_LIT())
780 372 attrNode->type = AttrNode::AttrType::TYPE_INT;
781
10/14
✓ Branch 33 → 34 taken 2336 times.
✗ Branch 33 → 81 not taken.
✓ Branch 34 → 35 taken 2336 times.
✗ Branch 34 → 81 not taken.
✓ Branch 35 → 36 taken 10 times.
✓ Branch 35 → 39 taken 2326 times.
✓ Branch 36 → 37 taken 10 times.
✗ Branch 36 → 81 not taken.
✓ Branch 37 → 38 taken 10 times.
✗ Branch 37 → 81 not taken.
✓ Branch 38 → 39 taken 8 times.
✓ Branch 38 → 40 taken 2 times.
✓ Branch 41 → 42 taken 2334 times.
✓ Branch 41 → 43 taken 2 times.
2336 else if (ctx->constant()->TRUE() || ctx->constant()->FALSE())
782 2334 attrNode->type = AttrNode::AttrType::TYPE_BOOL;
783 else
784
2/4
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 74 not taken.
✓ Branch 47 → 48 taken 2 times.
✗ Branch 47 → 71 not taken.
6 throw ParserError(attrNode->value->codeLoc, INVALID_ATTR_VALUE_TYPE, "Invalid attribute value type");
785 } else {
786 // If no value is given, use the bool type
787 1656 attrNode->type = AttrNode::AttrType::TYPE_BOOL;
788 }
789
790
1/2
✓ Branch 58 → 59 taken 7880 times.
✗ Branch 58 → 80 not taken.
15760 return concludeNode(attrNode);
791 7882 }
792
793 1915 std::any ASTBuilder::visitCaseConstant(SpiceParser::CaseConstantContext *ctx) {
794 1915 const auto caseConstantNode = createNode<CaseConstantNode>(ctx);
795
796 // Visit children
797
2/2
✓ Branch 4 → 5 taken 137 times.
✓ Branch 4 → 10 taken 1778 times.
1915 if (ctx->constant()) {
798
3/6
✓ Branch 5 → 6 taken 137 times.
✗ Branch 5 → 65 not taken.
✓ Branch 6 → 7 taken 137 times.
✗ Branch 6 → 65 not taken.
✓ Branch 7 → 8 taken 137 times.
✗ Branch 7 → 63 not taken.
137 caseConstantNode->constant = std::any_cast<ConstantNode *>(visit(ctx->constant()));
799
2/4
✓ Branch 10 → 11 taken 1778 times.
✗ Branch 10 → 66 not taken.
✓ Branch 13 → 14 taken 1778 times.
✗ Branch 13 → 52 not taken.
1778 } else if (!ctx->TYPE_IDENTIFIER().empty()) {
800
1/2
✓ Branch 14 → 15 taken 1778 times.
✗ Branch 14 → 75 not taken.
1778 std::stringstream fqIdentifier;
801
2/2
✓ Branch 46 → 17 taken 4826 times.
✓ Branch 46 → 47 taken 1778 times.
8382 for (antlr4::tree::ParseTree *parseTree : ctx->children) {
802
1/2
✓ Branch 19 → 20 taken 4826 times.
✗ Branch 19 → 21 not taken.
4826 const auto terminal = dynamic_cast<TerminalNode *>(parseTree);
803
1/2
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 4826 times.
4826 if (!terminal)
804 continue;
805
806
2/4
✓ Branch 24 → 25 taken 4826 times.
✗ Branch 24 → 71 not taken.
✓ Branch 25 → 26 taken 4826 times.
✗ Branch 25 → 71 not taken.
4826 const size_t terminalType = terminal->getSymbol()->getType();
807
3/4
✓ Branch 26 → 27 taken 4826 times.
✗ Branch 26 → 28 not taken.
✓ Branch 27 → 28 taken 3302 times.
✓ Branch 27 → 37 taken 1524 times.
4826 if (terminalType == SpiceParser::IDENTIFIER || terminalType == SpiceParser::TYPE_IDENTIFIER) {
808
1/2
✓ Branch 28 → 29 taken 3302 times.
✗ Branch 28 → 70 not taken.
3302 const std::string fragment = getIdentifier(terminal, false);
809
1/2
✓ Branch 29 → 30 taken 3302 times.
✗ Branch 29 → 68 not taken.
3302 caseConstantNode->identifierFragments.push_back(fragment);
810
3/4
✓ Branch 30 → 31 taken 3302 times.
✗ Branch 30 → 67 not taken.
✓ Branch 32 → 33 taken 1524 times.
✓ Branch 32 → 34 taken 1778 times.
3302 if (fqIdentifier.tellp() != 0)
811
1/2
✓ Branch 33 → 34 taken 1524 times.
✗ Branch 33 → 68 not taken.
1524 fqIdentifier << SCOPE_ACCESS_TOKEN;
812
1/2
✓ Branch 34 → 35 taken 3302 times.
✗ Branch 34 → 68 not taken.
3302 fqIdentifier << fragment;
813 3302 }
814 }
815
1/2
✓ Branch 47 → 48 taken 1778 times.
✗ Branch 47 → 72 not taken.
1778 caseConstantNode->fqIdentifier = fqIdentifier.str();
816 1778 } else {
817 assert_fail("Unknown case constant type"); // GCOV_EXCL_LINE
818 }
819
820
1/2
✓ Branch 59 → 60 taken 1915 times.
✗ Branch 59 → 76 not taken.
3830 return concludeNode(caseConstantNode);
821 }
822
823 67431 std::any ASTBuilder::visitReturnStmt(SpiceParser::ReturnStmtContext *ctx) {
824 67431 const auto returnStmtNode = createNode<ReturnStmtNode>(ctx);
825
826 // Visit children
827
2/2
✓ Branch 4 → 5 taken 61113 times.
✓ Branch 4 → 10 taken 6318 times.
67431 if (ctx->assignExpr()) {
828 61113 returnStmtNode->hasReturnValue = true;
829
3/6
✓ Branch 5 → 6 taken 61113 times.
✗ Branch 5 → 22 not taken.
✓ Branch 6 → 7 taken 61113 times.
✗ Branch 6 → 22 not taken.
✓ Branch 7 → 8 taken 61113 times.
✗ Branch 7 → 20 not taken.
61113 returnStmtNode->assignExpr = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
830 }
831
832
1/2
✓ Branch 16 → 17 taken 67431 times.
✗ Branch 16 → 23 not taken.
134862 return concludeNode(returnStmtNode);
833 }
834
835 1020 std::any ASTBuilder::visitBreakStmt(SpiceParser::BreakStmtContext *ctx) {
836 1020 const auto breakStmtNode = createNode<BreakStmtNode>(ctx);
837
838 // Extract number of breaks
839
2/2
✓ Branch 4 → 5 taken 13 times.
✓ Branch 4 → 10 taken 1007 times.
1020 if (ctx->INT_LIT())
840
3/6
✓ Branch 5 → 6 taken 13 times.
✗ Branch 5 → 24 not taken.
✓ Branch 6 → 7 taken 13 times.
✗ Branch 6 → 24 not taken.
✓ Branch 7 → 8 taken 13 times.
✗ Branch 7 → 22 not taken.
13 breakStmtNode->breakTimes = std::stoi(ctx->INT_LIT()->toString());
841
842 // Visit children
843
2/4
✓ Branch 10 → 11 taken 1020 times.
✗ Branch 10 → 25 not taken.
✓ Branch 12 → 13 taken 1020 times.
✗ Branch 12 → 26 not taken.
1020 visitChildren(ctx);
844
845
1/2
✓ Branch 18 → 19 taken 1020 times.
✗ Branch 18 → 26 not taken.
2040 return concludeNode(breakStmtNode);
846 }
847
848 956 std::any ASTBuilder::visitContinueStmt(SpiceParser::ContinueStmtContext *ctx) {
849 956 const auto continueStmtNode = createNode<ContinueStmtNode>(ctx);
850
851 // Extract number of continues
852
2/2
✓ Branch 4 → 5 taken 768 times.
✓ Branch 4 → 10 taken 188 times.
956 if (ctx->INT_LIT())
853
3/6
✓ Branch 5 → 6 taken 768 times.
✗ Branch 5 → 24 not taken.
✓ Branch 6 → 7 taken 768 times.
✗ Branch 6 → 24 not taken.
✓ Branch 7 → 8 taken 768 times.
✗ Branch 7 → 22 not taken.
768 continueStmtNode->continueTimes = std::stoi(ctx->INT_LIT()->toString());
854
855 // Visit children
856
2/4
✓ Branch 10 → 11 taken 956 times.
✗ Branch 10 → 25 not taken.
✓ Branch 12 → 13 taken 956 times.
✗ Branch 12 → 26 not taken.
956 visitChildren(ctx);
857
858
1/2
✓ Branch 18 → 19 taken 956 times.
✗ Branch 18 → 26 not taken.
1912 return concludeNode(continueStmtNode);
859 }
860
861 12 std::any ASTBuilder::visitFallthroughStmt(SpiceParser::FallthroughStmtContext *ctx) {
862 12 const auto fallthroughStmtNode = createNode<FallthroughStmtNode>(ctx);
863
864 // Visit children
865
2/4
✓ Branch 3 → 4 taken 12 times.
✗ Branch 3 → 15 not taken.
✓ Branch 5 → 6 taken 12 times.
✗ Branch 5 → 16 not taken.
12 visitChildren(ctx);
866
867
1/2
✓ Branch 11 → 12 taken 12 times.
✗ Branch 11 → 16 not taken.
24 return concludeNode(fallthroughStmtNode);
868 }
869
870 8329 std::any ASTBuilder::visitAssertStmt(SpiceParser::AssertStmtContext *ctx) {
871
1/2
✓ Branch 2 → 3 taken 8329 times.
✗ Branch 2 → 30 not taken.
8329 const auto assertStmtNode = createNode<AssertStmtNode>(ctx);
872
873 // Enrich
874
5/10
✓ Branch 3 → 4 taken 8329 times.
✗ Branch 3 → 30 not taken.
✓ Branch 4 → 5 taken 8329 times.
✗ Branch 4 → 30 not taken.
✓ Branch 5 → 6 taken 8329 times.
✗ Branch 5 → 30 not taken.
✓ Branch 6 → 7 taken 8329 times.
✗ Branch 6 → 30 not taken.
✓ Branch 7 → 8 taken 8329 times.
✗ Branch 7 → 30 not taken.
8329 const antlr4::misc::Interval interval(ctx->assignExpr()->start->getStartIndex(), ctx->assignExpr()->stop->getStopIndex());
875
1/2
✓ Branch 8 → 9 taken 8329 times.
✗ Branch 8 → 25 not taken.
8329 assertStmtNode->expressionString = inputStream->getText(interval);
876
877 // Visit children
878
4/8
✓ Branch 11 → 12 taken 8329 times.
✗ Branch 11 → 28 not taken.
✓ Branch 12 → 13 taken 8329 times.
✗ Branch 12 → 28 not taken.
✓ Branch 13 → 14 taken 8329 times.
✗ Branch 13 → 26 not taken.
✓ Branch 15 → 16 taken 8329 times.
✗ Branch 15 → 29 not taken.
8329 assertStmtNode->assignExpr = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
879
880
1/2
✓ Branch 21 → 22 taken 8329 times.
✗ Branch 21 → 29 not taken.
16658 return concludeNode(assertStmtNode);
881 }
882
883 529575 std::any ASTBuilder::visitAssignExpr(SpiceParser::AssignExprContext *ctx) {
884
2/2
✓ Branch 3 → 4 taken 480598 times.
✓ Branch 3 → 6 taken 48977 times.
529575 if (!ctx->assignOp())
885 480598 return visit(ctx->ternaryExpr());
886
887 48977 const auto assignExprNode = createNode<AssignExprNode>(ctx);
888
889 // Visit children
890
1/2
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 14 taken 48977 times.
48977 if (ctx->ternaryExpr()) {
891 assignExprNode->ternaryExpr = std::any_cast<ExprNode *>(visit(ctx->ternaryExpr()));
892
1/2
✓ Branch 15 → 16 taken 48977 times.
✗ Branch 15 → 28 not taken.
48977 } else if (ctx->prefixUnaryExpr()) {
893
3/6
✓ Branch 16 → 17 taken 48977 times.
✗ Branch 16 → 44 not taken.
✓ Branch 17 → 18 taken 48977 times.
✗ Branch 17 → 44 not taken.
✓ Branch 18 → 19 taken 48977 times.
✗ Branch 18 → 42 not taken.
48977 assignExprNode->lhs = std::any_cast<ExprNode *>(visit(ctx->prefixUnaryExpr()));
894
2/4
✓ Branch 20 → 21 taken 48977 times.
✗ Branch 20 → 45 not taken.
✓ Branch 21 → 22 taken 48977 times.
✗ Branch 21 → 45 not taken.
48977 visit(ctx->assignOp());
895
3/6
✓ Branch 23 → 24 taken 48977 times.
✗ Branch 23 → 48 not taken.
✓ Branch 24 → 25 taken 48977 times.
✗ Branch 24 → 48 not taken.
✓ Branch 25 → 26 taken 48977 times.
✗ Branch 25 → 46 not taken.
48977 assignExprNode->rhs = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
896 } else {
897 assert_fail("Invalid assign expression"); // GCOV_EXCL_LINE
898 }
899
900
1/2
✓ Branch 35 → 36 taken 48977 times.
✗ Branch 35 → 49 not taken.
97954 return concludeExprNode(assignExprNode);
901 }
902
903 484485 std::any ASTBuilder::visitTernaryExpr(SpiceParser::TernaryExprContext *ctx) {
904
3/4
✓ Branch 2 → 3 taken 484485 times.
✗ Branch 2 → 45 not taken.
✓ Branch 5 → 6 taken 480454 times.
✓ Branch 5 → 8 taken 4031 times.
484485 if (ctx->logicalOrExpr().size() == 1)
905 480454 return visit(ctx->logicalOrExpr(0));
906
907 4031 const auto ternaryExprNode = createNode<TernaryExprNode>(ctx);
908
909
3/6
✓ Branch 9 → 10 taken 4031 times.
✗ Branch 9 → 48 not taken.
✓ Branch 10 → 11 taken 4031 times.
✗ Branch 10 → 48 not taken.
✓ Branch 11 → 12 taken 4031 times.
✗ Branch 11 → 46 not taken.
4031 ternaryExprNode->condition = std::any_cast<ExprNode *>(visit(ctx->logicalOrExpr(0)));
910
3/4
✓ Branch 13 → 14 taken 4031 times.
✗ Branch 13 → 49 not taken.
✓ Branch 16 → 17 taken 4029 times.
✓ Branch 16 → 26 taken 2 times.
4031 if (ctx->logicalOrExpr().size() == 3) {
911
3/6
✓ Branch 17 → 18 taken 4029 times.
✗ Branch 17 → 52 not taken.
✓ Branch 18 → 19 taken 4029 times.
✗ Branch 18 → 52 not taken.
✓ Branch 19 → 20 taken 4029 times.
✗ Branch 19 → 50 not taken.
4029 ternaryExprNode->trueExpr = std::any_cast<ExprNode *>(visit(ctx->logicalOrExpr(1)));
912
3/6
✓ Branch 21 → 22 taken 4029 times.
✗ Branch 21 → 55 not taken.
✓ Branch 22 → 23 taken 4029 times.
✗ Branch 22 → 55 not taken.
✓ Branch 23 → 24 taken 4029 times.
✗ Branch 23 → 53 not taken.
4029 ternaryExprNode->falseExpr = std::any_cast<ExprNode *>(visit(ctx->logicalOrExpr(2)));
913
2/4
✓ Branch 26 → 27 taken 2 times.
✗ Branch 26 → 56 not taken.
✓ Branch 29 → 30 taken 2 times.
✗ Branch 29 → 35 not taken.
2 } else if (ctx->logicalOrExpr().size() == 2) {
914 2 ternaryExprNode->isShortened = true;
915
3/6
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 59 not taken.
✓ Branch 31 → 32 taken 2 times.
✗ Branch 31 → 59 not taken.
✓ Branch 32 → 33 taken 2 times.
✗ Branch 32 → 57 not taken.
2 ternaryExprNode->falseExpr = std::any_cast<ExprNode *>(visit(ctx->logicalOrExpr(1)));
916 }
917
918
1/2
✓ Branch 41 → 42 taken 4031 times.
✗ Branch 41 → 60 not taken.
8062 return concludeExprNode(ternaryExprNode);
919 }
920
921 492545 std::any ASTBuilder::visitLogicalOrExpr(SpiceParser::LogicalOrExprContext *ctx) {
922
3/4
✓ Branch 2 → 3 taken 492545 times.
✗ Branch 2 → 22 not taken.
✓ Branch 5 → 6 taken 486766 times.
✓ Branch 5 → 8 taken 5779 times.
492545 if (ctx->logicalAndExpr().size() == 1)
923 486766 return visit(ctx->logicalAndExpr(0));
924
925 5779 const auto logicalOrExprNode = createNode<LogicalOrExprNode>(ctx);
926
927 // Visit children
928
3/6
✓ Branch 9 → 10 taken 5779 times.
✗ Branch 9 → 25 not taken.
✓ Branch 10 → 11 taken 5779 times.
✗ Branch 10 → 23 not taken.
✓ Branch 12 → 13 taken 5779 times.
✗ Branch 12 → 26 not taken.
5779 fetchChildrenIntoVector(logicalOrExprNode->operands, ctx->logicalAndExpr());
929
930
1/2
✓ Branch 18 → 19 taken 5779 times.
✗ Branch 18 → 26 not taken.
11558 return concludeExprNode(logicalOrExprNode);
931 }
932
933 500064 std::any ASTBuilder::visitLogicalAndExpr(SpiceParser::LogicalAndExprContext *ctx) {
934
3/4
✓ Branch 2 → 3 taken 500064 times.
✗ Branch 2 → 22 not taken.
✓ Branch 5 → 6 taken 496579 times.
✓ Branch 5 → 8 taken 3485 times.
500064 if (ctx->bitwiseOrExpr().size() == 1)
935 496579 return visit(ctx->bitwiseOrExpr(0));
936
937 3485 const auto logicalAndExprNode = createNode<LogicalAndExprNode>(ctx);
938
939 // Visit children
940
3/6
✓ Branch 9 → 10 taken 3485 times.
✗ Branch 9 → 25 not taken.
✓ Branch 10 → 11 taken 3485 times.
✗ Branch 10 → 23 not taken.
✓ Branch 12 → 13 taken 3485 times.
✗ Branch 12 → 26 not taken.
3485 fetchChildrenIntoVector(logicalAndExprNode->operands, ctx->bitwiseOrExpr());
941
942
1/2
✓ Branch 18 → 19 taken 3485 times.
✗ Branch 18 → 26 not taken.
6970 return concludeExprNode(logicalAndExprNode);
943 }
944
945 504433 std::any ASTBuilder::visitBitwiseOrExpr(SpiceParser::BitwiseOrExprContext *ctx) {
946
3/4
✓ Branch 2 → 3 taken 504433 times.
✗ Branch 2 → 22 not taken.
✓ Branch 5 → 6 taken 503673 times.
✓ Branch 5 → 8 taken 760 times.
504433 if (ctx->bitwiseXorExpr().size() == 1)
947 503673 return visit(ctx->bitwiseXorExpr(0));
948
949 760 const auto bitwiseOrExprNode = createNode<BitwiseOrExprNode>(ctx);
950
951 // Visit children
952
3/6
✓ Branch 9 → 10 taken 760 times.
✗ Branch 9 → 25 not taken.
✓ Branch 10 → 11 taken 760 times.
✗ Branch 10 → 23 not taken.
✓ Branch 12 → 13 taken 760 times.
✗ Branch 12 → 26 not taken.
760 fetchChildrenIntoVector(bitwiseOrExprNode->operands, ctx->bitwiseXorExpr());
953
954
1/2
✓ Branch 18 → 19 taken 760 times.
✗ Branch 18 → 26 not taken.
1520 return concludeExprNode(bitwiseOrExprNode);
955 }
956
957 505195 std::any ASTBuilder::visitBitwiseXorExpr(SpiceParser::BitwiseXorExprContext *ctx) {
958
3/4
✓ Branch 2 → 3 taken 505195 times.
✗ Branch 2 → 22 not taken.
✓ Branch 5 → 6 taken 505056 times.
✓ Branch 5 → 8 taken 139 times.
505195 if (ctx->bitwiseAndExpr().size() == 1)
959 505056 return visit(ctx->bitwiseAndExpr(0));
960
961 139 const auto bitwiseXorExprNode = createNode<BitwiseXorExprNode>(ctx);
962
963 // Visit children
964
3/6
✓ Branch 9 → 10 taken 139 times.
✗ Branch 9 → 25 not taken.
✓ Branch 10 → 11 taken 139 times.
✗ Branch 10 → 23 not taken.
✓ Branch 12 → 13 taken 139 times.
✗ Branch 12 → 26 not taken.
139 fetchChildrenIntoVector(bitwiseXorExprNode->operands, ctx->bitwiseAndExpr());
965
966
1/2
✓ Branch 18 → 19 taken 139 times.
✗ Branch 18 → 26 not taken.
278 return concludeExprNode(bitwiseXorExprNode);
967 }
968
969 505336 std::any ASTBuilder::visitBitwiseAndExpr(SpiceParser::BitwiseAndExprContext *ctx) {
970
3/4
✓ Branch 2 → 3 taken 505336 times.
✗ Branch 2 → 22 not taken.
✓ Branch 5 → 6 taken 504840 times.
✓ Branch 5 → 8 taken 496 times.
505336 if (ctx->equalityExpr().size() == 1)
971 504840 return visit(ctx->equalityExpr(0));
972
973 496 const auto bitwiseAndExprNode = createNode<BitwiseAndExprNode>(ctx);
974
975 // Visit children
976
3/6
✓ Branch 9 → 10 taken 496 times.
✗ Branch 9 → 25 not taken.
✓ Branch 10 → 11 taken 496 times.
✗ Branch 10 → 23 not taken.
✓ Branch 12 → 13 taken 496 times.
✗ Branch 12 → 26 not taken.
496 fetchChildrenIntoVector(bitwiseAndExprNode->operands, ctx->equalityExpr());
977
978
1/2
✓ Branch 18 → 19 taken 496 times.
✗ Branch 18 → 26 not taken.
992 return concludeExprNode(bitwiseAndExprNode);
979 }
980
981 505834 std::any ASTBuilder::visitEqualityExpr(SpiceParser::EqualityExprContext *ctx) {
982
3/4
✓ Branch 2 → 3 taken 505834 times.
✗ Branch 2 → 28 not taken.
✓ Branch 5 → 6 taken 463686 times.
✓ Branch 5 → 8 taken 42148 times.
505834 if (ctx->relationalExpr().size() == 1)
983 463686 return visit(ctx->relationalExpr(0));
984
985 42148 const auto equalityExprNode = createNode<EqualityExprNode>(ctx);
986
987 // Visit children
988
2/4
✓ Branch 9 → 10 taken 42148 times.
✗ Branch 9 → 31 not taken.
✓ Branch 10 → 11 taken 42148 times.
✗ Branch 10 → 29 not taken.
42148 fetchChildrenIntoVector(equalityExprNode->operands, ctx->relationalExpr());
989
990 // Extract operator
991
2/2
✓ Branch 13 → 14 taken 35574 times.
✓ Branch 13 → 15 taken 6574 times.
42148 if (ctx->EQUAL())
992 35574 equalityExprNode->op = EqualityExprNode::EqualityOp::OP_EQUAL;
993
1/2
✓ Branch 16 → 17 taken 6574 times.
✗ Branch 16 → 18 not taken.
6574 else if (ctx->NOT_EQUAL())
994 6574 equalityExprNode->op = EqualityExprNode::EqualityOp::OP_NOT_EQUAL;
995
996
1/2
✓ Branch 24 → 25 taken 42148 times.
✗ Branch 24 → 32 not taken.
84296 return concludeExprNode(equalityExprNode);
997 }
998
999 547982 std::any ASTBuilder::visitRelationalExpr(SpiceParser::RelationalExprContext *ctx) {
1000
3/4
✓ Branch 2 → 3 taken 547982 times.
✗ Branch 2 → 34 not taken.
✓ Branch 5 → 6 taken 524852 times.
✓ Branch 5 → 8 taken 23130 times.
547982 if (ctx->shiftExpr().size() == 1)
1001 524852 return visit(ctx->shiftExpr(0));
1002
1003 23130 const auto relationalExprNode = createNode<RelationalExprNode>(ctx);
1004
1005 // Visit children
1006
2/4
✓ Branch 9 → 10 taken 23130 times.
✗ Branch 9 → 37 not taken.
✓ Branch 10 → 11 taken 23130 times.
✗ Branch 10 → 35 not taken.
23130 fetchChildrenIntoVector(relationalExprNode->operands, ctx->shiftExpr());
1007
1008 // Extract operator
1009
2/2
✓ Branch 13 → 14 taken 10149 times.
✓ Branch 13 → 15 taken 12981 times.
23130 if (ctx->LESS())
1010 10149 relationalExprNode->op = RelationalExprNode::RelationalOp::OP_LESS;
1011
2/2
✓ Branch 16 → 17 taken 5878 times.
✓ Branch 16 → 18 taken 7103 times.
12981 else if (ctx->GREATER())
1012 5878 relationalExprNode->op = RelationalExprNode::RelationalOp::OP_GREATER;
1013
2/2
✓ Branch 19 → 20 taken 2354 times.
✓ Branch 19 → 21 taken 4749 times.
7103 else if (ctx->LESS_EQUAL())
1014 2354 relationalExprNode->op = RelationalExprNode::RelationalOp::OP_LESS_EQUAL;
1015
1/2
✓ Branch 22 → 23 taken 4749 times.
✗ Branch 22 → 24 not taken.
4749 else if (ctx->GREATER_EQUAL())
1016 4749 relationalExprNode->op = RelationalExprNode::RelationalOp::OP_GREATER_EQUAL;
1017
1018
1/2
✓ Branch 30 → 31 taken 23130 times.
✗ Branch 30 → 38 not taken.
46260 return concludeExprNode(relationalExprNode);
1019 }
1020
1021 571112 std::any ASTBuilder::visitShiftExpr(SpiceParser::ShiftExprContext *ctx) {
1022
3/4
✓ Branch 2 → 3 taken 571112 times.
✗ Branch 2 → 60 not taken.
✓ Branch 5 → 6 taken 568930 times.
✓ Branch 5 → 8 taken 2182 times.
571112 if (ctx->additiveExpr().size() == 1)
1023 568930 return visit(ctx->additiveExpr(0));
1024
1025 2182 const auto shiftExprNode = createNode<ShiftExprNode>(ctx);
1026
1027 // Visit children
1028
2/4
✓ Branch 9 → 10 taken 2182 times.
✗ Branch 9 → 63 not taken.
✓ Branch 10 → 11 taken 2182 times.
✗ Branch 10 → 61 not taken.
2182 fetchChildrenIntoVector(shiftExprNode->operands, ctx->additiveExpr());
1029
1030 2182 bool seenFirstLess = false;
1031 2182 bool seenFirstGreater = false;
1032
2/2
✓ Branch 45 → 14 taken 10288 times.
✓ Branch 45 → 46 taken 2182 times.
14652 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
1033
1/2
✓ Branch 16 → 17 taken 10288 times.
✗ Branch 16 → 18 not taken.
10288 const auto terminal = dynamic_cast<TerminalNode *>(subTree);
1034
2/2
✓ Branch 19 → 20 taken 4884 times.
✓ Branch 19 → 21 taken 5404 times.
10288 if (!terminal)
1035 4884 continue;
1036
1037
4/6
✓ Branch 21 → 22 taken 5404 times.
✗ Branch 21 → 68 not taken.
✓ Branch 22 → 23 taken 5404 times.
✗ Branch 22 → 68 not taken.
✓ Branch 23 → 24 taken 4094 times.
✓ Branch 23 → 28 taken 1310 times.
5404 if (terminal->getSymbol()->getType() == SpiceParser::LESS) {
1038
2/2
✓ Branch 24 → 25 taken 2047 times.
✓ Branch 24 → 27 taken 2047 times.
4094 if (seenFirstLess)
1039
1/2
✓ Branch 25 → 26 taken 2047 times.
✗ Branch 25 → 64 not taken.
2047 shiftExprNode->opQueue.emplace(ShiftExprNode::ShiftOp::OP_SHIFT_LEFT, TY_INVALID);
1040 4094 seenFirstLess = !seenFirstLess;
1041 4094 continue;
1042 }
1043
1044
3/6
✓ Branch 28 → 29 taken 1310 times.
✗ Branch 28 → 68 not taken.
✓ Branch 29 → 30 taken 1310 times.
✗ Branch 29 → 68 not taken.
✓ Branch 30 → 31 taken 1310 times.
✗ Branch 30 → 35 not taken.
1310 if (terminal->getSymbol()->getType() == SpiceParser::GREATER) {
1045
2/2
✓ Branch 31 → 32 taken 655 times.
✓ Branch 31 → 34 taken 655 times.
1310 if (seenFirstGreater)
1046
1/2
✓ Branch 32 → 33 taken 655 times.
✗ Branch 32 → 66 not taken.
655 shiftExprNode->opQueue.emplace(ShiftExprNode::ShiftOp::OP_SHIFT_RIGHT, TY_INVALID);
1047 1310 seenFirstGreater = !seenFirstGreater;
1048 1310 continue;
1049 }
1050
1051 assert_fail("Invalid terminal symbol for additive expression"); // GCOV_EXCL_LINE
1052 }
1053
2/4
✓ Branch 46 → 47 taken 2182 times.
✗ Branch 46 → 49 not taken.
✓ Branch 47 → 48 taken 2182 times.
✗ Branch 47 → 49 not taken.
2182 assert(!seenFirstLess && !seenFirstGreater);
1054
1055
1/2
✓ Branch 56 → 57 taken 2182 times.
✗ Branch 56 → 69 not taken.
4364 return concludeExprNode(shiftExprNode);
1056 }
1057
1058 573814 std::any ASTBuilder::visitAdditiveExpr(SpiceParser::AdditiveExprContext *ctx) {
1059
3/4
✓ Branch 2 → 3 taken 573814 times.
✗ Branch 2 → 52 not taken.
✓ Branch 5 → 6 taken 552389 times.
✓ Branch 5 → 8 taken 21425 times.
573814 if (ctx->multiplicativeExpr().size() == 1)
1060 552389 return visit(ctx->multiplicativeExpr(0));
1061
1062 21425 const auto additiveExprNode = createNode<AdditiveExprNode>(ctx);
1063
1064 // Visit children
1065
2/4
✓ Branch 9 → 10 taken 21425 times.
✗ Branch 9 → 55 not taken.
✓ Branch 10 → 11 taken 21425 times.
✗ Branch 10 → 53 not taken.
21425 fetchChildrenIntoVector(additiveExprNode->operands, ctx->multiplicativeExpr());
1066
1067
2/2
✓ Branch 41 → 14 taken 69415 times.
✓ Branch 41 → 42 taken 21425 times.
112265 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
1068
1/2
✓ Branch 16 → 17 taken 69415 times.
✗ Branch 16 → 18 not taken.
69415 const auto terminal = dynamic_cast<TerminalNode *>(subTree);
1069
2/2
✓ Branch 19 → 20 taken 45420 times.
✓ Branch 19 → 21 taken 23995 times.
69415 if (!terminal)
1070 45420 continue;
1071
1072
4/6
✓ Branch 21 → 22 taken 23995 times.
✗ Branch 21 → 60 not taken.
✓ Branch 22 → 23 taken 23995 times.
✗ Branch 22 → 60 not taken.
✓ Branch 23 → 24 taken 16163 times.
✓ Branch 23 → 26 taken 7832 times.
23995 if (terminal->getSymbol()->getType() == SpiceParser::PLUS)
1073
1/2
✓ Branch 24 → 25 taken 16163 times.
✗ Branch 24 → 56 not taken.
16163 additiveExprNode->opQueue.emplace(AdditiveExprNode::AdditiveOp::OP_PLUS, TY_INVALID);
1074
3/6
✓ Branch 26 → 27 taken 7832 times.
✗ Branch 26 → 60 not taken.
✓ Branch 27 → 28 taken 7832 times.
✗ Branch 27 → 60 not taken.
✓ Branch 28 → 29 taken 7832 times.
✗ Branch 28 → 31 not taken.
7832 else if (terminal->getSymbol()->getType() == SpiceParser::MINUS)
1075
1/2
✓ Branch 29 → 30 taken 7832 times.
✗ Branch 29 → 58 not taken.
7832 additiveExprNode->opQueue.emplace(AdditiveExprNode::AdditiveOp::OP_MINUS, TY_INVALID);
1076 else
1077 assert_fail("Invalid terminal symbol for additive expression"); // GCOV_EXCL_LINE
1078 }
1079
1080
1/2
✓ Branch 48 → 49 taken 21425 times.
✗ Branch 48 → 61 not taken.
42850 return concludeExprNode(additiveExprNode);
1081 }
1082
1083 597809 std::any ASTBuilder::visitMultiplicativeExpr(SpiceParser::MultiplicativeExprContext *ctx) {
1084
3/4
✓ Branch 2 → 3 taken 597809 times.
✗ Branch 2 → 57 not taken.
✓ Branch 5 → 6 taken 592486 times.
✓ Branch 5 → 8 taken 5323 times.
597809 if (ctx->castExpr().size() == 1)
1085 592486 return visit(ctx->castExpr(0));
1086
1087 5323 const auto multiplicativeExprNode = createNode<MultiplicativeExprNode>(ctx);
1088
1089 // Visit children
1090
2/4
✓ Branch 9 → 10 taken 5323 times.
✗ Branch 9 → 60 not taken.
✓ Branch 10 → 11 taken 5323 times.
✗ Branch 10 → 58 not taken.
5323 fetchChildrenIntoVector(multiplicativeExprNode->operands, ctx->castExpr());
1091
1092
2/2
✓ Branch 46 → 14 taken 16387 times.
✓ Branch 46 → 47 taken 5323 times.
27033 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
1093
1/2
✓ Branch 16 → 17 taken 16387 times.
✗ Branch 16 → 18 not taken.
16387 const auto terminal = dynamic_cast<TerminalNode *>(subTree);
1094
2/2
✓ Branch 19 → 20 taken 10855 times.
✓ Branch 19 → 21 taken 5532 times.
16387 if (!terminal)
1095 10855 continue;
1096
1097
4/6
✓ Branch 21 → 22 taken 5532 times.
✗ Branch 21 → 67 not taken.
✓ Branch 22 → 23 taken 5532 times.
✗ Branch 22 → 67 not taken.
✓ Branch 23 → 24 taken 4313 times.
✓ Branch 23 → 26 taken 1219 times.
5532 if (terminal->getSymbol()->getType() == SpiceParser::MUL)
1098
1/2
✓ Branch 24 → 25 taken 4313 times.
✗ Branch 24 → 61 not taken.
4313 multiplicativeExprNode->opQueue.emplace(MultiplicativeExprNode::MultiplicativeOp::OP_MUL, TY_INVALID);
1099
4/6
✓ Branch 26 → 27 taken 1219 times.
✗ Branch 26 → 67 not taken.
✓ Branch 27 → 28 taken 1219 times.
✗ Branch 27 → 67 not taken.
✓ Branch 28 → 29 taken 899 times.
✓ Branch 28 → 31 taken 320 times.
1219 else if (terminal->getSymbol()->getType() == SpiceParser::DIV)
1100
1/2
✓ Branch 29 → 30 taken 899 times.
✗ Branch 29 → 63 not taken.
899 multiplicativeExprNode->opQueue.emplace(MultiplicativeExprNode::MultiplicativeOp::OP_DIV, TY_INVALID);
1101
3/6
✓ Branch 31 → 32 taken 320 times.
✗ Branch 31 → 67 not taken.
✓ Branch 32 → 33 taken 320 times.
✗ Branch 32 → 67 not taken.
✓ Branch 33 → 34 taken 320 times.
✗ Branch 33 → 36 not taken.
320 else if (terminal->getSymbol()->getType() == SpiceParser::REM)
1102
1/2
✓ Branch 34 → 35 taken 320 times.
✗ Branch 34 → 65 not taken.
320 multiplicativeExprNode->opQueue.emplace(MultiplicativeExprNode::MultiplicativeOp::OP_REM, TY_INVALID);
1103 else
1104 assert_fail("Invalid terminal symbol for multiplicative expression"); // GCOV_EXCL_LINE
1105 }
1106
1107
1/2
✓ Branch 53 → 54 taken 5323 times.
✗ Branch 53 → 68 not taken.
10646 return concludeExprNode(multiplicativeExprNode);
1108 }
1109
1110 603341 std::any ASTBuilder::visitCastExpr(SpiceParser::CastExprContext *ctx) {
1111
2/2
✓ Branch 3 → 4 taken 584055 times.
✓ Branch 3 → 6 taken 19286 times.
603341 if (!ctx->CAST())
1112 584055 return visit(ctx->prefixUnaryExpr());
1113
1114 19286 const auto castExprNode = createNode<CastExprNode>(ctx);
1115
1116 // Visit children
1117
1/2
✓ Branch 8 → 9 taken 19286 times.
✗ Branch 8 → 18 not taken.
19286 if (ctx->dataType()) {
1118
3/6
✓ Branch 9 → 10 taken 19286 times.
✗ Branch 9 → 35 not taken.
✓ Branch 10 → 11 taken 19286 times.
✗ Branch 10 → 35 not taken.
✓ Branch 11 → 12 taken 19286 times.
✗ Branch 11 → 33 not taken.
19286 castExprNode->dataType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
1119
3/6
✓ Branch 13 → 14 taken 19286 times.
✗ Branch 13 → 38 not taken.
✓ Branch 14 → 15 taken 19286 times.
✗ Branch 14 → 38 not taken.
✓ Branch 15 → 16 taken 19286 times.
✗ Branch 15 → 36 not taken.
19286 castExprNode->assignExpr = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
1120 19286 castExprNode->isCast = true;
1121 } else {
1122 castExprNode->prefixUnaryExpr = std::any_cast<ExprNode *>(visit(ctx->prefixUnaryExpr()));
1123 }
1124
1125
1/2
✓ Branch 29 → 30 taken 19286 times.
✗ Branch 29 → 42 not taken.
38572 return concludeExprNode(castExprNode);
1126 }
1127
1128 644522 std::any ASTBuilder::visitPrefixUnaryExpr(SpiceParser::PrefixUnaryExprContext *ctx) {
1129
2/2
✓ Branch 3 → 4 taken 633032 times.
✓ Branch 3 → 6 taken 11490 times.
644522 if (!ctx->prefixUnaryExpr())
1130 633032 return visit(ctx->postfixUnaryExpr());
1131
1132 11490 const auto prefixUnaryExprNode = createNode<PrefixUnaryExprNode>(ctx);
1133
1134 // Visit children
1135
1/2
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 14 taken 11490 times.
11490 if (ctx->postfixUnaryExpr()) {
1136 prefixUnaryExprNode->postfixUnaryExpr = std::any_cast<ExprNode *>(visit(ctx->postfixUnaryExpr()));
1137
1/2
✓ Branch 15 → 16 taken 11490 times.
✗ Branch 15 → 42 not taken.
11490 } else if (ctx->prefixUnaryExpr()) {
1138 // Extract operator
1139
2/2
✓ Branch 17 → 18 taken 447 times.
✓ Branch 17 → 19 taken 11043 times.
11490 if (ctx->MINUS())
1140 447 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_MINUS;
1141
2/2
✓ Branch 20 → 21 taken 24 times.
✓ Branch 20 → 22 taken 11019 times.
11043 else if (ctx->PLUS_PLUS())
1142 24 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_PLUS_PLUS;
1143
2/2
✓ Branch 23 → 24 taken 30 times.
✓ Branch 23 → 25 taken 10989 times.
11019 else if (ctx->MINUS_MINUS())
1144 30 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_MINUS_MINUS;
1145
2/2
✓ Branch 26 → 27 taken 7317 times.
✓ Branch 26 → 28 taken 3672 times.
10989 else if (ctx->NOT())
1146 7317 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_NOT;
1147
2/2
✓ Branch 29 → 30 taken 54 times.
✓ Branch 29 → 31 taken 3618 times.
3672 else if (ctx->BITWISE_NOT())
1148 54 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_BITWISE_NOT;
1149
2/2
✓ Branch 32 → 33 taken 1602 times.
✓ Branch 32 → 34 taken 2016 times.
3618 else if (ctx->MUL())
1150 1602 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_DEREFERENCE;
1151
1/2
✓ Branch 35 → 36 taken 2016 times.
✗ Branch 35 → 37 not taken.
2016 else if (ctx->BITWISE_AND())
1152 2016 prefixUnaryExprNode->op = PrefixUnaryExprNode::PrefixUnaryOp::OP_ADDRESS_OF;
1153
1154
3/6
✓ Branch 37 → 38 taken 11490 times.
✗ Branch 37 → 58 not taken.
✓ Branch 38 → 39 taken 11490 times.
✗ Branch 38 → 58 not taken.
✓ Branch 39 → 40 taken 11490 times.
✗ Branch 39 → 56 not taken.
11490 prefixUnaryExprNode->prefixUnaryExpr = std::any_cast<ExprNode *>(visit(ctx->prefixUnaryExpr()));
1155 } else {
1156 assert_fail("Unknown prefix unary expression type"); // GCOV_EXCL_LINE
1157 }
1158
1159
1/2
✓ Branch 49 → 50 taken 11490 times.
✗ Branch 49 → 59 not taken.
22980 return concludeExprNode(prefixUnaryExprNode);
1160 }
1161
1162 793144 std::any ASTBuilder::visitPostfixUnaryExpr(SpiceParser::PostfixUnaryExprContext *ctx) {
1163
2/2
✓ Branch 3 → 4 taken 633032 times.
✓ Branch 3 → 6 taken 160112 times.
793144 if (!ctx->postfixUnaryExpr())
1164 633032 return visit(ctx->atomicExpr());
1165
1166 160112 const auto postfixUnaryExprNode = createNode<PostfixUnaryExprNode>(ctx);
1167
1168
1/2
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 14 taken 160112 times.
160112 if (ctx->atomicExpr()) {
1169 postfixUnaryExprNode->atomicExpr = std::any_cast<ExprNode *>(visit(ctx->atomicExpr()));
1170
1/2
✓ Branch 15 → 16 taken 160112 times.
✗ Branch 15 → 43 not taken.
160112 } else if (ctx->postfixUnaryExpr()) {
1171
3/6
✓ Branch 16 → 17 taken 160112 times.
✗ Branch 16 → 59 not taken.
✓ Branch 17 → 18 taken 160112 times.
✗ Branch 17 → 59 not taken.
✓ Branch 18 → 19 taken 160112 times.
✗ Branch 18 → 57 not taken.
160112 postfixUnaryExprNode->postfixUnaryExpr = std::any_cast<ExprNode *>(visit(ctx->postfixUnaryExpr()));
1172
1173 // Extract operator
1174
2/2
✓ Branch 21 → 22 taken 16710 times.
✓ Branch 21 → 27 taken 143402 times.
160112 if (ctx->assignExpr()) {
1175 16710 postfixUnaryExprNode->op = PostfixUnaryExprNode::PostfixUnaryOp::OP_SUBSCRIPT;
1176
3/6
✓ Branch 22 → 23 taken 16710 times.
✗ Branch 22 → 62 not taken.
✓ Branch 23 → 24 taken 16710 times.
✗ Branch 23 → 62 not taken.
✓ Branch 24 → 25 taken 16710 times.
✗ Branch 24 → 60 not taken.
16710 postfixUnaryExprNode->subscriptIndexExpr = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
1177
2/2
✓ Branch 28 → 29 taken 131713 times.
✓ Branch 28 → 34 taken 11689 times.
143402 } else if (ctx->IDENTIFIER()) {
1178 131713 postfixUnaryExprNode->op = PostfixUnaryExprNode::PostfixUnaryOp::OP_MEMBER_ACCESS;
1179
2/4
✓ Branch 29 → 30 taken 131713 times.
✗ Branch 29 → 63 not taken.
✓ Branch 30 → 31 taken 131713 times.
✗ Branch 30 → 63 not taken.
131713 postfixUnaryExprNode->identifier = getIdentifier(ctx->IDENTIFIER(), false);
1180
2/2
✓ Branch 35 → 36 taken 10064 times.
✓ Branch 35 → 37 taken 1625 times.
11689 } else if (ctx->PLUS_PLUS()) {
1181 10064 postfixUnaryExprNode->op = PostfixUnaryExprNode::PostfixUnaryOp::OP_PLUS_PLUS;
1182
2/2
✓ Branch 38 → 39 taken 1503 times.
✓ Branch 38 → 40 taken 122 times.
1625 } else if (ctx->MINUS_MINUS()) {
1183 1503 postfixUnaryExprNode->op = PostfixUnaryExprNode::PostfixUnaryOp::OP_MINUS_MINUS;
1184
1/2
✓ Branch 41 → 42 taken 122 times.
✗ Branch 41 → 44 not taken.
122 } else if (ctx->NOT()) {
1185 122 postfixUnaryExprNode->op = PostfixUnaryExprNode::PostfixUnaryOp::OP_ERR_PROPAGATION;
1186 }
1187 } else {
1188 assert_fail("Unknown postfix unary expression type"); // GCOV_EXCL_LINE
1189 }
1190
1191
1/2
✓ Branch 50 → 51 taken 160112 times.
✗ Branch 50 → 64 not taken.
320224 return concludeExprNode(postfixUnaryExprNode);
1192 }
1193
1194 633032 std::any ASTBuilder::visitAtomicExpr(SpiceParser::AtomicExprContext *ctx) {
1195 633032 const auto atomicExprNode = createNode<AtomicExprNode>(ctx);
1196
1197 // Visit children
1198
2/2
✓ Branch 4 → 5 taken 114502 times.
✓ Branch 4 → 10 taken 518530 times.
633032 if (ctx->constant()) {
1199
4/6
✓ Branch 5 → 6 taken 114502 times.
✗ Branch 5 → 88 not taken.
✓ Branch 6 → 7 taken 114498 times.
✓ Branch 6 → 88 taken 4 times.
✓ Branch 7 → 8 taken 114498 times.
✗ Branch 7 → 86 not taken.
114502 atomicExprNode->constant = std::any_cast<ConstantNode *>(visit(ctx->constant()));
1200
2/2
✓ Branch 11 → 12 taken 151840 times.
✓ Branch 11 → 17 taken 366690 times.
518530 } else if (ctx->value()) {
1201
3/6
✓ Branch 12 → 13 taken 151840 times.
✗ Branch 12 → 91 not taken.
✓ Branch 13 → 14 taken 151840 times.
✗ Branch 13 → 91 not taken.
✓ Branch 14 → 15 taken 151840 times.
✗ Branch 14 → 89 not taken.
151840 atomicExprNode->value = std::any_cast<ValueNode *>(visit(ctx->value()));
1202
11/18
✓ Branch 17 → 18 taken 366690 times.
✗ Branch 17 → 92 not taken.
✓ Branch 19 → 20 taken 21311 times.
✓ Branch 19 → 23 taken 345379 times.
✓ Branch 20 → 21 taken 21311 times.
✗ Branch 20 → 92 not taken.
✓ Branch 22 → 23 taken 17528 times.
✓ Branch 22 → 24 taken 3783 times.
✓ Branch 25 → 26 taken 21311 times.
✓ Branch 25 → 27 taken 345379 times.
✓ Branch 27 → 28 taken 366690 times.
✗ Branch 27 → 29 not taken.
✓ Branch 29 → 30 taken 362907 times.
✓ Branch 29 → 68 taken 3783 times.
✗ Branch 92 → 93 not taken.
✗ Branch 92 → 94 not taken.
✗ Branch 96 → 97 not taken.
✗ Branch 96 → 98 not taken.
366690 } else if (!ctx->IDENTIFIER().empty() || !ctx->TYPE_IDENTIFIER().empty()) {
1203
1/2
✓ Branch 30 → 31 taken 362907 times.
✗ Branch 30 → 108 not taken.
362907 std::stringstream fqIdentifier;
1204
2/2
✓ Branch 62 → 33 taken 382489 times.
✓ Branch 62 → 63 taken 362907 times.
1108303 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
1205
1/2
✓ Branch 35 → 36 taken 382489 times.
✗ Branch 35 → 37 not taken.
382489 const auto terminal = dynamic_cast<TerminalNode *>(subTree);
1206
1/2
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 40 taken 382489 times.
382489 if (!terminal)
1207 continue;
1208
1209
2/4
✓ Branch 40 → 41 taken 382489 times.
✗ Branch 40 → 104 not taken.
✓ Branch 41 → 42 taken 382489 times.
✗ Branch 41 → 104 not taken.
382489 const size_t terminalType = terminal->getSymbol()->getType();
1210
4/4
✓ Branch 42 → 43 taken 37110 times.
✓ Branch 42 → 44 taken 345379 times.
✓ Branch 43 → 44 taken 27319 times.
✓ Branch 43 → 53 taken 9791 times.
382489 if (terminalType == SpiceParser::IDENTIFIER || terminalType == SpiceParser::TYPE_IDENTIFIER) {
1211
1/2
✓ Branch 44 → 45 taken 372698 times.
✗ Branch 44 → 103 not taken.
372698 const std::string fragment = getIdentifier(terminal, false);
1212
1/2
✓ Branch 45 → 46 taken 372698 times.
✗ Branch 45 → 101 not taken.
372698 atomicExprNode->identifierFragments.push_back(fragment);
1213
3/4
✓ Branch 46 → 47 taken 372698 times.
✗ Branch 46 → 100 not taken.
✓ Branch 48 → 49 taken 9791 times.
✓ Branch 48 → 50 taken 362907 times.
372698 if (fqIdentifier.tellp() != 0)
1214
1/2
✓ Branch 49 → 50 taken 9791 times.
✗ Branch 49 → 101 not taken.
9791 fqIdentifier << SCOPE_ACCESS_TOKEN;
1215
1/2
✓ Branch 50 → 51 taken 372698 times.
✗ Branch 50 → 101 not taken.
372698 fqIdentifier << fragment;
1216 372698 }
1217 }
1218
1/2
✓ Branch 63 → 64 taken 362907 times.
✗ Branch 63 → 105 not taken.
362907 atomicExprNode->fqIdentifier = fqIdentifier.str();
1219
1/2
✓ Branch 69 → 70 taken 3783 times.
✗ Branch 69 → 75 not taken.
366690 } else if (ctx->assignExpr()) {
1220
3/6
✓ Branch 70 → 71 taken 3783 times.
✗ Branch 70 → 111 not taken.
✓ Branch 71 → 72 taken 3783 times.
✗ Branch 71 → 111 not taken.
✓ Branch 72 → 73 taken 3783 times.
✗ Branch 72 → 109 not taken.
3783 atomicExprNode->assignExpr = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
1221 } else {
1222 assert_fail("Unknown atomic expression type"); // GCOV_EXCL_LINE
1223 }
1224
1225
1/2
✓ Branch 82 → 83 taken 633028 times.
✗ Branch 82 → 112 not taken.
1266056 return concludeExprNode(atomicExprNode);
1226 }
1227
1228 151840 std::any ASTBuilder::visitValue(SpiceParser::ValueContext *ctx) {
1229 151840 const auto valueNode = createNode<ValueNode>(ctx);
1230
1231 // Visit children
1232
2/2
✓ Branch 4 → 5 taken 135296 times.
✓ Branch 4 → 10 taken 16544 times.
151840 if (ctx->fctCall()) {
1233
3/6
✓ Branch 5 → 6 taken 135296 times.
✗ Branch 5 → 65 not taken.
✓ Branch 6 → 7 taken 135296 times.
✗ Branch 6 → 65 not taken.
✓ Branch 7 → 8 taken 135296 times.
✗ Branch 7 → 63 not taken.
135296 valueNode->fctCall = std::any_cast<FctCallNode *>(visit(ctx->fctCall()));
1234
2/2
✓ Branch 11 → 12 taken 614 times.
✓ Branch 11 → 17 taken 15930 times.
16544 } else if (ctx->arrayInitialization()) {
1235
3/6
✓ Branch 12 → 13 taken 614 times.
✗ Branch 12 → 68 not taken.
✓ Branch 13 → 14 taken 614 times.
✗ Branch 13 → 68 not taken.
✓ Branch 14 → 15 taken 614 times.
✗ Branch 14 → 66 not taken.
614 valueNode->arrayInitialization = std::any_cast<ArrayInitializationNode *>(visit(ctx->arrayInitialization()));
1236
2/2
✓ Branch 18 → 19 taken 2764 times.
✓ Branch 18 → 24 taken 13166 times.
15930 } else if (ctx->structInstantiation()) {
1237
3/6
✓ Branch 19 → 20 taken 2764 times.
✗ Branch 19 → 71 not taken.
✓ Branch 20 → 21 taken 2764 times.
✗ Branch 20 → 71 not taken.
✓ Branch 21 → 22 taken 2764 times.
✗ Branch 21 → 69 not taken.
2764 valueNode->structInstantiation = std::any_cast<StructInstantiationNode *>(visit(ctx->structInstantiation()));
1238
2/2
✓ Branch 25 → 26 taken 109 times.
✓ Branch 25 → 31 taken 13057 times.
13166 } else if (ctx->lambdaFunc()) {
1239
3/6
✓ Branch 26 → 27 taken 109 times.
✗ Branch 26 → 74 not taken.
✓ Branch 27 → 28 taken 109 times.
✗ Branch 27 → 74 not taken.
✓ Branch 28 → 29 taken 109 times.
✗ Branch 28 → 72 not taken.
109 valueNode->lambdaFunc = std::any_cast<LambdaFuncNode *>(visit(ctx->lambdaFunc()));
1240
2/2
✓ Branch 32 → 33 taken 150 times.
✓ Branch 32 → 38 taken 12907 times.
13057 } else if (ctx->lambdaProc()) {
1241
3/6
✓ Branch 33 → 34 taken 150 times.
✗ Branch 33 → 77 not taken.
✓ Branch 34 → 35 taken 150 times.
✗ Branch 34 → 77 not taken.
✓ Branch 35 → 36 taken 150 times.
✗ Branch 35 → 75 not taken.
150 valueNode->lambdaProc = std::any_cast<LambdaProcNode *>(visit(ctx->lambdaProc()));
1242
2/2
✓ Branch 39 → 40 taken 2 times.
✓ Branch 39 → 45 taken 12905 times.
12907 } else if (ctx->lambdaExpr()) {
1243
3/6
✓ Branch 40 → 41 taken 2 times.
✗ Branch 40 → 80 not taken.
✓ Branch 41 → 42 taken 2 times.
✗ Branch 41 → 80 not taken.
✓ Branch 42 → 43 taken 2 times.
✗ Branch 42 → 78 not taken.
2 valueNode->lambdaExpr = std::any_cast<LambdaExprNode *>(visit(ctx->lambdaExpr()));
1244
1/2
✓ Branch 46 → 47 taken 12905 times.
✗ Branch 46 → 52 not taken.
12905 } else if (ctx->dataType()) {
1245 12905 valueNode->isNil = true;
1246
3/6
✓ Branch 47 → 48 taken 12905 times.
✗ Branch 47 → 83 not taken.
✓ Branch 48 → 49 taken 12905 times.
✗ Branch 48 → 83 not taken.
✓ Branch 49 → 50 taken 12905 times.
✗ Branch 49 → 81 not taken.
12905 valueNode->nilType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
1247 } else {
1248 assert_fail("Unknown value type"); // GCOV_EXCL_LINE
1249 }
1250
1251
1/2
✓ Branch 59 → 60 taken 151840 times.
✗ Branch 59 → 84 not taken.
303680 return concludeNode(valueNode);
1252 }
1253
1254 126806 std::any ASTBuilder::visitConstant(SpiceParser::ConstantContext *ctx) {
1255 126806 const auto constantNode = createNode<ConstantNode>(ctx);
1256
1257 // Detect an optional leading minus sign for numeric literals
1258 126806 const bool isNegative = ctx->MINUS() != nullptr;
1259
1260 // Enrich
1261
2/2
✓ Branch 5 → 6 taken 4030 times.
✓ Branch 5 → 14 taken 122776 times.
126806 if (ctx->DOUBLE_LIT()) {
1262 4030 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_DOUBLE;
1263
3/6
✓ Branch 6 → 7 taken 4030 times.
✗ Branch 6 → 63 not taken.
✓ Branch 7 → 8 taken 4030 times.
✗ Branch 7 → 63 not taken.
✓ Branch 8 → 9 taken 4030 times.
✗ Branch 8 → 61 not taken.
4030 const double value = std::stod(ctx->DOUBLE_LIT()->toString());
1264
2/2
✓ Branch 10 → 11 taken 318 times.
✓ Branch 10 → 12 taken 3712 times.
4030 constantNode->compileTimeValue.doubleValue = isNegative ? -value : value;
1265
2/2
✓ Branch 15 → 16 taken 23742 times.
✓ Branch 15 → 19 taken 99034 times.
122776 } else if (ctx->INT_LIT()) {
1266 23742 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_INT;
1267 23742 constantNode->compileTimeValue.intValue = parseInt(ctx->INT_LIT(), isNegative);
1268
2/2
✓ Branch 20 → 21 taken 2448 times.
✓ Branch 20 → 24 taken 96586 times.
99034 } else if (ctx->SHORT_LIT()) {
1269 2448 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_SHORT;
1270 2448 constantNode->compileTimeValue.shortValue = parseShort(ctx->SHORT_LIT(), isNegative);
1271
2/2
✓ Branch 25 → 26 taken 43472 times.
✓ Branch 25 → 29 taken 53114 times.
96586 } else if (ctx->LONG_LIT()) {
1272 43472 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_LONG;
1273 43472 constantNode->compileTimeValue.longValue = parseLong(ctx->LONG_LIT(), isNegative);
1274
2/2
✓ Branch 30 → 31 taken 14251 times.
✓ Branch 30 → 34 taken 38863 times.
53114 } else if (ctx->CHAR_LIT()) {
1275 14251 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_CHAR;
1276 14251 constantNode->compileTimeValue.charValue = parseChar(ctx->CHAR_LIT());
1277
2/2
✓ Branch 35 → 36 taken 27209 times.
✓ Branch 35 → 44 taken 11654 times.
38863 } else if (ctx->STRING_LIT()) {
1278 // Save a pointer to the string in the compile time value
1279 27209 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_STRING;
1280 27209 constantNode->compileTimeValue.stringValueOffset = resourceManager.compileTimeStringValues.size();
1281 // Add the string to the global compile time string list
1282
4/8
✓ Branch 37 → 38 taken 27209 times.
✗ Branch 37 → 68 not taken.
✓ Branch 38 → 39 taken 27209 times.
✗ Branch 38 → 68 not taken.
✓ Branch 39 → 40 taken 27209 times.
✗ Branch 39 → 66 not taken.
✓ Branch 40 → 41 taken 27209 times.
✗ Branch 40 → 64 not taken.
27209 resourceManager.compileTimeStringValues.push_back(parseString(ctx->STRING_LIT()->toString()));
1283
2/2
✓ Branch 45 → 46 taken 5792 times.
✓ Branch 45 → 47 taken 5862 times.
11654 } else if (ctx->TRUE()) {
1284 5792 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_BOOL;
1285 5792 constantNode->compileTimeValue.boolValue = true;
1286
1/2
✓ Branch 48 → 49 taken 5862 times.
✗ Branch 48 → 50 not taken.
5862 } else if (ctx->FALSE()) {
1287 5862 constantNode->type = ConstantNode::PrimitiveValueType::TYPE_BOOL;
1288 5862 constantNode->compileTimeValue.boolValue = false;
1289 } else {
1290 assert_fail("Unknown constant type"); // GCOV_EXCL_LINE
1291 }
1292
1293
1/2
✓ Branch 57 → 58 taken 126802 times.
✗ Branch 57 → 70 not taken.
253604 return concludeNode(constantNode);
1294 }
1295
1296 135296 std::any ASTBuilder::visitFctCall(SpiceParser::FctCallContext *ctx) {
1297
1/2
✓ Branch 2 → 3 taken 135296 times.
✗ Branch 2 → 92 not taken.
135296 const auto fctCallNode = createNode<FctCallNode>(ctx);
1298
1299
1/2
✓ Branch 3 → 4 taken 135296 times.
✗ Branch 3 → 92 not taken.
135296 std::stringstream fqFunctionName;
1300
2/2
✓ Branch 46 → 6 taken 667931 times.
✓ Branch 46 → 47 taken 135296 times.
938523 for (antlr4::ParserRuleContext::ParseTree *subTree : ctx->children) {
1301
1/2
✓ Branch 8 → 9 taken 667931 times.
✗ Branch 8 → 10 not taken.
667931 const auto terminal = dynamic_cast<antlr4::tree::TerminalNode *>(subTree);
1302
2/2
✓ Branch 11 → 12 taken 107597 times.
✓ Branch 11 → 13 taken 560334 times.
667931 if (!terminal)
1303 107597 continue;
1304
1305
4/6
✓ Branch 13 → 14 taken 560334 times.
✗ Branch 13 → 81 not taken.
✓ Branch 14 → 15 taken 560334 times.
✗ Branch 14 → 81 not taken.
✓ Branch 15 → 16 taken 182498 times.
✓ Branch 15 → 21 taken 377836 times.
560334 if (terminal->getSymbol()->getType() == SpiceParser::IDENTIFIER) {
1306
1/2
✓ Branch 16 → 17 taken 182498 times.
✗ Branch 16 → 77 not taken.
182498 const std::string fragment = terminal->toString();
1307
1/2
✓ Branch 17 → 18 taken 182498 times.
✗ Branch 17 → 75 not taken.
182498 fctCallNode->functionNameFragments.push_back(fragment);
1308
1/2
✓ Branch 18 → 19 taken 182498 times.
✗ Branch 18 → 75 not taken.
182498 fqFunctionName << fragment;
1309
4/6
✓ Branch 21 → 22 taken 377836 times.
✗ Branch 21 → 81 not taken.
✓ Branch 22 → 23 taken 377836 times.
✗ Branch 22 → 81 not taken.
✓ Branch 23 → 24 taken 21636 times.
✓ Branch 23 → 29 taken 356200 times.
560334 } else if (terminal->getSymbol()->getType() == SpiceParser::TYPE_IDENTIFIER) {
1310
1/2
✓ Branch 24 → 25 taken 21636 times.
✗ Branch 24 → 80 not taken.
21636 const std::string fragment = terminal->toString();
1311
1/2
✓ Branch 25 → 26 taken 21636 times.
✗ Branch 25 → 78 not taken.
21636 fctCallNode->functionNameFragments.push_back(fragment);
1312
1/2
✓ Branch 26 → 27 taken 21636 times.
✗ Branch 26 → 78 not taken.
21636 fqFunctionName << fragment;
1313
4/6
✓ Branch 29 → 30 taken 356200 times.
✗ Branch 29 → 81 not taken.
✓ Branch 30 → 31 taken 356200 times.
✗ Branch 30 → 81 not taken.
✓ Branch 31 → 32 taken 320 times.
✓ Branch 31 → 33 taken 355880 times.
377836 } else if (terminal->getSymbol()->getType() == SpiceParser::SCOPE_ACCESS) {
1314
1/2
✓ Branch 32 → 37 taken 320 times.
✗ Branch 32 → 81 not taken.
320 fqFunctionName << SCOPE_ACCESS_TOKEN;
1315
4/6
✓ Branch 33 → 34 taken 355880 times.
✗ Branch 33 → 81 not taken.
✓ Branch 34 → 35 taken 355880 times.
✗ Branch 34 → 81 not taken.
✓ Branch 35 → 36 taken 68518 times.
✓ Branch 35 → 37 taken 287362 times.
355880 } else if (terminal->getSymbol()->getType() == SpiceParser::DOT) {
1316
1/2
✓ Branch 36 → 37 taken 68518 times.
✗ Branch 36 → 81 not taken.
68518 fqFunctionName << MEMBER_ACCESS_TOKEN;
1317 }
1318 }
1319
1/2
✓ Branch 47 → 48 taken 135296 times.
✗ Branch 47 → 82 not taken.
135296 fctCallNode->fqFunctionName = fqFunctionName.str();
1320
1321 // Visit children
1322
3/4
✓ Branch 50 → 51 taken 135296 times.
✗ Branch 50 → 90 not taken.
✓ Branch 51 → 52 taken 8385 times.
✓ Branch 51 → 57 taken 126911 times.
135296 if (ctx->typeLst()) {
1323 8385 fctCallNode->hasTemplateTypes = true;
1324
3/6
✓ Branch 52 → 53 taken 8385 times.
✗ Branch 52 → 85 not taken.
✓ Branch 53 → 54 taken 8385 times.
✗ Branch 53 → 85 not taken.
✓ Branch 54 → 55 taken 8385 times.
✗ Branch 54 → 83 not taken.
8385 fctCallNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
1325 }
1326
3/4
✓ Branch 57 → 58 taken 135296 times.
✗ Branch 57 → 90 not taken.
✓ Branch 58 → 59 taken 99212 times.
✓ Branch 58 → 64 taken 36084 times.
135296 if (ctx->argLst()) {
1327 99212 fctCallNode->hasArgs = true;
1328
3/6
✓ Branch 59 → 60 taken 99212 times.
✗ Branch 59 → 88 not taken.
✓ Branch 60 → 61 taken 99212 times.
✗ Branch 60 → 88 not taken.
✓ Branch 61 → 62 taken 99212 times.
✗ Branch 61 → 86 not taken.
99212 fctCallNode->argLst = std::any_cast<ArgLstNode *>(visit(ctx->argLst()));
1329 }
1330
1331
1/2
✓ Branch 70 → 71 taken 135296 times.
✗ Branch 70 → 89 not taken.
270592 return concludeNode(fctCallNode);
1332 135296 }
1333
1334 614 std::any ASTBuilder::visitArrayInitialization(SpiceParser::ArrayInitializationContext *ctx) {
1335 614 const auto arrayInitializationNode = createNode<ArrayInitializationNode>(ctx);
1336
1337 // Visit children
1338
2/2
✓ Branch 4 → 5 taken 612 times.
✓ Branch 4 → 10 taken 2 times.
614 if (ctx->argLst())
1339
3/6
✓ Branch 5 → 6 taken 612 times.
✗ Branch 5 → 22 not taken.
✓ Branch 6 → 7 taken 612 times.
✗ Branch 6 → 22 not taken.
✓ Branch 7 → 8 taken 612 times.
✗ Branch 7 → 20 not taken.
612 arrayInitializationNode->itemLst = std::any_cast<ArgLstNode *>(visit(ctx->argLst()));
1340
1341
1/2
✓ Branch 16 → 17 taken 614 times.
✗ Branch 16 → 23 not taken.
1228 return concludeNode(arrayInitializationNode);
1342 }
1343
1344 2764 std::any ASTBuilder::visitStructInstantiation(SpiceParser::StructInstantiationContext *ctx) {
1345
1/2
✓ Branch 2 → 3 taken 2764 times.
✗ Branch 2 → 85 not taken.
2764 const auto structInstantiationNode = createNode<StructInstantiationNode>(ctx);
1346
1347 // Enrich
1348
1/2
✓ Branch 3 → 4 taken 2764 times.
✗ Branch 3 → 85 not taken.
2764 std::stringstream fqStructName;
1349
2/2
✓ Branch 39 → 6 taken 11075 times.
✓ Branch 39 → 40 taken 2764 times.
16603 for (antlr4::ParserRuleContext::ParseTree *subTree : ctx->children) {
1350
1/2
✓ Branch 8 → 9 taken 11075 times.
✗ Branch 8 → 10 not taken.
11075 const auto terminal = dynamic_cast<antlr4::tree::TerminalNode *>(subTree);
1351
2/2
✓ Branch 11 → 12 taken 2729 times.
✓ Branch 11 → 13 taken 8346 times.
11075 if (!terminal)
1352 2729 continue;
1353
1354
4/6
✓ Branch 13 → 14 taken 8346 times.
✗ Branch 13 → 74 not taken.
✓ Branch 14 → 15 taken 8346 times.
✗ Branch 14 → 74 not taken.
✓ Branch 15 → 16 taken 6 times.
✓ Branch 15 → 22 taken 8340 times.
8346 if (terminal->getSymbol()->getType() == SpiceParser::IDENTIFIER) {
1355
1/2
✓ Branch 16 → 17 taken 6 times.
✗ Branch 16 → 70 not taken.
6 const std::string fragment = terminal->toString();
1356
1/2
✓ Branch 17 → 18 taken 6 times.
✗ Branch 17 → 68 not taken.
6 structInstantiationNode->structNameFragments.push_back(fragment);
1357
2/4
✓ Branch 18 → 19 taken 6 times.
✗ Branch 18 → 68 not taken.
✓ Branch 19 → 20 taken 6 times.
✗ Branch 19 → 68 not taken.
6 fqStructName << fragment << SCOPE_ACCESS_TOKEN;
1358
4/6
✓ Branch 22 → 23 taken 8340 times.
✗ Branch 22 → 74 not taken.
✓ Branch 23 → 24 taken 8340 times.
✗ Branch 23 → 74 not taken.
✓ Branch 24 → 25 taken 2764 times.
✓ Branch 24 → 30 taken 5576 times.
8346 } else if (terminal->getSymbol()->getType() == SpiceParser::TYPE_IDENTIFIER) {
1359
1/2
✓ Branch 25 → 26 taken 2764 times.
✗ Branch 25 → 73 not taken.
2764 const std::string fragment = terminal->toString();
1360
1/2
✓ Branch 26 → 27 taken 2764 times.
✗ Branch 26 → 71 not taken.
2764 structInstantiationNode->structNameFragments.push_back(fragment);
1361
1/2
✓ Branch 27 → 28 taken 2764 times.
✗ Branch 27 → 71 not taken.
2764 fqStructName << fragment;
1362 2764 }
1363 }
1364
1/2
✓ Branch 40 → 41 taken 2764 times.
✗ Branch 40 → 75 not taken.
2764 structInstantiationNode->fqStructName = fqStructName.str();
1365
1366 // Visit children
1367
3/4
✓ Branch 43 → 44 taken 2764 times.
✗ Branch 43 → 83 not taken.
✓ Branch 44 → 45 taken 21 times.
✓ Branch 44 → 50 taken 2743 times.
2764 if (ctx->typeLst()) {
1368 21 structInstantiationNode->hasTemplateTypes = true;
1369
3/6
✓ Branch 45 → 46 taken 21 times.
✗ Branch 45 → 78 not taken.
✓ Branch 46 → 47 taken 21 times.
✗ Branch 46 → 78 not taken.
✓ Branch 47 → 48 taken 21 times.
✗ Branch 47 → 76 not taken.
21 structInstantiationNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
1370 }
1371
3/4
✓ Branch 50 → 51 taken 2764 times.
✗ Branch 50 → 83 not taken.
✓ Branch 51 → 52 taken 2708 times.
✓ Branch 51 → 57 taken 56 times.
2764 if (ctx->argLst())
1372
3/6
✓ Branch 52 → 53 taken 2708 times.
✗ Branch 52 → 81 not taken.
✓ Branch 53 → 54 taken 2708 times.
✗ Branch 53 → 81 not taken.
✓ Branch 54 → 55 taken 2708 times.
✗ Branch 54 → 79 not taken.
2708 structInstantiationNode->fieldLst = std::any_cast<ArgLstNode *>(visit(ctx->argLst()));
1373
1374
1/2
✓ Branch 63 → 64 taken 2764 times.
✗ Branch 63 → 82 not taken.
5528 return concludeNode(structInstantiationNode);
1375 2764 }
1376
1377 109 std::any ASTBuilder::visitLambdaFunc(SpiceParser::LambdaFuncContext *ctx) {
1378 109 const auto lambdaFuncNode = createNode<LambdaFuncNode>(ctx);
1379
1380 // Visit children
1381
3/6
✓ Branch 3 → 4 taken 109 times.
✗ Branch 3 → 37 not taken.
✓ Branch 4 → 5 taken 109 times.
✗ Branch 4 → 37 not taken.
✓ Branch 5 → 6 taken 109 times.
✗ Branch 5 → 35 not taken.
109 lambdaFuncNode->returnType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
1382
2/2
✓ Branch 8 → 9 taken 99 times.
✓ Branch 8 → 14 taken 10 times.
109 if (ctx->paramLst()) {
1383 99 lambdaFuncNode->hasParams = true;
1384
3/6
✓ Branch 9 → 10 taken 99 times.
✗ Branch 9 → 40 not taken.
✓ Branch 10 → 11 taken 99 times.
✗ Branch 10 → 40 not taken.
✓ Branch 11 → 12 taken 99 times.
✗ Branch 11 → 38 not taken.
99 lambdaFuncNode->paramLst = std::any_cast<ParamLstNode *>(visit(ctx->paramLst()));
1385 }
1386
1/2
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 21 taken 109 times.
109 if (ctx->lambdaAttr())
1387 lambdaFuncNode->lambdaAttr = std::any_cast<LambdaAttrNode *>(visit(ctx->lambdaAttr()));
1388
4/8
✓ Branch 21 → 22 taken 109 times.
✗ Branch 21 → 46 not taken.
✓ Branch 22 → 23 taken 109 times.
✗ Branch 22 → 46 not taken.
✓ Branch 23 → 24 taken 109 times.
✗ Branch 23 → 44 not taken.
✓ Branch 25 → 26 taken 109 times.
✗ Branch 25 → 47 not taken.
109 lambdaFuncNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
1389
1390
1/2
✓ Branch 31 → 32 taken 109 times.
✗ Branch 31 → 47 not taken.
218 return concludeNode(lambdaFuncNode);
1391 }
1392
1393 150 std::any ASTBuilder::visitLambdaProc(SpiceParser::LambdaProcContext *ctx) {
1394 150 const auto lambdaProcNode = createNode<LambdaProcNode>(ctx);
1395
1396 // Visit children
1397
2/2
✓ Branch 4 → 5 taken 118 times.
✓ Branch 4 → 10 taken 32 times.
150 if (ctx->paramLst()) {
1398 118 lambdaProcNode->hasParams = true;
1399
3/6
✓ Branch 5 → 6 taken 118 times.
✗ Branch 5 → 33 not taken.
✓ Branch 6 → 7 taken 118 times.
✗ Branch 6 → 33 not taken.
✓ Branch 7 → 8 taken 118 times.
✗ Branch 7 → 31 not taken.
118 lambdaProcNode->paramLst = std::any_cast<ParamLstNode *>(visit(ctx->paramLst()));
1400 }
1401
2/2
✓ Branch 11 → 12 taken 16 times.
✓ Branch 11 → 17 taken 134 times.
150 if (ctx->lambdaAttr())
1402
3/6
✓ Branch 12 → 13 taken 16 times.
✗ Branch 12 → 36 not taken.
✓ Branch 13 → 14 taken 16 times.
✗ Branch 13 → 36 not taken.
✓ Branch 14 → 15 taken 16 times.
✗ Branch 14 → 34 not taken.
16 lambdaProcNode->lambdaAttr = std::any_cast<LambdaAttrNode *>(visit(ctx->lambdaAttr()));
1403
4/8
✓ Branch 17 → 18 taken 150 times.
✗ Branch 17 → 39 not taken.
✓ Branch 18 → 19 taken 150 times.
✗ Branch 18 → 39 not taken.
✓ Branch 19 → 20 taken 150 times.
✗ Branch 19 → 37 not taken.
✓ Branch 21 → 22 taken 150 times.
✗ Branch 21 → 40 not taken.
150 lambdaProcNode->body = std::any_cast<StmtLstNode *>(visit(ctx->stmtLst()));
1404
1405
1/2
✓ Branch 27 → 28 taken 150 times.
✗ Branch 27 → 40 not taken.
300 return concludeNode(lambdaProcNode);
1406 }
1407
1408 2 std::any ASTBuilder::visitLambdaExpr(SpiceParser::LambdaExprContext *ctx) {
1409 2 const auto lambdaExprNode = createNode<LambdaExprNode>(ctx);
1410
1411 // Visit children
1412
1/2
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 10 not taken.
2 if (ctx->paramLst()) {
1413 2 lambdaExprNode->hasParams = true;
1414
3/6
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 26 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 26 not taken.
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 24 not taken.
2 lambdaExprNode->paramLst = std::any_cast<ParamLstNode *>(visit(ctx->paramLst()));
1415 }
1416
4/8
✓ Branch 10 → 11 taken 2 times.
✗ Branch 10 → 29 not taken.
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 29 not taken.
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 27 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 30 not taken.
2 lambdaExprNode->lambdaExpr = std::any_cast<ExprNode *>(visit(ctx->assignExpr()));
1417
1418
1/2
✓ Branch 20 → 21 taken 2 times.
✗ Branch 20 → 30 not taken.
4 return concludeNode(lambdaExprNode);
1419 }
1420
1421 329748 std::any ASTBuilder::visitDataType(SpiceParser::DataTypeContext *ctx) {
1422 329748 const auto dataTypeNode = createNode<DataTypeNode>(ctx);
1423
1424 // Visit children
1425
2/2
✓ Branch 4 → 5 taken 120786 times.
✓ Branch 4 → 10 taken 208962 times.
329748 if (ctx->qualifierLst())
1426
4/6
✓ Branch 5 → 6 taken 120786 times.
✗ Branch 5 → 73 not taken.
✓ Branch 6 → 7 taken 120784 times.
✓ Branch 6 → 73 taken 2 times.
✓ Branch 7 → 8 taken 120784 times.
✗ Branch 7 → 71 not taken.
120786 dataTypeNode->qualifierLst = std::any_cast<QualifierLstNode *>(visit(ctx->qualifierLst()));
1427
3/6
✓ Branch 10 → 11 taken 329746 times.
✗ Branch 10 → 76 not taken.
✓ Branch 11 → 12 taken 329746 times.
✗ Branch 11 → 76 not taken.
✓ Branch 12 → 13 taken 329746 times.
✗ Branch 12 → 74 not taken.
329746 dataTypeNode->baseDataType = std::any_cast<BaseDataTypeNode *>(visit(ctx->baseDataType()));
1428
1429 // Enrich
1430
2/2
✓ Branch 60 → 15 taken 542503 times.
✓ Branch 60 → 61 taken 329746 times.
872249 for (size_t i = 0; i < ctx->children.size(); i++) {
1431 542503 antlr4::tree::ParseTree *subTree = ctx->children.at(i);
1432
1/2
✓ Branch 16 → 17 taken 542503 times.
✗ Branch 16 → 18 not taken.
542503 auto terminal = dynamic_cast<TerminalNode *>(subTree);
1433
2/2
✓ Branch 19 → 20 taken 450530 times.
✓ Branch 19 → 21 taken 91973 times.
542503 if (!terminal)
1434 450530 continue;
1435
1436
2/2
✓ Branch 23 → 24 taken 55161 times.
✓ Branch 23 → 26 taken 36812 times.
91973 if (terminal->getSymbol()->getType() == SpiceParser::MUL) {
1437
1/2
✓ Branch 24 → 25 taken 55161 times.
✗ Branch 24 → 77 not taken.
55161 dataTypeNode->tmQueue.emplace(DataTypeNode::TypeModifierType::TYPE_PTR, false, 0);
1438
2/2
✓ Branch 28 → 29 taken 35851 times.
✓ Branch 28 → 31 taken 961 times.
36812 } else if (terminal->getSymbol()->getType() == SpiceParser::BITWISE_AND) {
1439
1/2
✓ Branch 29 → 30 taken 35851 times.
✗ Branch 29 → 80 not taken.
35851 dataTypeNode->tmQueue.emplace(DataTypeNode::TypeModifierType::TYPE_REF, false, 0);
1440
1/2
✓ Branch 33 → 34 taken 961 times.
✗ Branch 33 → 58 not taken.
961 } else if (terminal->getSymbol()->getType() == SpiceParser::LBRACKET) {
1441 961 i++; // Consume LBRACKET
1442
1/2
✓ Branch 34 → 35 taken 961 times.
✗ Branch 34 → 92 not taken.
961 subTree = ctx->children.at(i);
1443
1/2
✓ Branch 35 → 36 taken 961 times.
✗ Branch 35 → 37 not taken.
961 terminal = dynamic_cast<TerminalNode *>(subTree);
1444 961 bool hasSize = false;
1445 961 unsigned int hardCodedSize = 0;
1446 961 std::string sizeVarName;
1447
4/6
✓ Branch 39 → 40 taken 961 times.
✗ Branch 39 → 90 not taken.
✓ Branch 40 → 41 taken 961 times.
✗ Branch 40 → 90 not taken.
✓ Branch 41 → 42 taken 228 times.
✓ Branch 41 → 46 taken 733 times.
961 if (terminal->getSymbol()->getType() == SpiceParser::INT_LIT) {
1448 228 hasSize = true;
1449
2/4
✓ Branch 42 → 43 taken 228 times.
✗ Branch 42 → 85 not taken.
✓ Branch 43 → 44 taken 228 times.
✗ Branch 43 → 83 not taken.
228 hardCodedSize = std::stoi(terminal->getText());
1450 228 i++; // Consume INT_LIT
1451
4/6
✓ Branch 46 → 47 taken 733 times.
✗ Branch 46 → 90 not taken.
✓ Branch 47 → 48 taken 733 times.
✗ Branch 47 → 90 not taken.
✓ Branch 48 → 49 taken 553 times.
✓ Branch 48 → 53 taken 180 times.
733 } else if (terminal->getSymbol()->getType() == SpiceParser::TYPE_IDENTIFIER) {
1452 553 hasSize = true;
1453
1/2
✓ Branch 49 → 50 taken 553 times.
✗ Branch 49 → 86 not taken.
553 sizeVarName = getIdentifier(terminal, true);
1454 553 i++; // Consume TYPE_IDENTIFIER
1455 }
1456
1/2
✓ Branch 54 → 55 taken 961 times.
✗ Branch 54 → 87 not taken.
961 dataTypeNode->tmQueue.push({DataTypeNode::TypeModifierType::TYPE_ARRAY, hasSize, hardCodedSize, sizeVarName});
1457 961 }
1458 }
1459
1460
1/2
✓ Branch 67 → 68 taken 329746 times.
✗ Branch 67 → 93 not taken.
659492 return concludeNode(dataTypeNode);
1461
1/2
✓ Branch 53 → 54 taken 961 times.
✗ Branch 53 → 89 not taken.
961 }
1462
1463 329746 std::any ASTBuilder::visitBaseDataType(SpiceParser::BaseDataTypeContext *ctx) {
1464 329746 const auto baseDataTypeNode = createNode<BaseDataTypeNode>(ctx);
1465
1466 // Enrich
1467
2/2
✓ Branch 4 → 5 taken 4347 times.
✓ Branch 4 → 6 taken 325399 times.
329746 if (ctx->TYPE_DOUBLE()) {
1468 4347 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_DOUBLE;
1469
2/2
✓ Branch 7 → 8 taken 24598 times.
✓ Branch 7 → 9 taken 300801 times.
325399 } else if (ctx->TYPE_INT()) {
1470 24598 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_INT;
1471
2/2
✓ Branch 10 → 11 taken 4634 times.
✓ Branch 10 → 12 taken 296167 times.
300801 } else if (ctx->TYPE_SHORT()) {
1472 4634 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_SHORT;
1473
2/2
✓ Branch 13 → 14 taken 49519 times.
✓ Branch 13 → 15 taken 246648 times.
296167 } else if (ctx->TYPE_LONG()) {
1474 49519 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_LONG;
1475
2/2
✓ Branch 16 → 17 taken 18926 times.
✓ Branch 16 → 18 taken 227722 times.
246648 } else if (ctx->TYPE_BYTE()) {
1476 18926 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_BYTE;
1477
2/2
✓ Branch 19 → 20 taken 31243 times.
✓ Branch 19 → 21 taken 196479 times.
227722 } else if (ctx->TYPE_CHAR()) {
1478 31243 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_CHAR;
1479
2/2
✓ Branch 22 → 23 taken 27550 times.
✓ Branch 22 → 24 taken 168929 times.
196479 } else if (ctx->TYPE_STRING()) {
1480 27550 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_STRING;
1481
2/2
✓ Branch 25 → 26 taken 22979 times.
✓ Branch 25 → 27 taken 145950 times.
168929 } else if (ctx->TYPE_BOOL()) {
1482 22979 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_BOOL;
1483
2/2
✓ Branch 28 → 29 taken 3102 times.
✓ Branch 28 → 30 taken 142848 times.
145950 } else if (ctx->TYPE_DYN()) {
1484 3102 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_DYN;
1485
2/2
✓ Branch 31 → 32 taken 141974 times.
✓ Branch 31 → 37 taken 874 times.
142848 } else if (ctx->customDataType()) {
1486 141974 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_CUSTOM;
1487
3/6
✓ Branch 32 → 33 taken 141974 times.
✗ Branch 32 → 57 not taken.
✓ Branch 33 → 34 taken 141974 times.
✗ Branch 33 → 57 not taken.
✓ Branch 34 → 35 taken 141974 times.
✗ Branch 34 → 55 not taken.
141974 baseDataTypeNode->customDataType = std::any_cast<CustomDataTypeNode *>(visit(ctx->customDataType()));
1488
1/2
✓ Branch 38 → 39 taken 874 times.
✗ Branch 38 → 44 not taken.
874 } else if (ctx->functionDataType()) {
1489 874 baseDataTypeNode->type = BaseDataTypeNode::Type::TYPE_FUNCTION;
1490
3/6
✓ Branch 39 → 40 taken 874 times.
✗ Branch 39 → 60 not taken.
✓ Branch 40 → 41 taken 874 times.
✗ Branch 40 → 60 not taken.
✓ Branch 41 → 42 taken 874 times.
✗ Branch 41 → 58 not taken.
874 baseDataTypeNode->functionDataType = std::any_cast<FunctionDataTypeNode *>(visit(ctx->functionDataType()));
1491 } else {
1492 assert_fail("Unknown base data type");
1493 }
1494
1495
1/2
✓ Branch 51 → 52 taken 329746 times.
✗ Branch 51 → 61 not taken.
659492 return concludeNode(baseDataTypeNode);
1496 }
1497
1498 141974 std::any ASTBuilder::visitCustomDataType(SpiceParser::CustomDataTypeContext *ctx) {
1499
1/2
✓ Branch 2 → 3 taken 141974 times.
✗ Branch 2 → 75 not taken.
141974 const auto customDataTypeNode = createNode<CustomDataTypeNode>(ctx);
1500
1501 // Enrich
1502
1/2
✓ Branch 3 → 4 taken 141974 times.
✗ Branch 3 → 75 not taken.
141974 std::stringstream fqTypeName;
1503
2/2
✓ Branch 39 → 6 taken 194742 times.
✓ Branch 39 → 40 taken 141974 times.
478690 for (ParserRuleContext::ParseTree *subTree : ctx->children) {
1504
1/2
✓ Branch 8 → 9 taken 194742 times.
✗ Branch 8 → 10 not taken.
194742 const auto terminal = dynamic_cast<TerminalNode *>(subTree);
1505
2/2
✓ Branch 11 → 12 taken 17452 times.
✓ Branch 11 → 13 taken 177290 times.
194742 if (!terminal)
1506 17452 continue;
1507
1508
4/6
✓ Branch 13 → 14 taken 177290 times.
✗ Branch 13 → 67 not taken.
✓ Branch 14 → 15 taken 177290 times.
✗ Branch 14 → 67 not taken.
✓ Branch 15 → 16 taken 206 times.
✓ Branch 15 → 22 taken 177084 times.
177290 if (terminal->getSymbol()->getType() == SpiceParser::IDENTIFIER) {
1509
1/2
✓ Branch 16 → 17 taken 206 times.
✗ Branch 16 → 63 not taken.
206 const std::string fragment = terminal->toString();
1510
1/2
✓ Branch 17 → 18 taken 206 times.
✗ Branch 17 → 61 not taken.
206 customDataTypeNode->typeNameFragments.push_back(fragment);
1511
2/4
✓ Branch 18 → 19 taken 206 times.
✗ Branch 18 → 61 not taken.
✓ Branch 19 → 20 taken 206 times.
✗ Branch 19 → 61 not taken.
206 fqTypeName << fragment << SCOPE_ACCESS_TOKEN;
1512
4/6
✓ Branch 22 → 23 taken 177084 times.
✗ Branch 22 → 67 not taken.
✓ Branch 23 → 24 taken 177084 times.
✗ Branch 23 → 67 not taken.
✓ Branch 24 → 25 taken 141974 times.
✓ Branch 24 → 30 taken 35110 times.
177290 } else if (terminal->getSymbol()->getType() == SpiceParser::TYPE_IDENTIFIER) {
1513
1/2
✓ Branch 25 → 26 taken 141974 times.
✗ Branch 25 → 66 not taken.
141974 const std::string fragment = terminal->toString();
1514
1/2
✓ Branch 26 → 27 taken 141974 times.
✗ Branch 26 → 64 not taken.
141974 customDataTypeNode->typeNameFragments.push_back(fragment);
1515
1/2
✓ Branch 27 → 28 taken 141974 times.
✗ Branch 27 → 64 not taken.
141974 fqTypeName << fragment;
1516 141974 }
1517 }
1518
1/2
✓ Branch 40 → 41 taken 141974 times.
✗ Branch 40 → 68 not taken.
141974 customDataTypeNode->fqTypeName = fqTypeName.str();
1519
1520 // Visit children
1521
3/4
✓ Branch 43 → 44 taken 141974 times.
✗ Branch 43 → 73 not taken.
✓ Branch 44 → 45 taken 17452 times.
✓ Branch 44 → 50 taken 124522 times.
141974 if (ctx->typeLst())
1522
3/6
✓ Branch 45 → 46 taken 17452 times.
✗ Branch 45 → 71 not taken.
✓ Branch 46 → 47 taken 17452 times.
✗ Branch 46 → 71 not taken.
✓ Branch 47 → 48 taken 17452 times.
✗ Branch 47 → 69 not taken.
17452 customDataTypeNode->templateTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
1523
1524
1/2
✓ Branch 56 → 57 taken 141974 times.
✗ Branch 56 → 72 not taken.
283948 return concludeNode(customDataTypeNode);
1525 141974 }
1526
1527 874 std::any ASTBuilder::visitFunctionDataType(SpiceParser::FunctionDataTypeContext *ctx) {
1528 874 const auto functionDataTypeNode = createNode<FunctionDataTypeNode>(ctx);
1529
1530 // Enrich
1531
2/2
✓ Branch 4 → 5 taken 524 times.
✓ Branch 4 → 11 taken 350 times.
874 if (ctx->dataType()) {
1532 524 functionDataTypeNode->isFunction = ctx->dataType();
1533
3/6
✓ Branch 6 → 7 taken 524 times.
✗ Branch 6 → 30 not taken.
✓ Branch 7 → 8 taken 524 times.
✗ Branch 7 → 30 not taken.
✓ Branch 8 → 9 taken 524 times.
✗ Branch 8 → 28 not taken.
524 functionDataTypeNode->returnType = std::any_cast<DataTypeNode *>(visit(ctx->dataType()));
1534 }
1535
2/2
✓ Branch 12 → 13 taken 734 times.
✓ Branch 12 → 18 taken 140 times.
874 if (ctx->typeLst())
1536
3/6
✓ Branch 13 → 14 taken 734 times.
✗ Branch 13 → 33 not taken.
✓ Branch 14 → 15 taken 734 times.
✗ Branch 14 → 33 not taken.
✓ Branch 15 → 16 taken 734 times.
✗ Branch 15 → 31 not taken.
734 functionDataTypeNode->paramTypeLst = std::any_cast<TypeLstNode *>(visit(ctx->typeLst()));
1537
1538
1/2
✓ Branch 24 → 25 taken 874 times.
✗ Branch 24 → 34 not taken.
1748 return concludeNode(functionDataTypeNode);
1539 }
1540
1541 48977 std::any ASTBuilder::visitAssignOp(SpiceParser::AssignOpContext *ctx) {
1542 48977 const auto assignExprNode = resumeForExpansion<AssignExprNode>();
1543
1544 // Extract assign operator
1545
2/2
✓ Branch 15 → 16 taken 42862 times.
✓ Branch 15 → 17 taken 6115 times.
48977 if (ctx->ASSIGN())
1546 42862 assignExprNode->op = AssignExprNode::AssignOp::OP_ASSIGN;
1547
2/2
✓ Branch 18 → 19 taken 4376 times.
✓ Branch 18 → 20 taken 1739 times.
6115 else if (ctx->PLUS_EQUAL())
1548 4376 assignExprNode->op = AssignExprNode::AssignOp::OP_PLUS_EQUAL;
1549
2/2
✓ Branch 21 → 22 taken 291 times.
✓ Branch 21 → 23 taken 1448 times.
1739 else if (ctx->MINUS_EQUAL())
1550 291 assignExprNode->op = AssignExprNode::AssignOp::OP_MINUS_EQUAL;
1551
2/2
✓ Branch 24 → 25 taken 495 times.
✓ Branch 24 → 26 taken 953 times.
1448 else if (ctx->MUL_EQUAL())
1552 495 assignExprNode->op = AssignExprNode::AssignOp::OP_MUL_EQUAL;
1553
2/2
✓ Branch 27 → 28 taken 186 times.
✓ Branch 27 → 29 taken 767 times.
953 else if (ctx->DIV_EQUAL())
1554 186 assignExprNode->op = AssignExprNode::AssignOp::OP_DIV_EQUAL;
1555
2/2
✓ Branch 30 → 31 taken 72 times.
✓ Branch 30 → 32 taken 695 times.
767 else if (ctx->REM_EQUAL())
1556 72 assignExprNode->op = AssignExprNode::AssignOp::OP_REM_EQUAL;
1557
2/2
✓ Branch 33 → 34 taken 6 times.
✓ Branch 33 → 35 taken 689 times.
695 else if (ctx->SHL_EQUAL())
1558 6 assignExprNode->op = AssignExprNode::AssignOp::OP_SHL_EQUAL;
1559
2/2
✓ Branch 36 → 37 taken 16 times.
✓ Branch 36 → 38 taken 673 times.
689 else if (ctx->SHR_EQUAL())
1560 16 assignExprNode->op = AssignExprNode::AssignOp::OP_SHR_EQUAL;
1561
2/2
✓ Branch 39 → 40 taken 38 times.
✓ Branch 39 → 41 taken 635 times.
673 else if (ctx->AND_EQUAL())
1562 38 assignExprNode->op = AssignExprNode::AssignOp::OP_AND_EQUAL;
1563
2/2
✓ Branch 42 → 43 taken 38 times.
✓ Branch 42 → 44 taken 597 times.
635 else if (ctx->OR_EQUAL())
1564 38 assignExprNode->op = AssignExprNode::AssignOp::OP_OR_EQUAL;
1565
1/2
✓ Branch 45 → 46 taken 597 times.
✗ Branch 45 → 47 not taken.
597 else if (ctx->XOR_EQUAL())
1566 597 assignExprNode->op = AssignExprNode::AssignOp::OP_XOR_EQUAL;
1567 else
1568 assert_fail("Unknown assign operator");
1569
1570
1/2
✓ Branch 48 → 49 taken 48977 times.
✗ Branch 48 → 52 not taken.
97954 return nullptr;
1571 }
1572
1573 8108 std::any ASTBuilder::visitOverloadableOp(SpiceParser::OverloadableOpContext *ctx) {
1574 8108 const auto fctNameNode = resumeForExpansion<FctNameNode>();
1575
1576 // Enrich
1577
2/2
✓ Branch 15 → 16 taken 362 times.
✓ Branch 15 → 17 taken 7746 times.
8108 if (ctx->PLUS())
1578 362 fctNameNode->name = OP_FCT_PLUS;
1579
2/2
✓ Branch 18 → 19 taken 2 times.
✓ Branch 18 → 20 taken 7744 times.
7746 else if (ctx->MINUS())
1580 2 fctNameNode->name = OP_FCT_MINUS;
1581
2/2
✓ Branch 21 → 22 taken 718 times.
✓ Branch 21 → 23 taken 7026 times.
7744 else if (ctx->MUL())
1582 718 fctNameNode->name = OP_FCT_MUL;
1583
2/2
✓ Branch 24 → 25 taken 74 times.
✓ Branch 24 → 26 taken 6952 times.
7026 else if (ctx->DIV())
1584 74 fctNameNode->name = OP_FCT_DIV;
1585
2/2
✓ Branch 27 → 28 taken 1862 times.
✓ Branch 27 → 29 taken 5090 times.
6952 else if (ctx->EQUAL())
1586 1862 fctNameNode->name = OP_FCT_EQUAL;
1587
2/2
✓ Branch 30 → 31 taken 1790 times.
✓ Branch 30 → 32 taken 3300 times.
5090 else if (ctx->NOT_EQUAL())
1588 1790 fctNameNode->name = OP_FCT_NOT_EQUAL;
1589
3/4
✓ Branch 32 → 33 taken 3300 times.
✗ Branch 32 → 85 not taken.
✓ Branch 35 → 36 taken 188 times.
✓ Branch 35 → 37 taken 3112 times.
3300 else if (ctx->LESS().size() == 2)
1590 188 fctNameNode->name = OP_FCT_SHL;
1591
3/4
✓ Branch 37 → 38 taken 3112 times.
✗ Branch 37 → 86 not taken.
✓ Branch 40 → 41 taken 2 times.
✓ Branch 40 → 42 taken 3110 times.
3112 else if (ctx->GREATER().size() == 2)
1592 2 fctNameNode->name = OP_FCT_SHR;
1593
2/2
✓ Branch 43 → 44 taken 8 times.
✓ Branch 43 → 45 taken 3102 times.
3110 else if (ctx->BITWISE_AND())
1594 8 fctNameNode->name = OP_FCT_BITWISE_AND;
1595
2/2
✓ Branch 46 → 47 taken 8 times.
✓ Branch 46 → 48 taken 3094 times.
3102 else if (ctx->BITWISE_OR())
1596 8 fctNameNode->name = OP_FCT_BITWISE_OR;
1597
2/2
✓ Branch 49 → 50 taken 8 times.
✓ Branch 49 → 51 taken 3086 times.
3094 else if (ctx->BITWISE_XOR())
1598 8 fctNameNode->name = OP_FCT_BITWISE_XOR;
1599
2/2
✓ Branch 52 → 53 taken 8 times.
✓ Branch 52 → 54 taken 3078 times.
3086 else if (ctx->BITWISE_NOT())
1600 8 fctNameNode->name = OP_FCT_BITWISE_NOT;
1601
2/2
✓ Branch 55 → 56 taken 523 times.
✓ Branch 55 → 57 taken 2555 times.
3078 else if (ctx->PLUS_EQUAL())
1602 523 fctNameNode->name = OP_FCT_PLUS_EQUAL;
1603
2/2
✓ Branch 58 → 59 taken 165 times.
✓ Branch 58 → 60 taken 2390 times.
2555 else if (ctx->MINUS_EQUAL())
1604 165 fctNameNode->name = OP_FCT_MINUS_EQUAL;
1605
2/2
✓ Branch 61 → 62 taken 360 times.
✓ Branch 61 → 63 taken 2030 times.
2390 else if (ctx->MUL_EQUAL())
1606 360 fctNameNode->name = OP_FCT_MUL_EQUAL;
1607
2/2
✓ Branch 64 → 65 taken 74 times.
✓ Branch 64 → 66 taken 1956 times.
2030 else if (ctx->DIV_EQUAL())
1608 74 fctNameNode->name = OP_FCT_DIV_EQUAL;
1609
2/2
✓ Branch 67 → 68 taken 231 times.
✓ Branch 67 → 69 taken 1725 times.
1956 else if (ctx->PLUS_PLUS())
1610 231 fctNameNode->name = OP_FCT_POSTFIX_PLUS_PLUS;
1611
2/2
✓ Branch 70 → 71 taken 165 times.
✓ Branch 70 → 72 taken 1560 times.
1725 else if (ctx->MINUS_MINUS())
1612 165 fctNameNode->name = OP_FCT_POSTFIX_MINUS_MINUS;
1613
2/2
✓ Branch 73 → 74 taken 891 times.
✓ Branch 73 → 75 taken 669 times.
1560 else if (ctx->LBRACKET())
1614 891 fctNameNode->name = OP_FCT_SUBSCRIPT;
1615
1/2
✓ Branch 76 → 77 taken 669 times.
✗ Branch 76 → 78 not taken.
669 else if (ctx->ASSIGN())
1616 669 fctNameNode->name = OP_FCT_ASSIGN;
1617 else
1618 assert_fail("Unsupported overloadable operator"); // GCOV_EXCL_LINE
1619
1620 8108 fctNameNode->fqName = fctNameNode->name;
1621 8108 fctNameNode->nameFragments.push_back(fctNameNode->name);
1622
1623
1/2
✓ Branch 81 → 82 taken 8108 times.
✗ Branch 81 → 87 not taken.
16216 return nullptr;
1624 }
1625
1626 30016 int32_t ASTBuilder::parseInt(TerminalNode *terminal, bool isNegative) {
1627 90048 const NumericParserCallback<int32_t> cb = [isNegative](const std::string &substr, short base, bool isSigned) -> int32_t {
1628 // Prepare limits
1629
2/2
✓ Branch 2 → 3 taken 29210 times.
✓ Branch 2 → 4 taken 806 times.
30016 const int64_t upperLimit = isSigned ? INT32_MAX : UINT32_MAX;
1630
2/2
✓ Branch 5 → 6 taken 29210 times.
✓ Branch 5 → 7 taken 806 times.
30016 const int64_t lowerLimit = isSigned ? INT32_MIN : 0;
1631 // Parse number, apply sign and check for limits
1632 30016 int64_t number = std::stoll(substr, nullptr, base);
1633
2/2
✓ Branch 9 → 10 taken 449 times.
✓ Branch 9 → 11 taken 29565 times.
30014 if (isNegative)
1634 449 number = -number;
1635
2/4
✓ Branch 11 → 12 taken 30014 times.
✗ Branch 11 → 13 not taken.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 16 taken 30014 times.
30014 if (number < lowerLimit || number > upperLimit)
1636 throw std::out_of_range("Number out of range");
1637 30014 return static_cast<int32_t>(number);
1638 30016 };
1639
2/2
✓ Branch 3 → 4 taken 30014 times.
✓ Branch 3 → 8 taken 2 times.
60030 return parseNumeric(terminal, cb);
1640 30016 }
1641
1642 2448 int16_t ASTBuilder::parseShort(TerminalNode *terminal, bool isNegative) {
1643 7344 const NumericParserCallback<int16_t> cb = [isNegative](const std::string &substr, short base, bool isSigned) -> int16_t {
1644 // Prepare limits
1645
2/2
✓ Branch 2 → 3 taken 1780 times.
✓ Branch 2 → 4 taken 668 times.
2448 const int64_t upperLimit = isSigned ? INT16_MAX : UINT16_MAX;
1646
2/2
✓ Branch 5 → 6 taken 1780 times.
✓ Branch 5 → 7 taken 668 times.
2448 const int64_t lowerLimit = isSigned ? INT16_MIN : 0;
1647 // Parse number, apply sign and check for limits
1648 2448 int64_t number = std::stoll(substr, nullptr, base);
1649
2/2
✓ Branch 9 → 10 taken 172 times.
✓ Branch 9 → 11 taken 2276 times.
2448 if (isNegative)
1650 172 number = -number;
1651
2/4
✓ Branch 11 → 12 taken 2448 times.
✗ Branch 11 → 13 not taken.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 16 taken 2448 times.
2448 if (number < lowerLimit || number > upperLimit)
1652 throw std::out_of_range("Number out of range");
1653 2448 return static_cast<int16_t>(number);
1654 2448 };
1655
1/2
✓ Branch 3 → 4 taken 2448 times.
✗ Branch 3 → 8 not taken.
4896 return parseNumeric(terminal, cb);
1656 2448 }
1657
1658 43472 int64_t ASTBuilder::parseLong(TerminalNode *terminal, bool isNegative) {
1659 130416 const NumericParserCallback<int64_t> cb = [isNegative](const std::string &substr, short base, bool isSigned) -> int64_t {
1660 // Parse the magnitude as unsigned so values like 2^63 (the absolute value of INT64_MIN) fit
1661 43472 const uint64_t magnitude = std::stoull(substr, nullptr, base);
1662
2/2
✓ Branch 3 → 4 taken 5492 times.
✓ Branch 3 → 11 taken 37980 times.
43472 if (isNegative) {
1663 5492 constexpr uint64_t maxNegMagnitude = static_cast<uint64_t>(INT64_MAX) + 1; // 2^63
1664
1/2
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 5492 times.
5492 if (magnitude > maxNegMagnitude)
1665 throw std::out_of_range("Number out of range");
1666
2/2
✓ Branch 8 → 9 taken 4 times.
✓ Branch 8 → 10 taken 5488 times.
5492 if (magnitude == maxNegMagnitude)
1667 4 return INT64_MIN;
1668 5488 return -static_cast<int64_t>(magnitude);
1669 }
1670
3/4
✓ Branch 11 → 12 taken 34646 times.
✓ Branch 11 → 16 taken 3334 times.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 16 taken 34646 times.
37980 if (isSigned && magnitude > static_cast<uint64_t>(INT64_MAX))
1671 throw std::out_of_range("Number out of range");
1672 37980 return static_cast<int64_t>(magnitude);
1673 43472 };
1674
1/2
✓ Branch 3 → 4 taken 43472 times.
✗ Branch 3 → 8 not taken.
86944 return parseNumeric(terminal, cb);
1675 43472 }
1676
1677 14251 int8_t ASTBuilder::parseChar(TerminalNode *terminal) const {
1678
1/2
✓ Branch 2 → 3 taken 14251 times.
✗ Branch 2 → 59 not taken.
14251 const std::string input = terminal->toString();
1679
2/2
✓ Branch 4 → 5 taken 9258 times.
✓ Branch 4 → 7 taken 4993 times.
14251 if (input.length() == 3) // Normal char literals
1680 9258 return input[1];
1681
1682
3/6
✓ Branch 8 → 9 taken 4993 times.
✗ Branch 8 → 12 not taken.
✓ Branch 10 → 11 taken 4993 times.
✗ Branch 10 → 12 not taken.
✓ Branch 13 → 14 taken 4993 times.
✗ Branch 13 → 34 not taken.
4993 if (input.length() == 4 && input[1] == '\\') { // Char literals with escape sequence
1683
10/11
✓ Branch 15 → 16 taken 94 times.
✗ Branch 15 → 17 not taken.
✓ Branch 15 → 18 taken 118 times.
✓ Branch 15 → 19 taken 670 times.
✓ Branch 15 → 20 taken 506 times.
✓ Branch 15 → 21 taken 460 times.
✓ Branch 15 → 22 taken 18 times.
✓ Branch 15 → 23 taken 36 times.
✓ Branch 15 → 24 taken 22 times.
✓ Branch 15 → 25 taken 3067 times.
✓ Branch 15 → 26 taken 2 times.
4993 switch (input[2]) {
1684 94 case '\'':
1685 94 return '\'';
1686 case '"':
1687 return '\"';
1688 118 case '\\':
1689 118 return '\\';
1690 670 case 'n':
1691 670 return '\n';
1692 506 case 'r':
1693 506 return '\r';
1694 460 case 't':
1695 460 return '\t';
1696 18 case 'b':
1697 18 return '\b';
1698 36 case 'f':
1699 36 return '\f';
1700 22 case 'v':
1701 22 return '\v';
1702 3067 case '0':
1703 3067 return '\0';
1704 2 default:
1705
2/4
✓ Branch 26 → 27 taken 2 times.
✗ Branch 26 → 50 not taken.
✓ Branch 27 → 28 taken 2 times.
✗ Branch 27 → 50 not taken.
2 const CodeLoc codeLoc(terminal->getSymbol(), sourceFile);
1706
2/4
✓ Branch 29 → 30 taken 2 times.
✗ Branch 29 → 47 not taken.
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 44 not taken.
2 throw ParserError(codeLoc, INVALID_CHAR_LITERAL, "Invalid escape sequence " + input);
1707 }
1708 }
1709
1710 const CodeLoc codeLoc(terminal->getSymbol(), sourceFile);
1711 throw ParserError(codeLoc, INVALID_CHAR_LITERAL, "Invalid char literal " + input);
1712 14251 }
1713
1714 27209 std::string ASTBuilder::parseString(std::string input) {
1715
1/2
✓ Branch 3 → 4 taken 27209 times.
✗ Branch 3 → 9 not taken.
27209 input = input.substr(1, input.size() - 2);
1716 27209 replaceEscapeChars(input);
1717 27209 return input;
1718 }
1719
1720 75936 template <typename T> T ASTBuilder::parseNumeric(TerminalNode *terminal, const NumericParserCallback<T> &cb) {
1721
3/6
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 2 → 3 taken 30016 times.
✗ Branch 2 → 87 not taken.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 2 → 3 taken 43472 times.
✗ Branch 2 → 87 not taken.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 2 → 3 taken 2448 times.
✗ Branch 2 → 87 not taken.
75936 const std::string input = terminal->toString();
1722
1723 // Set to signed if the input string does not end with 'u'
1724
12/18
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 4 → 5 taken 29210 times.
✓ Branch 4 → 9 taken 806 times.
✓ Branch 6 → 7 taken 29210 times.
✗ Branch 6 → 9 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 29210 times.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 4 → 5 taken 43472 times.
✗ Branch 4 → 9 not taken.
✓ Branch 6 → 7 taken 43472 times.
✗ Branch 6 → 9 not taken.
✓ Branch 8 → 9 taken 3334 times.
✓ Branch 8 → 10 taken 40138 times.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 4 → 5 taken 2448 times.
✗ Branch 4 → 9 not taken.
✓ Branch 6 → 7 taken 1780 times.
✓ Branch 6 → 9 taken 668 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 1780 times.
75936 const bool isUnsigned = input.ends_with('u') || input.ends_with("us") || input.ends_with("ul");
1725
1726 try {
1727
6/6
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 12 → 13 taken 3518 times.
✓ Branch 12 → 30 taken 26498 times.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 12 → 13 taken 5239 times.
✓ Branch 12 → 30 taken 38233 times.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 12 → 13 taken 1674 times.
✓ Branch 12 → 30 taken 774 times.
75936 if (input.length() >= 3) {
1728
6/6
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 14 → 15 taken 1126 times.
✓ Branch 14 → 30 taken 2392 times.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 14 → 15 taken 2079 times.
✓ Branch 14 → 30 taken 3160 times.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 14 → 15 taken 362 times.
✓ Branch 14 → 30 taken 1312 times.
10431 if (input[0] == '0') {
1729
3/6
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 15 → 16 taken 1126 times.
✗ Branch 15 → 37 not taken.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 15 → 16 taken 2079 times.
✗ Branch 15 → 37 not taken.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 15 → 16 taken 362 times.
✗ Branch 15 → 37 not taken.
3567 const std::string subStr = input.substr(2);
1730
6/15
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 20 not taken.
✓ Branch 17 → 22 taken 488 times.
✓ Branch 17 → 24 taken 638 times.
✗ Branch 17 → 26 not taken.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 20 not taken.
✓ Branch 17 → 22 taken 686 times.
✗ Branch 17 → 24 not taken.
✓ Branch 17 → 26 taken 1393 times.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 20 not taken.
✗ Branch 17 → 22 not taken.
✓ Branch 17 → 24 taken 360 times.
✓ Branch 17 → 26 taken 2 times.
3567 switch (input[1]) {
1731 case 'd': // fall-through
1732 case 'D':
1733 return cb(subStr, 10, !isUnsigned);
1734 case 'b': // fall-through
1735 case 'B':
1736 return cb(subStr, 2, !isUnsigned);
1737 1174 case 'h': // fall-through
1738 case 'H': // fall-through
1739 case 'x': // fall-through
1740 case 'X':
1741
2/6
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 22 → 23 taken 488 times.
✗ Branch 22 → 35 not taken.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 22 → 23 taken 686 times.
✗ Branch 22 → 35 not taken.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 35 not taken.
1174 return cb(subStr, 16, !isUnsigned);
1742 998 case 'o': // fall-through
1743 case 'O':
1744
2/6
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 24 → 25 taken 638 times.
✗ Branch 24 → 35 not taken.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 35 not taken.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 24 → 25 taken 360 times.
✗ Branch 24 → 35 not taken.
998 return cb(subStr, 8, !isUnsigned);
1745 1395 default: // default is decimal
1746
2/6
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 35 not taken.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 26 → 27 taken 1393 times.
✗ Branch 26 → 35 not taken.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 26 → 27 taken 2 times.
✗ Branch 26 → 35 not taken.
1395 return cb(input, 10, !isUnsigned);
1747 }
1748 3567 }
1749 }
1750
4/6
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 30 → 31 taken 28888 times.
✓ Branch 30 → 38 taken 2 times.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 30 → 31 taken 41393 times.
✗ Branch 30 → 38 not taken.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 30 → 31 taken 2086 times.
✗ Branch 30 → 38 not taken.
72369 return cb(input, 10, !isUnsigned);
1751
1/9
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 40 taken 2 times.
✗ Branch 38 → 51 not taken.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 40 not taken.
✗ Branch 38 → 51 not taken.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 40 not taken.
✗ Branch 38 → 51 not taken.
4 } catch (std::out_of_range &) {
1752
2/12
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 41 → 42 taken 2 times.
✗ Branch 41 → 70 not taken.
✓ Branch 42 → 43 taken 2 times.
✗ Branch 42 → 70 not taken.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 70 not taken.
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 70 not taken.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 70 not taken.
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 70 not taken.
2 const CodeLoc codeLoc(terminal->getSymbol(), sourceFile);
1753
2/12
int spice::compiler::ASTBuilder::parseNumeric<int>(antlr4::tree::TerminalNode*, std::function<int (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 64 not taken.
✓ Branch 47 → 48 taken 2 times.
✗ Branch 47 → 61 not taken.
long spice::compiler::ASTBuilder::parseNumeric<long>(antlr4::tree::TerminalNode*, std::function<long (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 64 not taken.
✗ Branch 47 → 48 not taken.
✗ Branch 47 → 61 not taken.
short spice::compiler::ASTBuilder::parseNumeric<short>(antlr4::tree::TerminalNode*, std::function<short (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, short, bool)> const&):
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 64 not taken.
✗ Branch 47 → 48 not taken.
✗ Branch 47 → 61 not taken.
6 throw ParserError(codeLoc, NUMBER_OUT_OF_RANGE, "The provided number is out of range");
1754 } catch (std::invalid_argument &) {
1755 const CodeLoc codeLoc(terminal->getSymbol(), sourceFile);
1756 throw ParserError(codeLoc, NUMBER_OUT_OF_RANGE, "You tried to parse '" + input + "' as an integer, but it was no integer");
1757 }
1758 75936 }
1759
1760 27209 void ASTBuilder::replaceEscapeChars(std::string &input) {
1761 27209 const std::unordered_map<char, char> escapeMap = {
1762 {'a', '\a'}, {'b', '\b'}, {'f', '\f'}, {'n', '\n'}, {'r', '\r'}, {'t', '\t'},
1763 {'v', '\v'}, {'\\', '\\'}, {'?', '\?'}, {'\'', '\''}, {'"', '\"'},
1764
1/2
✓ Branch 4 → 5 taken 27209 times.
✗ Branch 4 → 40 not taken.
54418 };
1765
1766 27209 size_t writeIndex = 0;
1767 27209 size_t readIndex = 0;
1768 27209 const size_t len = input.length();
1769
1770
2/2
✓ Branch 36 → 8 taken 393845 times.
✓ Branch 36 → 37 taken 27209 times.
421054 while (readIndex < len) {
1771 393845 const char c = input[readIndex];
1772
3/4
✓ Branch 9 → 10 taken 5699 times.
✓ Branch 9 → 33 taken 388146 times.
✓ Branch 10 → 11 taken 5699 times.
✗ Branch 10 → 33 not taken.
393845 if (c == '\\' && readIndex + 1 < len) {
1773 5699 char next = input[readIndex + 1];
1774
1/2
✓ Branch 12 → 13 taken 5699 times.
✗ Branch 12 → 45 not taken.
5699 auto it = escapeMap.find(next);
1775
2/2
✓ Branch 15 → 16 taken 5619 times.
✓ Branch 15 → 19 taken 80 times.
5699 if (it != escapeMap.end()) {
1776 5619 input[writeIndex++] = it->second;
1777 5619 readIndex += 2;
1778 5693 continue;
1779 }
1780
1781 // Handle octal escape sequences (up to 3 digits)
1782
3/4
✓ Branch 19 → 20 taken 80 times.
✗ Branch 19 → 31 not taken.
✓ Branch 20 → 21 taken 74 times.
✓ Branch 20 → 31 taken 6 times.
80 if (next >= '0' && next <= '7') {
1783 74 int value = 0;
1784 74 size_t octalDigits = 0;
1785
1786 // Look ahead up to 3 digits
1787
3/4
✓ Branch 26 → 27 taken 222 times.
✓ Branch 26 → 28 taken 74 times.
✓ Branch 27 → 22 taken 222 times.
✗ Branch 27 → 28 not taken.
296 for (size_t i = 1; i <= 3 && readIndex + i < len; ++i) {
1788 222 const char oc = input[readIndex + i];
1789
2/4
✓ Branch 23 → 24 taken 222 times.
✗ Branch 23 → 28 not taken.
✓ Branch 24 → 25 taken 222 times.
✗ Branch 24 → 28 not taken.
222 if (oc >= '0' && oc <= '7') {
1790 222 value = value << 3 | (oc - '0'); // multiply by 8 and add digit
1791 222 octalDigits++;
1792 } else {
1793 break;
1794 }
1795 }
1796
1797
1/2
✓ Branch 28 → 29 taken 74 times.
✗ Branch 28 → 31 not taken.
74 if (octalDigits > 0) {
1798 74 input[writeIndex++] = static_cast<char>(value);
1799 74 readIndex += 1 + octalDigits; // backslash + octal digits
1800 74 continue;
1801 }
1802 }
1803 }
1804
1805 // Copy current character
1806 388152 input[writeIndex++] = c;
1807 388152 readIndex++;
1808 }
1809
1810
1/2
✓ Branch 37 → 38 taken 27209 times.
✗ Branch 37 → 46 not taken.
27209 input.resize(writeIndex);
1811 27209 }
1812
1813 823010 std::string ASTBuilder::getIdentifier(TerminalNode *terminal, bool isTypeIdentifier) const {
1814 823010 const std::string identifier = terminal->getText();
1815
1816 // Check if the list of reserved keywords contains the given identifier
1817
3/4
✓ Branch 3 → 4 taken 823010 times.
✗ Branch 3 → 52 not taken.
✓ Branch 4 → 5 taken 2 times.
✓ Branch 4 → 14 taken 823008 times.
823010 if (std::ranges::find(RESERVED_KEYWORDS, identifier) != std::end(RESERVED_KEYWORDS)) {
1818
2/4
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 41 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 41 not taken.
2 const CodeLoc codeLoc(terminal->getSymbol(), sourceFile);
1819
3/6
✓ Branch 8 → 9 taken 2 times.
✗ Branch 8 → 37 not taken.
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 35 not taken.
✓ Branch 10 → 11 taken 2 times.
✗ Branch 10 → 32 not taken.
2 throw ParserError(codeLoc, RESERVED_KEYWORD, "'" + identifier + "' is a reserved keyword. Please use another name instead");
1820 }
1821
1822 // Check if the identifier is a type identifier and is reserved
1823
6/6
✓ Branch 14 → 15 taken 70071 times.
✓ Branch 14 → 19 taken 752937 times.
✓ Branch 15 → 16 taken 15131 times.
✓ Branch 15 → 19 taken 54940 times.
✓ Branch 20 → 21 taken 2 times.
✓ Branch 20 → 30 taken 823006 times.
838139 if (isTypeIdentifier && !sourceFile->isStdFile &&
1824
3/4
✓ Branch 16 → 17 taken 15131 times.
✗ Branch 16 → 52 not taken.
✓ Branch 17 → 18 taken 2 times.
✓ Branch 17 → 19 taken 15129 times.
15131 std::ranges::find(RESERVED_TYPE_NAMES, identifier) != std::end(RESERVED_TYPE_NAMES)) {
1825
2/4
✓ Branch 21 → 22 taken 2 times.
✗ Branch 21 → 51 not taken.
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 51 not taken.
2 const CodeLoc codeLoc(terminal->getSymbol(), sourceFile);
1826
3/6
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 47 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 45 not taken.
✓ Branch 26 → 27 taken 2 times.
✗ Branch 26 → 42 not taken.
2 throw ParserError(codeLoc, RESERVED_TYPENAME, "'" + identifier + "' is a reserved type name. Please use another one instead");
1827 }
1828
1829 823006 return identifier;
1830 4 }
1831
1832 } // namespace spice::compiler
1833