GCC Code Coverage Report


Directory: ../
File: src/typechecker/TypeCheckMeta.cpp
Date: 2025-03-05 01:50:32
Exec Total Coverage
Lines: 230 252 91.3%
Functions: 7 7 100.0%
Branches: 375 725 51.7%

Line Branch Exec Source
1 // Copyright (c) 2021-2025 ChilliBits. All rights reserved.
2
3 #include "TypeChecker.h"
4
5 #include <SourceFile.h>
6 #include <ast/ASTNodes.h>
7 #include <global/GlobalResourceManager.h>
8 #include <typechecker/MacroDefs.h>
9
10 namespace spice::compiler {
11
12 13752 std::any TypeChecker::visitParamLst(ParamLstNode *node) {
13 13752 NamedParamList namedParams;
14 13752 bool metOptional = false;
15
16
2/2
✓ Branch 0 (35→4) taken 21420 times.
✓ Branch 1 (35→36) taken 13752 times.
35172 for (DeclStmtNode *param : node->params) {
17 // Visit param
18
2/4
✓ Branch 0 (5→6) taken 21420 times.
✗ Branch 1 (5→43) not taken.
✓ Branch 2 (6→7) taken 21420 times.
✗ Branch 3 (6→41) not taken.
21420 const auto paramType = std::any_cast<QualType>(visit(param));
19
3/4
✓ Branch 0 (8→9) taken 21420 times.
✗ Branch 1 (8→57) not taken.
✓ Branch 2 (9→10) taken 2 times.
✓ Branch 3 (9→11) taken 21418 times.
21420 if (paramType.is(TY_UNRESOLVED))
20 11 continue;
21
22 // Check if the type could be inferred. Dyn without a default value is forbidden
23
3/4
✓ Branch 0 (11→12) taken 21418 times.
✗ Branch 1 (11→57) not taken.
✓ Branch 2 (12→13) taken 3 times.
✓ Branch 3 (12→19) taken 21415 times.
21418 if (paramType.is(TY_DYN)) {
24
3/6
✓ Branch 0 (13→14) taken 3 times.
✗ Branch 1 (13→48) not taken.
✓ Branch 2 (14→15) taken 3 times.
✗ Branch 3 (14→46) not taken.
✓ Branch 4 (15→16) taken 3 times.
✗ Branch 5 (15→44) not taken.
3 softError(node, FCT_PARAM_IS_TYPE_DYN, "Type of parameter '" + param->varName + "' is invalid");
25 3 continue;
26 }
27
28 // Ensure that no optional param comes after a mandatory param
29
2/2
✓ Branch 0 (19→20) taken 2227 times.
✓ Branch 1 (19→21) taken 19188 times.
21415 if (param->hasAssignment) {
30 2227 metOptional = true;
31
2/2
✓ Branch 0 (21→22) taken 6 times.
✓ Branch 1 (21→29) taken 19182 times.
19188 } else if (metOptional) {
32
2/4
✓ Branch 0 (24→25) taken 6 times.
✗ Branch 1 (24→52) not taken.
✓ Branch 2 (25→26) taken 6 times.
✗ Branch 3 (25→50) not taken.
6 softError(param, INVALID_PARAM_ORDER, "Mandatory parameters must go before any optional parameters");
33 6 continue;
34 }
35
36 // Add parameter to named param list
37
1/2
✓ Branch 0 (30→31) taken 21409 times.
✗ Branch 1 (30→56) not taken.
21409 namedParams.push_back({param->varName.c_str(), paramType, metOptional});
38 }
39
40
1/2
✓ Branch 0 (36→37) taken 13752 times.
✗ Branch 1 (36→59) not taken.
27504 return namedParams;
41 13752 }
42
43 1300 std::any TypeChecker::visitField(FieldNode *node) {
44
2/4
✓ Branch 0 (2→3) taken 1300 times.
✗ Branch 1 (2→37) not taken.
✓ Branch 2 (3→4) taken 1300 times.
✗ Branch 3 (3→35) not taken.
1300 auto fieldType = std::any_cast<QualType>(visit(node->dataType));
45
4/6
✓ Branch 0 (5→6) taken 1300 times.
✗ Branch 1 (5→50) not taken.
✓ Branch 2 (6→7) taken 1 times.
✓ Branch 3 (6→9) taken 1299 times.
✓ Branch 4 (7→8) taken 1 times.
✗ Branch 5 (7→50) not taken.
1300 HANDLE_UNRESOLVED_TYPE_QT(fieldType)
46
47
2/2
✓ Branch 0 (9→10) taken 176 times.
✓ Branch 1 (9→31) taken 1123 times.
1299 if (TernaryExprNode *defaultValueNode = node->defaultValue) {
48
2/4
✓ Branch 0 (10→11) taken 176 times.
✗ Branch 1 (10→40) not taken.
✓ Branch 2 (11→12) taken 176 times.
✗ Branch 3 (11→38) not taken.
176 const QualType defaultValueType = std::any_cast<ExprResult>(visit(defaultValueNode)).type;
49
2/6
✓ Branch 0 (13→14) taken 176 times.
✗ Branch 1 (13→49) not taken.
✗ Branch 2 (14→15) not taken.
✓ Branch 3 (14→17) taken 176 times.
✗ Branch 4 (15→16) not taken.
✗ Branch 5 (15→49) not taken.
177 HANDLE_UNRESOLVED_TYPE_QT(defaultValueType)
50
3/4
✓ Branch 0 (17→18) taken 176 times.
✗ Branch 1 (17→49) not taken.
✓ Branch 2 (18→19) taken 1 times.
✓ Branch 3 (18→29) taken 175 times.
176 if (!fieldType.matches(defaultValueType, false, true, true))
51
4/8
✓ Branch 0 (21→22) taken 1 times.
✗ Branch 1 (21→44) not taken.
✓ Branch 2 (22→23) taken 1 times.
✗ Branch 3 (22→42) not taken.
✓ Branch 4 (25→26) taken 1 times.
✗ Branch 5 (25→48) not taken.
✓ Branch 6 (26→27) taken 1 times.
✗ Branch 7 (26→48) not taken.
3 SOFT_ERROR_QT(node, FIELD_TYPE_NOT_MATCHING, "Type of the default values does not match the field type")
52 }
53
54
1/2
✓ Branch 0 (31→32) taken 1298 times.
✗ Branch 1 (31→50) not taken.
1298 return fieldType;
55 }
56
57 192 std::any TypeChecker::visitSignature(SignatureNode *node) {
58 192 const bool isFunction = node->signatureType == SignatureNode::SignatureType::TYPE_FUNCTION;
59
60 // Retrieve function template types
61 192 std::vector<GenericType> usedGenericTypes;
62
2/2
✓ Branch 0 (2→3) taken 96 times.
✓ Branch 1 (2→33) taken 96 times.
192 if (node->hasTemplateTypes) {
63
2/2
✓ Branch 0 (31→5) taken 96 times.
✓ Branch 1 (31→32) taken 95 times.
191 for (DataTypeNode *dataType : node->templateTypeLst->dataTypes) {
64 // Visit template type
65
2/4
✓ Branch 0 (6→7) taken 96 times.
✗ Branch 1 (6→108) not taken.
✓ Branch 2 (7→8) taken 96 times.
✗ Branch 3 (7→106) not taken.
96 auto templateType = std::any_cast<QualType>(visit(dataType));
66
2/4
✓ Branch 0 (9→10) taken 96 times.
✗ Branch 1 (9→117) not taken.
✗ Branch 2 (10→11) not taken.
✓ Branch 3 (10→13) taken 96 times.
96 if (templateType.is(TY_UNRESOLVED))
67 return static_cast<std::vector<Function *> *>(nullptr);
68 // Check if it is a generic type
69
3/4
✓ Branch 0 (13→14) taken 96 times.
✗ Branch 1 (13→117) not taken.
✓ Branch 2 (14→15) taken 1 times.
✓ Branch 3 (14→23) taken 95 times.
96 if (!templateType.is(TY_GENERIC)) {
70
2/4
✓ Branch 0 (17→18) taken 1 times.
✗ Branch 1 (17→112) not taken.
✓ Branch 2 (18→19) taken 1 times.
✗ Branch 3 (18→110) not taken.
1 softError(dataType, EXPECTED_GENERIC_TYPE, "A template list can only contain generic types");
71
1/2
✓ Branch 0 (21→22) taken 1 times.
✗ Branch 1 (21→116) not taken.
1 return static_cast<std::vector<Function *> *>(nullptr);
72 }
73 // Convert generic symbol type to generic type
74
2/4
✓ Branch 0 (23→24) taken 95 times.
✗ Branch 1 (23→117) not taken.
✓ Branch 2 (24→25) taken 95 times.
✗ Branch 3 (24→117) not taken.
95 const GenericType *genericType = rootScope->lookupGenericTypeStrict(templateType.getSubType());
75
1/2
✗ Branch 0 (25→26) not taken.
✓ Branch 1 (25→27) taken 95 times.
95 assert(genericType != nullptr);
76
1/2
✓ Branch 0 (27→28) taken 95 times.
✗ Branch 1 (27→117) not taken.
95 usedGenericTypes.push_back(*genericType);
77 }
78 }
79
80 // Visit return type
81
1/2
✓ Branch 0 (33→34) taken 191 times.
✗ Branch 1 (33→159) not taken.
191 QualType returnType(TY_DYN);
82
2/2
✓ Branch 0 (34→35) taken 149 times.
✓ Branch 1 (34→51) taken 42 times.
191 if (isFunction) {
83
2/4
✓ Branch 0 (35→36) taken 149 times.
✗ Branch 1 (35→121) not taken.
✓ Branch 2 (36→37) taken 149 times.
✗ Branch 3 (36→119) not taken.
149 returnType = std::any_cast<QualType>(visit(node->returnType));
84
2/4
✓ Branch 0 (38→39) taken 149 times.
✗ Branch 1 (38→159) not taken.
✗ Branch 2 (39→40) not taken.
✓ Branch 3 (39→42) taken 149 times.
149 if (returnType.is(TY_UNRESOLVED))
85 return static_cast<std::vector<Function *> *>(nullptr);
86
87
3/4
✓ Branch 0 (42→43) taken 149 times.
✗ Branch 1 (42→159) not taken.
✓ Branch 2 (43→44) taken 1 times.
✓ Branch 3 (43→51) taken 148 times.
149 if (!returnType.isCoveredByGenericTypeList(usedGenericTypes))
88
2/4
✓ Branch 0 (46→47) taken 1 times.
✗ Branch 1 (46→126) not taken.
✓ Branch 2 (47→48) taken 1 times.
✗ Branch 3 (47→124) not taken.
2 softError(node->returnType, GENERIC_TYPE_NOT_IN_TEMPLATE,
89 "Generic return type not included in the template type list of the function");
90 }
91
92 // Visit params
93 191 QualTypeList paramTypes;
94 191 ParamList paramList;
95
2/2
✓ Branch 0 (51→52) taken 8 times.
✓ Branch 1 (51→80) taken 183 times.
191 if (node->hasParams) {
96
1/2
✓ Branch 0 (53→54) taken 8 times.
✗ Branch 1 (53→155) not taken.
8 paramList.reserve(node->paramTypeLst->dataTypes.size());
97
2/2
✓ Branch 0 (78→56) taken 10 times.
✓ Branch 1 (78→79) taken 8 times.
18 for (DataTypeNode *param : node->paramTypeLst->dataTypes) {
98
2/4
✓ Branch 0 (57→58) taken 10 times.
✗ Branch 1 (57→132) not taken.
✓ Branch 2 (58→59) taken 10 times.
✗ Branch 3 (58→130) not taken.
10 auto paramType = std::any_cast<QualType>(visit(param));
99
2/4
✓ Branch 0 (60→61) taken 10 times.
✗ Branch 1 (60→141) not taken.
✗ Branch 2 (61→62) not taken.
✓ Branch 3 (61→64) taken 10 times.
10 if (paramType.is(TY_UNRESOLVED))
100 return static_cast<std::vector<Function *> *>(nullptr);
101
102 // Check if the type is present in the template for generic types
103
3/4
✓ Branch 0 (64→65) taken 10 times.
✗ Branch 1 (64→141) not taken.
✓ Branch 2 (65→66) taken 2 times.
✓ Branch 3 (65→73) taken 8 times.
10 if (!paramType.isCoveredByGenericTypeList(usedGenericTypes)) {
104
2/4
✓ Branch 0 (68→69) taken 2 times.
✗ Branch 1 (68→136) not taken.
✓ Branch 2 (69→70) taken 2 times.
✗ Branch 3 (69→134) not taken.
2 softError(node->paramTypeLst, GENERIC_TYPE_NOT_IN_TEMPLATE,
105 "Generic param type not included in the template type list of the function");
106 2 continue;
107 }
108
109
1/2
✓ Branch 0 (73→74) taken 8 times.
✗ Branch 1 (73→141) not taken.
8 paramTypes.push_back(paramType);
110
1/2
✓ Branch 0 (74→75) taken 8 times.
✗ Branch 1 (74→140) not taken.
8 paramList.push_back({paramType, false});
111 }
112 }
113
114 // Build signature object
115
4/8
✓ Branch 0 (80→81) taken 191 times.
✗ Branch 1 (80→150) not taken.
✓ Branch 2 (81→82) taken 191 times.
✗ Branch 3 (81→147) not taken.
✓ Branch 4 (82→83) taken 191 times.
✗ Branch 5 (82→144) not taken.
✓ Branch 6 (83→84) taken 191 times.
✗ Branch 7 (83→143) not taken.
191 const Function signature(node->methodName, nullptr, QualType(TY_DYN), returnType, paramList, usedGenericTypes, node);
116
117 // Add signature to current scope
118
1/2
✓ Branch 0 (88→89) taken 191 times.
✗ Branch 1 (88→153) not taken.
191 Function *manifestation = FunctionManager::insert(currentScope, signature, &node->signatureManifestations);
119 191 manifestation->entry = node->entry;
120 191 manifestation->used = true;
121
122 // Prepare signature type
123
2/2
✓ Branch 0 (89→90) taken 149 times.
✓ Branch 1 (89→91) taken 42 times.
191 const SuperType superType = isFunction ? TY_FUNCTION : TY_PROCEDURE;
124
2/4
✓ Branch 0 (92→93) taken 191 times.
✗ Branch 1 (92→151) not taken.
✓ Branch 2 (93→94) taken 191 times.
✗ Branch 3 (93→151) not taken.
191 QualType signatureType = QualType(superType).getWithFunctionParamAndReturnTypes(returnType, paramTypes);
125 191 signatureType.setQualifiers(node->signatureQualifiers);
126
127 // Set entry to signature type
128
1/2
✗ Branch 0 (95→96) not taken.
✓ Branch 1 (95→97) taken 191 times.
191 assert(node->entry != nullptr);
129
1/2
✓ Branch 0 (97→98) taken 191 times.
✗ Branch 1 (97→153) not taken.
191 node->entry->updateType(signatureType, false);
130 191 node->entry->used = true;
131
132
1/2
✓ Branch 0 (98→99) taken 191 times.
✗ Branch 1 (98→152) not taken.
191 return &node->signatureManifestations;
133 192 }
134
135 49956 std::any TypeChecker::visitDataType(DataTypeNode *node) {
136 // Visit base data type
137
2/4
✓ Branch 0 (2→3) taken 49956 times.
✗ Branch 1 (2→219) not taken.
✓ Branch 2 (3→4) taken 49956 times.
✗ Branch 3 (3→217) not taken.
49956 auto type = std::any_cast<QualType>(visit(node->baseDataType));
138
4/6
✓ Branch 0 (5→6) taken 49956 times.
✗ Branch 1 (5→320) not taken.
✓ Branch 2 (6→7) taken 3 times.
✓ Branch 3 (6→9) taken 49953 times.
✓ Branch 4 (7→8) taken 3 times.
✗ Branch 5 (7→320) not taken.
49956 HANDLE_UNRESOLVED_TYPE_QT(type)
139
140
1/2
✓ Branch 0 (9→10) taken 49953 times.
✗ Branch 1 (9→320) not taken.
49953 std::queue<DataTypeNode::TypeModifier> tmQueue = node->tmQueue;
141
2/2
✓ Branch 0 (108→11) taken 12356 times.
✓ Branch 1 (108→109) taken 49945 times.
62301 while (!tmQueue.empty()) {
142
1/2
✓ Branch 0 (12→13) taken 12356 times.
✗ Branch 1 (12→269) not taken.
12356 auto [modifierType, hasSize, hardcodedSize, sizeVarName] = tmQueue.front();
143
144 // Only the outermost array can have an unknown size
145
8/10
✓ Branch 0 (13→14) taken 12356 times.
✗ Branch 1 (13→267) not taken.
✓ Branch 2 (14→15) taken 42 times.
✓ Branch 3 (14→18) taken 12314 times.
✓ Branch 4 (15→16) taken 42 times.
✗ Branch 5 (15→267) not taken.
✓ Branch 6 (16→17) taken 2 times.
✓ Branch 7 (16→18) taken 40 times.
✓ Branch 8 (19→20) taken 2 times.
✓ Branch 9 (19→30) taken 12354 times.
12356 if (type.isArray() && type.getArraySize() == ARRAY_SIZE_UNKNOWN)
146
4/8
✓ Branch 0 (22→23) taken 2 times.
✗ Branch 1 (22→222) not taken.
✓ Branch 2 (23→24) taken 2 times.
✗ Branch 3 (23→220) not taken.
✓ Branch 4 (26→27) taken 2 times.
✗ Branch 5 (26→226) not taken.
✓ Branch 6 (27→28) taken 2 times.
✗ Branch 7 (27→226) not taken.
6 SOFT_ERROR_QT(node, ARRAY_SIZE_INVALID,
147 "Usage of incomplete array type. Only the outermost array type may have unknown size")
148
149
3/4
✓ Branch 0 (30→31) taken 5375 times.
✓ Branch 1 (30→33) taken 6829 times.
✓ Branch 2 (30→35) taken 150 times.
✗ Branch 3 (30→92) not taken.
12354 switch (modifierType) {
150 5375 case DataTypeNode::TypeModifierType::TYPE_PTR: {
151
2/2
✓ Branch 0 (31→32) taken 5373 times.
✓ Branch 1 (31→227) taken 2 times.
5375 type = type.toPtr(node);
152 5373 break;
153 }
154 6829 case DataTypeNode::TypeModifierType::TYPE_REF: {
155
1/2
✓ Branch 0 (33→34) taken 6829 times.
✗ Branch 1 (33→228) not taken.
6829 type = type.toRef(node);
156 6829 break;
157 }
158 150 case DataTypeNode::TypeModifierType::TYPE_ARRAY: {
159 150 const std::string &varName = sizeVarName;
160
2/2
✓ Branch 0 (36→37) taken 35 times.
✓ Branch 1 (36→78) taken 115 times.
150 if (!varName.empty()) {
161
1/2
✓ Branch 0 (37→38) taken 35 times.
✗ Branch 1 (37→267) not taken.
35 const SymbolTableEntry *globalVar = rootScope->lookupStrict(varName);
162
2/2
✓ Branch 0 (40→41) taken 1 times.
✓ Branch 1 (40→50) taken 34 times.
35 if (!globalVar)
163
5/10
✓ Branch 0 (41→42) taken 1 times.
✗ Branch 1 (41→233) not taken.
✓ Branch 2 (42→43) taken 1 times.
✗ Branch 3 (42→231) not taken.
✓ Branch 4 (43→44) taken 1 times.
✗ Branch 5 (43→229) not taken.
✓ Branch 6 (46→47) taken 1 times.
✗ Branch 7 (46→235) not taken.
✓ Branch 8 (47→48) taken 1 times.
✗ Branch 9 (47→235) not taken.
1 SOFT_ERROR_QT(node, REFERENCED_UNDEFINED_VARIABLE, "Could not find global variable '" + varName + "' ")
164
4/6
✓ Branch 0 (50→51) taken 34 times.
✗ Branch 1 (50→267) not taken.
✓ Branch 2 (51→52) taken 34 times.
✗ Branch 3 (51→267) not taken.
✓ Branch 4 (52→53) taken 1 times.
✓ Branch 5 (52→63) taken 33 times.
34 if (!globalVar->getQualType().isConst())
165
4/8
✓ Branch 0 (55→56) taken 1 times.
✗ Branch 1 (55→238) not taken.
✓ Branch 2 (56→57) taken 1 times.
✗ Branch 3 (56→236) not taken.
✓ Branch 4 (59→60) taken 1 times.
✗ Branch 5 (59→242) not taken.
✓ Branch 6 (60→61) taken 1 times.
✗ Branch 7 (60→242) not taken.
3 SOFT_ERROR_QT(node, EXPECTED_CONST_VARIABLE, "The size of the array must be known at compile time")
166
4/6
✓ Branch 0 (63→64) taken 33 times.
✗ Branch 1 (63→267) not taken.
✓ Branch 2 (64→65) taken 33 times.
✗ Branch 3 (64→267) not taken.
✓ Branch 4 (65→66) taken 1 times.
✓ Branch 5 (65→76) taken 32 times.
33 if (!globalVar->getQualType().is(TY_INT))
167
4/8
✓ Branch 0 (68→69) taken 1 times.
✗ Branch 1 (68→245) not taken.
✓ Branch 2 (69→70) taken 1 times.
✗ Branch 3 (69→243) not taken.
✓ Branch 4 (72→73) taken 1 times.
✗ Branch 5 (72→249) not taken.
✓ Branch 6 (73→74) taken 1 times.
✗ Branch 7 (73→249) not taken.
3 SOFT_ERROR_QT(node, OPERATOR_WRONG_DATA_TYPE, "Expected variable of type int")
168
1/2
✓ Branch 0 (76→77) taken 32 times.
✗ Branch 1 (76→267) not taken.
32 hardcodedSize = globalVar->declNode->getCompileTimeValue().intValue;
169 }
170
171
3/4
✓ Branch 0 (78→79) taken 91 times.
✓ Branch 1 (78→90) taken 56 times.
✗ Branch 2 (79→80) not taken.
✓ Branch 3 (79→90) taken 91 times.
147 if (hasSize && hardcodedSize <= 1)
172 SOFT_ERROR_QT(node, ARRAY_SIZE_INVALID, "The size of an array must be > 1 and explicitly stated")
173
2/2
✓ Branch 0 (90→91) taken 146 times.
✓ Branch 1 (90→257) taken 1 times.
147 type = type.toArr(node, hardcodedSize);
174 146 break;
175 }
176 default: // GCOV_EXCL_LINE
177 throw CompilerError(UNHANDLED_BRANCH, "Modifier type fall-through"); // GCOV_EXCL_LINE
178 }
179 12348 tmQueue.pop();
180
2/2
✓ Branch 0 (103→104) taken 12348 times.
✓ Branch 1 (103→106) taken 5 times.
12356 }
181
182 // Attach the qualifiers to the type
183
2/2
✓ Branch 0 (109→110) taken 20995 times.
✓ Branch 1 (109→210) taken 28950 times.
49945 if (node->qualifierLst) {
184
1/2
✓ Branch 0 (110→111) taken 20995 times.
✗ Branch 1 (110→316) not taken.
20995 const QualType baseType = type.getBase();
185
2/2
✓ Branch 0 (207→113) taken 24612 times.
✓ Branch 1 (207→208) taken 20993 times.
45605 for (const QualifierNode *qualifier : node->qualifierLst->qualifiers) {
186
2/2
✓ Branch 0 (114→115) taken 9937 times.
✓ Branch 1 (114→117) taken 14675 times.
24612 if (qualifier->type == QualifierNode::QualifierType::TY_CONST) {
187 9937 type.getQualifiers().isConst = true;
188
2/2
✓ Branch 0 (117→118) taken 2 times.
✓ Branch 1 (117→132) taken 14673 times.
14675 } else if (qualifier->type == QualifierNode::QualifierType::TY_SIGNED) {
189
2/4
✓ Branch 0 (118→119) taken 2 times.
✗ Branch 1 (118→270) not taken.
✗ Branch 2 (119→120) not taken.
✓ Branch 3 (119→129) taken 2 times.
2 if (!baseType.isOneOf({TY_INT, TY_LONG, TY_SHORT, TY_BYTE, TY_CHAR, TY_GENERIC}))
190 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT, "Cannot use this qualifier on type " + baseType.getName(false))
191 2 type.getQualifiers().isSigned = true;
192 2 type.getQualifiers().isUnsigned = false;
193
2/2
✓ Branch 0 (132→133) taken 10212 times.
✓ Branch 1 (132→147) taken 4461 times.
14673 } else if (qualifier->type == QualifierNode::QualifierType::TY_UNSIGNED) {
194
2/4
✓ Branch 0 (133→134) taken 10212 times.
✗ Branch 1 (133→278) not taken.
✗ Branch 2 (134→135) not taken.
✓ Branch 3 (134→144) taken 10212 times.
10212 if (!baseType.isOneOf({TY_INT, TY_LONG, TY_SHORT, TY_BYTE, TY_CHAR, TY_GENERIC}))
195 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT, "Cannot use this qualifier on type " + baseType.getName(false))
196 10212 type.getQualifiers().isSigned = false;
197 10212 type.getQualifiers().isUnsigned = true;
198
2/2
✓ Branch 0 (147→148) taken 3615 times.
✓ Branch 1 (147→162) taken 846 times.
4461 } else if (qualifier->type == QualifierNode::QualifierType::TY_HEAP) {
199 // Heap variables can only be pointers
200
4/6
✓ Branch 0 (148→149) taken 3615 times.
✗ Branch 1 (148→287) not taken.
✓ Branch 2 (149→150) taken 3615 times.
✗ Branch 3 (149→286) not taken.
✓ Branch 4 (150→151) taken 1 times.
✓ Branch 5 (150→160) taken 3614 times.
3615 if (!type.removeReferenceWrapper().isOneOf({TY_PTR, TY_ARRAY, TY_STRING}))
201
5/10
✓ Branch 0 (151→152) taken 1 times.
✗ Branch 1 (151→292) not taken.
✓ Branch 2 (152→153) taken 1 times.
✗ Branch 3 (152→290) not taken.
✓ Branch 4 (153→154) taken 1 times.
✗ Branch 5 (153→288) not taken.
✓ Branch 6 (156→157) taken 1 times.
✗ Branch 7 (156→294) not taken.
✓ Branch 8 (157→158) taken 1 times.
✗ Branch 9 (157→294) not taken.
1 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT,
202 "The heap qualifier can only be applied to symbols of pointer type, you provided " +
203 baseType.getName(false))
204
205 3614 type.getQualifiers().isHeap = true;
206
3/4
✓ Branch 0 (162→163) taken 7 times.
✓ Branch 1 (162→178) taken 839 times.
✓ Branch 2 (163→164) taken 7 times.
✗ Branch 3 (163→178) not taken.
846 } else if (qualifier->type == QualifierNode::QualifierType::TY_COMPOSITION && node->isFieldType) {
207
3/4
✓ Branch 0 (164→165) taken 7 times.
✗ Branch 1 (164→315) not taken.
✓ Branch 2 (165→166) taken 1 times.
✓ Branch 3 (165→176) taken 6 times.
7 if (!type.is(TY_STRUCT))
208
4/8
✓ Branch 0 (168→169) taken 1 times.
✗ Branch 1 (168→297) not taken.
✓ Branch 2 (169→170) taken 1 times.
✗ Branch 3 (169→295) not taken.
✓ Branch 4 (172→173) taken 1 times.
✗ Branch 5 (172→301) not taken.
✓ Branch 6 (173→174) taken 1 times.
✗ Branch 7 (173→301) not taken.
3 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT, "The compose qualifier can only be used on plain struct fields")
209 6 type.getQualifiers().isComposition = true;
210
4/6
✓ Branch 0 (178→179) taken 839 times.
✗ Branch 1 (178→183) not taken.
✓ Branch 2 (179→180) taken 631 times.
✓ Branch 3 (179→181) taken 208 times.
✓ Branch 4 (180→181) taken 631 times.
✗ Branch 5 (180→183) not taken.
839 } else if (qualifier->type == QualifierNode::QualifierType::TY_PUBLIC && (node->isFieldType || node->isGlobalType)) {
211 839 type.getQualifiers().isPublic = true;
212 } else {
213 auto entryName = "local variable";
214 if (node->isGlobalType)
215 entryName = "global variable";
216 else if (node->isFieldType)
217 entryName = "field";
218 else if (node->isParamType)
219 entryName = "param";
220 else if (node->isReturnType)
221 entryName = "return variable";
222 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT,
223 "Cannot use this qualifier on a " + std::string(entryName) + " definition")
224 }
225 }
226 }
227
228
2/4
✓ Branch 0 (210→211) taken 49943 times.
✗ Branch 1 (210→317) not taken.
✓ Branch 2 (211→212) taken 49943 times.
✗ Branch 3 (211→317) not taken.
49943 return node->setEvaluatedSymbolType(type, manIdx);
229 49953 }
230
231 49956 std::any TypeChecker::visitBaseDataType(BaseDataTypeNode *node) {
232
11/11
✓ Branch 0 (2→3) taken 328 times.
✓ Branch 1 (2→8) taken 2857 times.
✓ Branch 2 (2→13) taken 712 times.
✓ Branch 3 (2→18) taken 9332 times.
✓ Branch 4 (2→23) taken 1917 times.
✓ Branch 5 (2→28) taken 7068 times.
✓ Branch 6 (2→33) taken 6330 times.
✓ Branch 7 (2→38) taken 3343 times.
✓ Branch 8 (2→43) taken 17575 times.
✓ Branch 9 (2→55) taken 112 times.
✓ Branch 10 (2→67) taken 382 times.
49956 switch (node->type) {
233 328 case BaseDataTypeNode::Type::TYPE_DOUBLE:
234
3/6
✓ Branch 0 (3→4) taken 328 times.
✗ Branch 1 (3→73) not taken.
✓ Branch 2 (4→5) taken 328 times.
✗ Branch 3 (4→73) not taken.
✓ Branch 4 (5→6) taken 328 times.
✗ Branch 5 (5→73) not taken.
328 return node->setEvaluatedSymbolType(QualType(TY_DOUBLE), manIdx);
235 2857 case BaseDataTypeNode::Type::TYPE_INT:
236
3/6
✓ Branch 0 (8→9) taken 2857 times.
✗ Branch 1 (8→75) not taken.
✓ Branch 2 (9→10) taken 2857 times.
✗ Branch 3 (9→75) not taken.
✓ Branch 4 (10→11) taken 2857 times.
✗ Branch 5 (10→75) not taken.
2857 return node->setEvaluatedSymbolType(QualType(TY_INT), manIdx);
237 712 case BaseDataTypeNode::Type::TYPE_SHORT:
238
3/6
✓ Branch 0 (13→14) taken 712 times.
✗ Branch 1 (13→77) not taken.
✓ Branch 2 (14→15) taken 712 times.
✗ Branch 3 (14→77) not taken.
✓ Branch 4 (15→16) taken 712 times.
✗ Branch 5 (15→77) not taken.
712 return node->setEvaluatedSymbolType(QualType(TY_SHORT), manIdx);
239 9332 case BaseDataTypeNode::Type::TYPE_LONG:
240
3/6
✓ Branch 0 (18→19) taken 9332 times.
✗ Branch 1 (18→79) not taken.
✓ Branch 2 (19→20) taken 9332 times.
✗ Branch 3 (19→79) not taken.
✓ Branch 4 (20→21) taken 9332 times.
✗ Branch 5 (20→79) not taken.
9332 return node->setEvaluatedSymbolType(QualType(TY_LONG), manIdx);
241 1917 case BaseDataTypeNode::Type::TYPE_BYTE:
242
3/6
✓ Branch 0 (23→24) taken 1917 times.
✗ Branch 1 (23→81) not taken.
✓ Branch 2 (24→25) taken 1917 times.
✗ Branch 3 (24→81) not taken.
✓ Branch 4 (25→26) taken 1917 times.
✗ Branch 5 (25→81) not taken.
1917 return node->setEvaluatedSymbolType(QualType(TY_BYTE), manIdx);
243 7068 case BaseDataTypeNode::Type::TYPE_CHAR:
244
3/6
✓ Branch 0 (28→29) taken 7068 times.
✗ Branch 1 (28→83) not taken.
✓ Branch 2 (29→30) taken 7068 times.
✗ Branch 3 (29→83) not taken.
✓ Branch 4 (30→31) taken 7068 times.
✗ Branch 5 (30→83) not taken.
7068 return node->setEvaluatedSymbolType(QualType(TY_CHAR), manIdx);
245 6330 case BaseDataTypeNode::Type::TYPE_STRING:
246
3/6
✓ Branch 0 (33→34) taken 6330 times.
✗ Branch 1 (33→85) not taken.
✓ Branch 2 (34→35) taken 6330 times.
✗ Branch 3 (34→85) not taken.
✓ Branch 4 (35→36) taken 6330 times.
✗ Branch 5 (35→85) not taken.
6330 return node->setEvaluatedSymbolType(QualType(TY_STRING), manIdx);
247 3343 case BaseDataTypeNode::Type::TYPE_BOOL:
248
3/6
✓ Branch 0 (38→39) taken 3343 times.
✗ Branch 1 (38→87) not taken.
✓ Branch 2 (39→40) taken 3343 times.
✗ Branch 3 (39→87) not taken.
✓ Branch 4 (40→41) taken 3343 times.
✗ Branch 5 (40→87) not taken.
3343 return node->setEvaluatedSymbolType(QualType(TY_BOOL), manIdx);
249 17575 case BaseDataTypeNode::Type::TYPE_CUSTOM: {
250
2/4
✓ Branch 0 (43→44) taken 17575 times.
✗ Branch 1 (43→91) not taken.
✓ Branch 2 (44→45) taken 17575 times.
✗ Branch 3 (44→89) not taken.
17575 const auto customType = std::any_cast<QualType>(visit(node->customDataType));
251
4/6
✓ Branch 0 (46→47) taken 17575 times.
✗ Branch 1 (46→93) not taken.
✓ Branch 2 (47→48) taken 3 times.
✓ Branch 3 (47→50) taken 17572 times.
✓ Branch 4 (48→49) taken 3 times.
✗ Branch 5 (48→93) not taken.
17575 HANDLE_UNRESOLVED_TYPE_QT(customType)
252
2/4
✓ Branch 0 (50→51) taken 17572 times.
✗ Branch 1 (50→92) not taken.
✓ Branch 2 (51→52) taken 17572 times.
✗ Branch 3 (51→92) not taken.
17572 return node->setEvaluatedSymbolType(customType, manIdx);
253 }
254 112 case BaseDataTypeNode::Type::TYPE_FUNCTION: {
255
2/4
✓ Branch 0 (55→56) taken 112 times.
✗ Branch 1 (55→96) not taken.
✓ Branch 2 (56→57) taken 112 times.
✗ Branch 3 (56→94) not taken.
112 const auto functionType = std::any_cast<QualType>(visit(node->functionDataType));
256
2/6
✓ Branch 0 (58→59) taken 112 times.
✗ Branch 1 (58→98) not taken.
✗ Branch 2 (59→60) not taken.
✓ Branch 3 (59→62) taken 112 times.
✗ Branch 4 (60→61) not taken.
✗ Branch 5 (60→98) not taken.
112 HANDLE_UNRESOLVED_TYPE_QT(functionType)
257
2/4
✓ Branch 0 (62→63) taken 112 times.
✗ Branch 1 (62→97) not taken.
✓ Branch 2 (63→64) taken 112 times.
✗ Branch 3 (63→97) not taken.
112 return node->setEvaluatedSymbolType(functionType, manIdx);
258 }
259 382 default:
260
3/6
✓ Branch 0 (67→68) taken 382 times.
✗ Branch 1 (67→99) not taken.
✓ Branch 2 (68→69) taken 382 times.
✗ Branch 3 (68→99) not taken.
✓ Branch 4 (69→70) taken 382 times.
✗ Branch 5 (69→99) not taken.
382 return node->setEvaluatedSymbolType(QualType(TY_DYN), manIdx);
261 }
262 }
263
264 17575 std::any TypeChecker::visitCustomDataType(CustomDataTypeNode *node) {
265 // It is a struct type -> get the access scope
266
1/2
✓ Branch 0 (3→4) taken 17575 times.
✗ Branch 1 (3→241) not taken.
17575 const std::string firstFragment = node->typeNameFragments.front();
267
268 // Check this type requires a runtime module
269
2/2
✓ Branch 0 (5→6) taken 17549 times.
✓ Branch 1 (5→7) taken 26 times.
17575 if (node->typeNameFragments.size() == 1)
270
1/2
✓ Branch 0 (6→7) taken 17549 times.
✗ Branch 1 (6→239) not taken.
17549 ensureLoadedRuntimeForTypeName(firstFragment);
271
272 // A type can either be a single fragment like "Test" or multiple fragments "a.b.Test", which means it is imported.
273 17575 bool isImported = node->typeNameFragments.size() > 1;
274
3/4
✓ Branch 0 (8→9) taken 17575 times.
✗ Branch 1 (8→239) not taken.
✓ Branch 2 (9→10) taken 8375 times.
✓ Branch 3 (9→25) taken 9200 times.
17575 if (const QualType *genericType = rootScope->lookupGenericTypeStrict(firstFragment)) {
275
1/2
✗ Branch 0 (10→11) not taken.
✓ Branch 1 (10→12) taken 8375 times.
8375 assert(!isImported);
276 // Take the concrete replacement type for the name of this generic type if available
277
4/6
✓ Branch 0 (12→13) taken 8375 times.
✗ Branch 1 (12→239) not taken.
✓ Branch 2 (13→14) taken 1907 times.
✓ Branch 3 (13→16) taken 6468 times.
✓ Branch 4 (14→15) taken 1907 times.
✗ Branch 5 (14→239) not taken.
8375 const QualType &symbolType = typeMapping.contains(firstFragment) ? typeMapping.at(firstFragment) : *genericType;
278
279 // Check if the replacement requires a runtime module
280
3/4
✓ Branch 0 (17→18) taken 8375 times.
✗ Branch 1 (17→239) not taken.
✓ Branch 2 (18→19) taken 556 times.
✓ Branch 3 (18→21) taken 7819 times.
8375 if (symbolType.is(TY_STRUCT))
281
2/4
✓ Branch 0 (19→20) taken 556 times.
✗ Branch 1 (19→239) not taken.
✓ Branch 2 (20→21) taken 556 times.
✗ Branch 3 (20→239) not taken.
556 ensureLoadedRuntimeForTypeName(symbolType.getSubType());
282
283
2/4
✓ Branch 0 (21→22) taken 8375 times.
✗ Branch 1 (21→181) not taken.
✓ Branch 2 (22→23) taken 8375 times.
✗ Branch 3 (22→181) not taken.
8375 return node->setEvaluatedSymbolType(symbolType, manIdx);
284 }
285
286 // Check if the type exists in the exported names registry
287
1/2
✓ Branch 0 (25→26) taken 9200 times.
✗ Branch 1 (25→239) not taken.
9200 const NameRegistryEntry *registryEntry = sourceFile->getNameRegistryEntry(node->fqTypeName);
288
2/2
✓ Branch 0 (26→27) taken 2 times.
✓ Branch 1 (26→36) taken 9198 times.
9200 if (!registryEntry)
289
5/10
✓ Branch 0 (27→28) taken 2 times.
✗ Branch 1 (27→186) not taken.
✓ Branch 2 (28→29) taken 2 times.
✗ Branch 3 (28→184) not taken.
✓ Branch 4 (29→30) taken 2 times.
✗ Branch 5 (29→182) not taken.
✓ Branch 6 (32→33) taken 2 times.
✗ Branch 7 (32→188) not taken.
✓ Branch 8 (33→34) taken 2 times.
✗ Branch 9 (33→188) not taken.
2 SOFT_ERROR_QT(node, UNKNOWN_DATATYPE, "Unknown datatype '" + node->fqTypeName + "'")
290
2/4
✓ Branch 0 (36→37) taken 9198 times.
✗ Branch 1 (36→39) not taken.
✓ Branch 2 (37→38) taken 9198 times.
✗ Branch 3 (37→39) not taken.
9198 assert(registryEntry->targetEntry != nullptr && registryEntry->targetScope != nullptr);
291 9198 SymbolTableEntry *entry = registryEntry->targetEntry;
292
1/2
✗ Branch 0 (40→41) not taken.
✓ Branch 1 (40→42) taken 9198 times.
9198 assert(entry != nullptr);
293 9198 entry->used = true;
294 9198 Scope *defScope = registryEntry->targetScope->parent;
295
1/2
✓ Branch 0 (42→43) taken 9198 times.
✗ Branch 1 (42→239) not taken.
9198 QualType entryType = entry->getQualType();
296
297 // Enums can early-return
298
3/4
✓ Branch 0 (43→44) taken 9198 times.
✗ Branch 1 (43→239) not taken.
✓ Branch 2 (44→45) taken 112 times.
✓ Branch 3 (44→49) taken 9086 times.
9198 if (entryType.is(TY_ENUM))
299
2/4
✓ Branch 0 (45→46) taken 112 times.
✗ Branch 1 (45→189) not taken.
✓ Branch 2 (46→47) taken 112 times.
✗ Branch 3 (46→189) not taken.
224 return QualType(TY_INT);
300
301
3/4
✓ Branch 0 (49→50) taken 9086 times.
✗ Branch 1 (49→190) not taken.
✓ Branch 2 (50→51) taken 8167 times.
✓ Branch 3 (50→153) taken 919 times.
9086 if (entryType.isOneOf({TY_STRUCT, TY_INTERFACE})) {
302
2/4
✓ Branch 0 (51→52) taken 8167 times.
✗ Branch 1 (51→53) not taken.
✗ Branch 2 (54→55) not taken.
✓ Branch 3 (54→56) taken 8167 times.
8167 assert(dynamic_cast<DataTypeNode *>(node->parent->parent) != nullptr);
303
304 // Collect the concrete template types
305 8167 bool allTemplateTypesConcrete = true;
306 8167 QualTypeList templateTypes;
307
2/2
✓ Branch 0 (56→57) taken 2012 times.
✓ Branch 1 (56→89) taken 6155 times.
8167 if (node->templateTypeLst) {
308
1/2
✗ Branch 0 (57→58) not taken.
✓ Branch 1 (57→59) taken 2012 times.
2012 assert(defScope != nullptr);
309
1/2
✓ Branch 0 (59→60) taken 2012 times.
✗ Branch 1 (59→221) not taken.
2012 isImported = defScope->isImportedBy(rootScope);
310
311
1/2
✓ Branch 0 (61→62) taken 2012 times.
✗ Branch 1 (61→221) not taken.
2012 templateTypes.reserve(node->templateTypeLst->dataTypes.size());
312
2/2
✓ Branch 0 (86→64) taken 2649 times.
✓ Branch 1 (86→87) taken 2012 times.
4661 for (DataTypeNode *dataType : node->templateTypeLst->dataTypes) {
313
2/4
✓ Branch 0 (65→66) taken 2649 times.
✗ Branch 1 (65→193) not taken.
✓ Branch 2 (66→67) taken 2649 times.
✗ Branch 3 (66→191) not taken.
2649 auto templateType = std::any_cast<QualType>(visit(dataType));
314
2/6
✓ Branch 0 (68→69) taken 2649 times.
✗ Branch 1 (68→195) not taken.
✗ Branch 2 (69→70) not taken.
✓ Branch 3 (69→72) taken 2649 times.
✗ Branch 4 (70→71) not taken.
✗ Branch 5 (70→195) not taken.
2649 HANDLE_UNRESOLVED_TYPE_QT(templateType)
315
2/4
✓ Branch 0 (72→73) taken 2649 times.
✗ Branch 1 (72→195) not taken.
✗ Branch 2 (73→74) not taken.
✓ Branch 3 (73→75) taken 2649 times.
2649 if (entryType.is(TY_GENERIC)) {
316 allTemplateTypesConcrete = false;
317
2/2
✓ Branch 0 (75→76) taken 931 times.
✓ Branch 1 (75→82) taken 1718 times.
2649 } else if (isImported) {
318 // Introduce the local type to the imported source file
319
1/2
✓ Branch 0 (76→77) taken 931 times.
✗ Branch 1 (76→194) not taken.
931 [[maybe_unused]] QualType importedType = mapLocalTypeToImportedScopeType(defScope, templateType);
320
3/6
✓ Branch 0 (77→78) taken 931 times.
✗ Branch 1 (77→194) not taken.
✓ Branch 2 (78→79) taken 931 times.
✗ Branch 3 (78→194) not taken.
✗ Branch 4 (79→80) not taken.
✓ Branch 5 (79→81) taken 931 times.
931 assert(importedType.is(templateType.getSuperType()));
321 }
322
1/2
✓ Branch 0 (82→83) taken 2649 times.
✗ Branch 1 (82→195) not taken.
2649 templateTypes.push_back(templateType);
323 }
324
1/2
✓ Branch 0 (87→88) taken 2012 times.
✗ Branch 1 (87→197) not taken.
2012 entryType = entryType.getWithTemplateTypes(templateTypes);
325 }
326
327 // Check if struct is defined before the current code location, if defined in the same source file
328 8167 const CodeLoc &declCodeLoc = entry->declNode->codeLoc;
329 8167 const CodeLoc &codeLoc = node->codeLoc;
330
6/6
✓ Branch 0 (90→91) taken 6502 times.
✓ Branch 1 (90→98) taken 1665 times.
✓ Branch 2 (96→97) taken 1 times.
✓ Branch 3 (96→98) taken 6501 times.
✓ Branch 4 (99→100) taken 1 times.
✓ Branch 5 (99→125) taken 8166 times.
14669 if (declCodeLoc.sourceFile->filePath == codeLoc.sourceFile->filePath && declCodeLoc > codeLoc) {
331
2/4
✓ Branch 0 (100→101) taken 1 times.
✗ Branch 1 (100→221) not taken.
✓ Branch 2 (101→102) taken 1 times.
✗ Branch 3 (101→112) not taken.
1 if (entryType.is(TY_STRUCT)) {
332
4/8
✓ Branch 0 (104→105) taken 1 times.
✗ Branch 1 (104→200) not taken.
✓ Branch 2 (105→106) taken 1 times.
✗ Branch 3 (105→198) not taken.
✓ Branch 4 (108→109) taken 1 times.
✗ Branch 5 (108→204) not taken.
✓ Branch 6 (109→110) taken 1 times.
✗ Branch 7 (109→204) not taken.
3 SOFT_ERROR_QT(node, REFERENCED_UNDEFINED_STRUCT, "Structs must be defined before usage")
333 } else {
334 assert(entryType.is(TY_INTERFACE));
335 SOFT_ERROR_QT(node, REFERENCED_UNDEFINED_INTERFACE, "Interfaces must be defined before usage")
336 }
337 }
338
339
1/2
✓ Branch 0 (125→126) taken 8166 times.
✗ Branch 1 (125→147) not taken.
8166 if (allTemplateTypesConcrete) { // Only do the next step, if we have concrete template types
340 // Set the struct/interface instance to used, if found
341 // Here, it is allowed to accept, that the struct/interface cannot be found, because there are self-referencing ones
342
3/4
✓ Branch 0 (126→127) taken 8166 times.
✗ Branch 1 (126→221) not taken.
✓ Branch 2 (127→128) taken 8008 times.
✓ Branch 3 (127→136) taken 158 times.
8166 if (entryType.is(TY_STRUCT)) {
343
1/2
✓ Branch 0 (129→130) taken 8008 times.
✗ Branch 1 (129→215) not taken.
8008 const std::string structName = node->typeNameFragments.back();
344
3/4
✓ Branch 0 (130→131) taken 8008 times.
✗ Branch 1 (130→213) not taken.
✓ Branch 2 (131→132) taken 7972 times.
✓ Branch 3 (131→134) taken 36 times.
8008 if (const Struct *spiceStruct = StructManager::match(defScope, structName, templateTypes, node))
345
1/2
✓ Branch 0 (132→133) taken 7972 times.
✗ Branch 1 (132→212) not taken.
7972 entryType = entryType.getWithBodyScope(spiceStruct->scope);
346 8008 } else {
347
2/4
✓ Branch 0 (136→137) taken 158 times.
✗ Branch 1 (136→219) not taken.
✗ Branch 2 (137→138) not taken.
✓ Branch 3 (137→139) taken 158 times.
158 assert(entryType.is(TY_INTERFACE));
348
1/2
✓ Branch 0 (140→141) taken 158 times.
✗ Branch 1 (140→219) not taken.
158 const std::string interfaceName = node->typeNameFragments.back();
349
2/4
✓ Branch 0 (141→142) taken 158 times.
✗ Branch 1 (141→217) not taken.
✓ Branch 2 (142→143) taken 158 times.
✗ Branch 3 (142→145) not taken.
158 if (const Interface *spiceInterface = InterfaceManager::match(defScope, interfaceName, templateTypes, node))
350
1/2
✓ Branch 0 (143→144) taken 158 times.
✗ Branch 1 (143→216) not taken.
158 entryType = entryType.getWithBodyScope(spiceInterface->scope);
351 158 }
352 }
353
354
2/4
✓ Branch 0 (147→148) taken 8166 times.
✗ Branch 1 (147→220) not taken.
✓ Branch 2 (148→149) taken 8166 times.
✗ Branch 3 (148→220) not taken.
8166 return node->setEvaluatedSymbolType(entryType, manIdx);
355 8167 }
356
357
2/4
✓ Branch 0 (153→154) taken 919 times.
✗ Branch 1 (153→239) not taken.
✓ Branch 2 (154→155) taken 919 times.
✗ Branch 3 (154→160) not taken.
919 if (entryType.is(TY_ALIAS))
358
3/6
✓ Branch 0 (155→156) taken 919 times.
✗ Branch 1 (155→224) not taken.
✓ Branch 2 (156→157) taken 919 times.
✗ Branch 3 (156→224) not taken.
✓ Branch 4 (157→158) taken 919 times.
✗ Branch 5 (157→224) not taken.
919 return node->setEvaluatedSymbolType(entryType.getAliased(entry), manIdx);
359
360 // We tried everything to resolve it, but this type is still unknown
361 const bool isInvalid = entryType.is(TY_INVALID);
362 SOFT_ERROR_QT(node, EXPECTED_TYPE, isInvalid ? "Used type before declared" : "Expected type, but got " + entryType.getName())
363 17575 }
364
365 112 std::any TypeChecker::visitFunctionDataType(FunctionDataTypeNode *node) {
366 // Visit return type
367
1/2
✓ Branch 0 (2→3) taken 112 times.
✗ Branch 1 (2→72) not taken.
112 QualType returnType(TY_DYN);
368
2/2
✓ Branch 0 (3→4) taken 29 times.
✓ Branch 1 (3→23) taken 83 times.
112 if (node->isFunction) {
369
2/4
✓ Branch 0 (4→5) taken 29 times.
✗ Branch 1 (4→54) not taken.
✓ Branch 2 (5→6) taken 29 times.
✗ Branch 3 (5→52) not taken.
29 returnType = std::any_cast<QualType>(visit(node->returnType));
370
2/6
✓ Branch 0 (7→8) taken 29 times.
✗ Branch 1 (7→72) not taken.
✗ Branch 2 (8→9) not taken.
✓ Branch 3 (8→11) taken 29 times.
✗ Branch 4 (9→10) not taken.
✗ Branch 5 (9→72) not taken.
29 HANDLE_UNRESOLVED_TYPE_QT(returnType)
371
2/4
✓ Branch 0 (11→12) taken 29 times.
✗ Branch 1 (11→72) not taken.
✗ Branch 2 (12→13) not taken.
✓ Branch 3 (12→23) taken 29 times.
29 if (returnType.is(TY_DYN))
372 SOFT_ERROR_ER(node->returnType, UNEXPECTED_DYN_TYPE, "Function types cannot have return type dyn")
373 }
374
375 // Visit param types
376 112 QualTypeList paramTypes;
377
2/2
✓ Branch 0 (23→24) taken 67 times.
✓ Branch 1 (23→40) taken 45 times.
112 if (const TypeLstNode *paramTypeListNode = node->paramTypeLst; paramTypeListNode != nullptr) {
378
2/2
✓ Branch 0 (38→26) taken 80 times.
✓ Branch 1 (38→39) taken 67 times.
147 for (DataTypeNode *paramTypeNode : paramTypeListNode->dataTypes) {
379
2/4
✓ Branch 0 (27→28) taken 80 times.
✗ Branch 1 (27→65) not taken.
✓ Branch 2 (28→29) taken 80 times.
✗ Branch 3 (28→63) not taken.
80 auto paramType = std::any_cast<QualType>(visit(paramTypeNode));
380
2/6
✓ Branch 0 (30→31) taken 80 times.
✗ Branch 1 (30→66) not taken.
✗ Branch 2 (31→32) not taken.
✓ Branch 3 (31→34) taken 80 times.
✗ Branch 4 (32→33) not taken.
✗ Branch 5 (32→66) not taken.
80 HANDLE_UNRESOLVED_TYPE_QT(returnType)
381
1/2
✓ Branch 0 (34→35) taken 80 times.
✗ Branch 1 (34→66) not taken.
80 paramTypes.push_back(paramType);
382 }
383 }
384
385 // Build function type
386
2/2
✓ Branch 0 (40→41) taken 29 times.
✓ Branch 1 (40→42) taken 83 times.
112 const SuperType superType = node->isFunction ? TY_FUNCTION : TY_PROCEDURE;
387
2/4
✓ Branch 0 (43→44) taken 112 times.
✗ Branch 1 (43→68) not taken.
✓ Branch 2 (44→45) taken 112 times.
✗ Branch 3 (44→68) not taken.
112 const QualType functionType = QualType(superType).getWithFunctionParamAndReturnTypes(returnType, paramTypes);
388
389
2/4
✓ Branch 0 (45→46) taken 112 times.
✗ Branch 1 (45→69) not taken.
✓ Branch 2 (46→47) taken 112 times.
✗ Branch 3 (46→69) not taken.
112 return node->setEvaluatedSymbolType(functionType, manIdx);
390 112 }
391
392 } // namespace spice::compiler
393