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 |