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 | 14015 | std::any TypeChecker::visitParamLst(ParamLstNode *node) { | |
13 | 14015 | NamedParamList namedParams; | |
14 | 14015 | bool metOptional = false; | |
15 | |||
16 |
2/2✓ Branch 0 (32→4) taken 21833 times.
✓ Branch 1 (32→33) taken 14015 times.
|
35848 | for (DeclStmtNode *param : node->params) { |
17 | // Visit param | ||
18 |
2/4✓ Branch 0 (5→6) taken 21833 times.
✗ Branch 1 (5→40) not taken.
✓ Branch 2 (6→7) taken 21833 times.
✗ Branch 3 (6→38) not taken.
|
21833 | const auto paramType = std::any_cast<QualType>(visit(param)); |
19 | |||
20 | // Check if the type could be inferred. Dyn without a default value is forbidden | ||
21 |
3/4✓ Branch 0 (8→9) taken 21833 times.
✗ Branch 1 (8→54) not taken.
✓ Branch 2 (9→10) taken 3 times.
✓ Branch 3 (9→16) taken 21830 times.
|
21833 | if (paramType.is(TY_DYN)) { |
22 |
3/6✓ Branch 0 (10→11) taken 3 times.
✗ Branch 1 (10→45) not taken.
✓ Branch 2 (11→12) taken 3 times.
✗ Branch 3 (11→43) not taken.
✓ Branch 4 (12→13) taken 3 times.
✗ Branch 5 (12→41) not taken.
|
3 | softError(node, FCT_PARAM_IS_TYPE_DYN, "Type of parameter '" + param->varName + "' is invalid"); |
23 | 9 | continue; | |
24 | } | ||
25 | |||
26 | // Ensure that no optional param comes after a mandatory param | ||
27 |
2/2✓ Branch 0 (16→17) taken 2309 times.
✓ Branch 1 (16→18) taken 19521 times.
|
21830 | if (param->hasAssignment) { |
28 | 2309 | metOptional = true; | |
29 |
2/2✓ Branch 0 (18→19) taken 6 times.
✓ Branch 1 (18→26) taken 19515 times.
|
19521 | } else if (metOptional) { |
30 |
2/4✓ Branch 0 (21→22) taken 6 times.
✗ Branch 1 (21→49) not taken.
✓ Branch 2 (22→23) taken 6 times.
✗ Branch 3 (22→47) not taken.
|
6 | softError(param, INVALID_PARAM_ORDER, "Mandatory parameters must go before any optional parameters"); |
31 | 6 | continue; | |
32 | } | ||
33 | |||
34 | // Add parameter to named param list | ||
35 |
1/2✓ Branch 0 (27→28) taken 21824 times.
✗ Branch 1 (27→53) not taken.
|
21824 | namedParams.push_back({param->varName.c_str(), paramType, metOptional}); |
36 | } | ||
37 | |||
38 |
1/2✓ Branch 0 (33→34) taken 14015 times.
✗ Branch 1 (33→56) not taken.
|
28030 | return namedParams; |
39 | 14015 | } | |
40 | |||
41 | 1312 | std::any TypeChecker::visitField(FieldNode *node) { | |
42 |
2/4✓ Branch 0 (2→3) taken 1312 times.
✗ Branch 1 (2→37) not taken.
✓ Branch 2 (3→4) taken 1312 times.
✗ Branch 3 (3→35) not taken.
|
1312 | auto fieldType = std::any_cast<QualType>(visit(node->dataType)); |
43 |
4/6✓ Branch 0 (5→6) taken 1312 times.
✗ Branch 1 (5→50) not taken.
✓ Branch 2 (6→7) taken 1 times.
✓ Branch 3 (6→9) taken 1311 times.
✓ Branch 4 (7→8) taken 1 times.
✗ Branch 5 (7→50) not taken.
|
1312 | HANDLE_UNRESOLVED_TYPE_QT(fieldType) |
44 | |||
45 |
2/2✓ Branch 0 (9→10) taken 176 times.
✓ Branch 1 (9→31) taken 1135 times.
|
1311 | if (TernaryExprNode *defaultValueNode = node->defaultValue) { |
46 |
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; |
47 |
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) |
48 |
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)) |
49 |
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") |
50 | } | ||
51 | |||
52 |
1/2✓ Branch 0 (31→32) taken 1310 times.
✗ Branch 1 (31→50) not taken.
|
1310 | return fieldType; |
53 | } | ||
54 | |||
55 | 192 | std::any TypeChecker::visitSignature(SignatureNode *node) { | |
56 | 192 | const bool isFunction = node->signatureType == SignatureNode::SignatureType::TYPE_FUNCTION; | |
57 | |||
58 | // Retrieve function template types | ||
59 | 192 | std::vector<GenericType> usedGenericTypes; | |
60 |
2/2✓ Branch 0 (2→3) taken 96 times.
✓ Branch 1 (2→33) taken 96 times.
|
192 | if (node->hasTemplateTypes) { |
61 |
2/2✓ Branch 0 (31→5) taken 96 times.
✓ Branch 1 (31→32) taken 95 times.
|
191 | for (DataTypeNode *dataType : node->templateTypeLst->dataTypes) { |
62 | // Visit template type | ||
63 |
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)); |
64 |
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)) |
65 | ✗ | return static_cast<std::vector<Function *> *>(nullptr); | |
66 | // Check if it is a generic type | ||
67 |
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)) { |
68 |
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"); |
69 |
1/2✓ Branch 0 (21→22) taken 1 times.
✗ Branch 1 (21→116) not taken.
|
1 | return static_cast<std::vector<Function *> *>(nullptr); |
70 | } | ||
71 | // Convert generic symbol type to generic type | ||
72 |
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()); |
73 |
1/2✗ Branch 0 (25→26) not taken.
✓ Branch 1 (25→27) taken 95 times.
|
95 | assert(genericType != nullptr); |
74 |
1/2✓ Branch 0 (27→28) taken 95 times.
✗ Branch 1 (27→117) not taken.
|
95 | usedGenericTypes.push_back(*genericType); |
75 | } | ||
76 | } | ||
77 | |||
78 | // Visit return type | ||
79 |
1/2✓ Branch 0 (33→34) taken 191 times.
✗ Branch 1 (33→159) not taken.
|
191 | QualType returnType(TY_DYN); |
80 |
2/2✓ Branch 0 (34→35) taken 149 times.
✓ Branch 1 (34→51) taken 42 times.
|
191 | if (isFunction) { |
81 |
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)); |
82 |
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)) |
83 | ✗ | return static_cast<std::vector<Function *> *>(nullptr); | |
84 | |||
85 |
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)) |
86 |
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, |
87 | "Generic return type not included in the template type list of the function"); | ||
88 | } | ||
89 | |||
90 | // Visit params | ||
91 | 191 | QualTypeList paramTypes; | |
92 | 191 | ParamList paramList; | |
93 |
2/2✓ Branch 0 (51→52) taken 8 times.
✓ Branch 1 (51→80) taken 183 times.
|
191 | if (node->hasParams) { |
94 |
1/2✓ Branch 0 (53→54) taken 8 times.
✗ Branch 1 (53→155) not taken.
|
8 | paramList.reserve(node->paramTypeLst->dataTypes.size()); |
95 |
2/2✓ Branch 0 (78→56) taken 10 times.
✓ Branch 1 (78→79) taken 8 times.
|
18 | for (DataTypeNode *param : node->paramTypeLst->dataTypes) { |
96 |
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)); |
97 |
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)) |
98 | ✗ | return static_cast<std::vector<Function *> *>(nullptr); | |
99 | |||
100 | // Check if the type is present in the template for generic types | ||
101 |
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)) { |
102 |
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, |
103 | "Generic param type not included in the template type list of the function"); | ||
104 | 2 | continue; | |
105 | } | ||
106 | |||
107 |
1/2✓ Branch 0 (73→74) taken 8 times.
✗ Branch 1 (73→141) not taken.
|
8 | paramTypes.push_back(paramType); |
108 |
1/2✓ Branch 0 (74→75) taken 8 times.
✗ Branch 1 (74→140) not taken.
|
8 | paramList.push_back({paramType, false}); |
109 | } | ||
110 | } | ||
111 | |||
112 | // Build signature object | ||
113 |
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); |
114 | |||
115 | // Add signature to current scope | ||
116 |
1/2✓ Branch 0 (88→89) taken 191 times.
✗ Branch 1 (88→153) not taken.
|
191 | Function *manifestation = FunctionManager::insert(currentScope, signature, &node->signatureManifestations); |
117 | 191 | manifestation->entry = node->entry; | |
118 | 191 | manifestation->used = true; | |
119 | |||
120 | // Prepare signature type | ||
121 |
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; |
122 |
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); |
123 | 191 | signatureType.setQualifiers(node->signatureQualifiers); | |
124 | |||
125 | // Set entry to signature type | ||
126 |
1/2✗ Branch 0 (95→96) not taken.
✓ Branch 1 (95→97) taken 191 times.
|
191 | assert(node->entry != nullptr); |
127 |
1/2✓ Branch 0 (97→98) taken 191 times.
✗ Branch 1 (97→153) not taken.
|
191 | node->entry->updateType(signatureType, false); |
128 | 191 | node->entry->used = true; | |
129 | |||
130 |
1/2✓ Branch 0 (98→99) taken 191 times.
✗ Branch 1 (98→152) not taken.
|
191 | return &node->signatureManifestations; |
131 | 192 | } | |
132 | |||
133 | 50773 | std::any TypeChecker::visitDataType(DataTypeNode *node) { | |
134 | // Visit base data type | ||
135 |
2/4✓ Branch 0 (2→3) taken 50773 times.
✗ Branch 1 (2→219) not taken.
✓ Branch 2 (3→4) taken 50773 times.
✗ Branch 3 (3→217) not taken.
|
50773 | auto type = std::any_cast<QualType>(visit(node->baseDataType)); |
136 |
4/6✓ Branch 0 (5→6) taken 50773 times.
✗ Branch 1 (5→320) not taken.
✓ Branch 2 (6→7) taken 3 times.
✓ Branch 3 (6→9) taken 50770 times.
✓ Branch 4 (7→8) taken 3 times.
✗ Branch 5 (7→320) not taken.
|
50773 | HANDLE_UNRESOLVED_TYPE_QT(type) |
137 | |||
138 |
1/2✓ Branch 0 (9→10) taken 50770 times.
✗ Branch 1 (9→320) not taken.
|
50770 | std::queue<DataTypeNode::TypeModifier> tmQueue = node->tmQueue; |
139 |
2/2✓ Branch 0 (108→11) taken 12505 times.
✓ Branch 1 (108→109) taken 50763 times.
|
63268 | while (!tmQueue.empty()) { |
140 |
1/2✓ Branch 0 (12→13) taken 12505 times.
✗ Branch 1 (12→269) not taken.
|
12505 | auto [modifierType, hasSize, hardcodedSize, sizeVarName] = tmQueue.front(); |
141 | |||
142 | // Only the outermost array can have an unknown size | ||
143 |
8/10✓ Branch 0 (13→14) taken 12505 times.
✗ Branch 1 (13→267) not taken.
✓ Branch 2 (14→15) taken 41 times.
✓ Branch 3 (14→18) taken 12464 times.
✓ Branch 4 (15→16) taken 41 times.
✗ Branch 5 (15→267) not taken.
✓ Branch 6 (16→17) taken 1 times.
✓ Branch 7 (16→18) taken 40 times.
✓ Branch 8 (19→20) taken 1 times.
✓ Branch 9 (19→30) taken 12504 times.
|
12505 | if (type.isArray() && type.getArraySize() == ARRAY_SIZE_UNKNOWN) |
144 |
4/8✓ Branch 0 (22→23) taken 1 times.
✗ Branch 1 (22→222) not taken.
✓ Branch 2 (23→24) taken 1 times.
✗ Branch 3 (23→220) not taken.
✓ Branch 4 (26→27) taken 1 times.
✗ Branch 5 (26→226) not taken.
✓ Branch 6 (27→28) taken 1 times.
✗ Branch 7 (27→226) not taken.
|
3 | SOFT_ERROR_QT(node, ARRAY_SIZE_INVALID, |
145 | "Usage of incomplete array type. Only the outermost array type may have unknown size") | ||
146 | |||
147 |
3/4✓ Branch 0 (30→31) taken 5407 times.
✓ Branch 1 (30→33) taken 6948 times.
✓ Branch 2 (30→35) taken 149 times.
✗ Branch 3 (30→92) not taken.
|
12504 | switch (modifierType) { |
148 | 5407 | case DataTypeNode::TypeModifierType::TYPE_PTR: { | |
149 |
2/2✓ Branch 0 (31→32) taken 5405 times.
✓ Branch 1 (31→227) taken 2 times.
|
5407 | type = type.toPtr(node); |
150 | 5405 | break; | |
151 | } | ||
152 | 6948 | case DataTypeNode::TypeModifierType::TYPE_REF: { | |
153 |
1/2✓ Branch 0 (33→34) taken 6948 times.
✗ Branch 1 (33→228) not taken.
|
6948 | type = type.toRef(node); |
154 | 6948 | break; | |
155 | } | ||
156 | 149 | case DataTypeNode::TypeModifierType::TYPE_ARRAY: { | |
157 | 149 | const std::string &varName = sizeVarName; | |
158 |
2/2✓ Branch 0 (36→37) taken 35 times.
✓ Branch 1 (36→78) taken 114 times.
|
149 | if (!varName.empty()) { |
159 |
1/2✓ Branch 0 (37→38) taken 35 times.
✗ Branch 1 (37→267) not taken.
|
35 | const SymbolTableEntry *globalVar = rootScope->lookupStrict(varName); |
160 |
2/2✓ Branch 0 (40→41) taken 1 times.
✓ Branch 1 (40→50) taken 34 times.
|
35 | if (!globalVar) |
161 |
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 + "' ") |
162 |
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()) |
163 |
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") |
164 |
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)) |
165 |
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") |
166 |
1/2✓ Branch 0 (76→77) taken 32 times.
✗ Branch 1 (76→267) not taken.
|
32 | hardcodedSize = globalVar->declNode->getCompileTimeValue().intValue; |
167 | } | ||
168 | |||
169 |
3/4✓ Branch 0 (78→79) taken 91 times.
✓ Branch 1 (78→90) taken 55 times.
✗ Branch 2 (79→80) not taken.
✓ Branch 3 (79→90) taken 91 times.
|
146 | if (hasSize && hardcodedSize <= 1) |
170 | ✗ | SOFT_ERROR_QT(node, ARRAY_SIZE_INVALID, "The size of an array must be > 1 and explicitly stated") | |
171 |
2/2✓ Branch 0 (90→91) taken 145 times.
✓ Branch 1 (90→257) taken 1 times.
|
146 | type = type.toArr(node, hardcodedSize); |
172 | 145 | break; | |
173 | } | ||
174 | − | default: // GCOV_EXCL_LINE | |
175 | − | throw CompilerError(UNHANDLED_BRANCH, "Modifier type fall-through"); // GCOV_EXCL_LINE | |
176 | } | ||
177 | 12498 | tmQueue.pop(); | |
178 |
2/2✓ Branch 0 (103→104) taken 12498 times.
✓ Branch 1 (103→106) taken 4 times.
|
12505 | } |
179 | |||
180 | // Attach the qualifiers to the type | ||
181 |
2/2✓ Branch 0 (109→110) taken 21299 times.
✓ Branch 1 (109→210) taken 29464 times.
|
50763 | if (node->qualifierLst) { |
182 |
1/2✓ Branch 0 (110→111) taken 21299 times.
✗ Branch 1 (110→316) not taken.
|
21299 | const QualType baseType = type.getBase(); |
183 |
2/2✓ Branch 0 (207→113) taken 24971 times.
✓ Branch 1 (207→208) taken 21297 times.
|
46268 | for (const QualifierNode *qualifier : node->qualifierLst->qualifiers) { |
184 |
2/2✓ Branch 0 (114→115) taken 10143 times.
✓ Branch 1 (114→117) taken 14828 times.
|
24971 | if (qualifier->type == QualifierNode::QualifierType::TY_CONST) { |
185 | 10143 | type.getQualifiers().isConst = true; | |
186 |
2/2✓ Branch 0 (117→118) taken 2 times.
✓ Branch 1 (117→132) taken 14826 times.
|
14828 | } else if (qualifier->type == QualifierNode::QualifierType::TY_SIGNED) { |
187 |
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})) |
188 | ✗ | SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT, "Cannot use this qualifier on type " + baseType.getName(false)) | |
189 | 2 | type.getQualifiers().isSigned = true; | |
190 | 2 | type.getQualifiers().isUnsigned = false; | |
191 |
2/2✓ Branch 0 (132→133) taken 10324 times.
✓ Branch 1 (132→147) taken 4502 times.
|
14826 | } else if (qualifier->type == QualifierNode::QualifierType::TY_UNSIGNED) { |
192 |
2/4✓ Branch 0 (133→134) taken 10324 times.
✗ Branch 1 (133→278) not taken.
✗ Branch 2 (134→135) not taken.
✓ Branch 3 (134→144) taken 10324 times.
|
10324 | if (!baseType.isOneOf({TY_INT, TY_LONG, TY_SHORT, TY_BYTE, TY_CHAR, TY_GENERIC})) |
193 | ✗ | SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT, "Cannot use this qualifier on type " + baseType.getName(false)) | |
194 | 10324 | type.getQualifiers().isSigned = false; | |
195 | 10324 | type.getQualifiers().isUnsigned = true; | |
196 |
2/2✓ Branch 0 (147→148) taken 3632 times.
✓ Branch 1 (147→162) taken 870 times.
|
4502 | } else if (qualifier->type == QualifierNode::QualifierType::TY_HEAP) { |
197 | // Heap variables can only be pointers | ||
198 |
4/6✓ Branch 0 (148→149) taken 3632 times.
✗ Branch 1 (148→287) not taken.
✓ Branch 2 (149→150) taken 3632 times.
✗ Branch 3 (149→286) not taken.
✓ Branch 4 (150→151) taken 1 times.
✓ Branch 5 (150→160) taken 3631 times.
|
3632 | if (!type.removeReferenceWrapper().isOneOf({TY_PTR, TY_ARRAY, TY_STRING})) |
199 |
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, |
200 | "The heap qualifier can only be applied to symbols of pointer type, you provided " + | ||
201 | baseType.getName(false)) | ||
202 | |||
203 | 3631 | type.getQualifiers().isHeap = true; | |
204 |
3/4✓ Branch 0 (162→163) taken 7 times.
✓ Branch 1 (162→178) taken 863 times.
✓ Branch 2 (163→164) taken 7 times.
✗ Branch 3 (163→178) not taken.
|
870 | } else if (qualifier->type == QualifierNode::QualifierType::TY_COMPOSITION && node->isFieldType) { |
205 |
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)) |
206 |
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") |
207 | 6 | type.getQualifiers().isComposition = true; | |
208 |
4/6✓ Branch 0 (178→179) taken 863 times.
✗ Branch 1 (178→183) not taken.
✓ Branch 2 (179→180) taken 653 times.
✓ Branch 3 (179→181) taken 210 times.
✓ Branch 4 (180→181) taken 653 times.
✗ Branch 5 (180→183) not taken.
|
863 | } else if (qualifier->type == QualifierNode::QualifierType::TY_PUBLIC && (node->isFieldType || node->isGlobalType)) { |
209 | 863 | type.getQualifiers().isPublic = true; | |
210 | } else { | ||
211 | ✗ | auto entryName = "local variable"; | |
212 | ✗ | if (node->isGlobalType) | |
213 | ✗ | entryName = "global variable"; | |
214 | ✗ | else if (node->isFieldType) | |
215 | ✗ | entryName = "field"; | |
216 | ✗ | else if (node->isParamType) | |
217 | ✗ | entryName = "param"; | |
218 | ✗ | else if (node->isReturnType) | |
219 | ✗ | entryName = "return variable"; | |
220 | ✗ | SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT, | |
221 | "Cannot use this qualifier on a " + std::string(entryName) + " definition") | ||
222 | } | ||
223 | } | ||
224 | } | ||
225 | |||
226 |
2/4✓ Branch 0 (210→211) taken 50761 times.
✗ Branch 1 (210→317) not taken.
✓ Branch 2 (211→212) taken 50761 times.
✗ Branch 3 (211→317) not taken.
|
50761 | return node->setEvaluatedSymbolType(type, manIdx); |
227 | 50770 | } | |
228 | |||
229 | 50773 | std::any TypeChecker::visitBaseDataType(BaseDataTypeNode *node) { | |
230 |
11/11✓ Branch 0 (2→3) taken 328 times.
✓ Branch 1 (2→8) taken 2941 times.
✓ Branch 2 (2→13) taken 728 times.
✓ Branch 3 (2→18) taken 9476 times.
✓ Branch 4 (2→23) taken 1919 times.
✓ Branch 5 (2→28) taken 7165 times.
✓ Branch 6 (2→33) taken 6485 times.
✓ Branch 7 (2→38) taken 3398 times.
✓ Branch 8 (2→43) taken 17838 times.
✓ Branch 9 (2→55) taken 112 times.
✓ Branch 10 (2→67) taken 383 times.
|
50773 | switch (node->type) { |
231 | 328 | case BaseDataTypeNode::Type::TYPE_DOUBLE: | |
232 |
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); |
233 | 2941 | case BaseDataTypeNode::Type::TYPE_INT: | |
234 |
3/6✓ Branch 0 (8→9) taken 2941 times.
✗ Branch 1 (8→75) not taken.
✓ Branch 2 (9→10) taken 2941 times.
✗ Branch 3 (9→75) not taken.
✓ Branch 4 (10→11) taken 2941 times.
✗ Branch 5 (10→75) not taken.
|
2941 | return node->setEvaluatedSymbolType(QualType(TY_INT), manIdx); |
235 | 728 | case BaseDataTypeNode::Type::TYPE_SHORT: | |
236 |
3/6✓ Branch 0 (13→14) taken 728 times.
✗ Branch 1 (13→77) not taken.
✓ Branch 2 (14→15) taken 728 times.
✗ Branch 3 (14→77) not taken.
✓ Branch 4 (15→16) taken 728 times.
✗ Branch 5 (15→77) not taken.
|
728 | return node->setEvaluatedSymbolType(QualType(TY_SHORT), manIdx); |
237 | 9476 | case BaseDataTypeNode::Type::TYPE_LONG: | |
238 |
3/6✓ Branch 0 (18→19) taken 9476 times.
✗ Branch 1 (18→79) not taken.
✓ Branch 2 (19→20) taken 9476 times.
✗ Branch 3 (19→79) not taken.
✓ Branch 4 (20→21) taken 9476 times.
✗ Branch 5 (20→79) not taken.
|
9476 | return node->setEvaluatedSymbolType(QualType(TY_LONG), manIdx); |
239 | 1919 | case BaseDataTypeNode::Type::TYPE_BYTE: | |
240 |
3/6✓ Branch 0 (23→24) taken 1919 times.
✗ Branch 1 (23→81) not taken.
✓ Branch 2 (24→25) taken 1919 times.
✗ Branch 3 (24→81) not taken.
✓ Branch 4 (25→26) taken 1919 times.
✗ Branch 5 (25→81) not taken.
|
1919 | return node->setEvaluatedSymbolType(QualType(TY_BYTE), manIdx); |
241 | 7165 | case BaseDataTypeNode::Type::TYPE_CHAR: | |
242 |
3/6✓ Branch 0 (28→29) taken 7165 times.
✗ Branch 1 (28→83) not taken.
✓ Branch 2 (29→30) taken 7165 times.
✗ Branch 3 (29→83) not taken.
✓ Branch 4 (30→31) taken 7165 times.
✗ Branch 5 (30→83) not taken.
|
7165 | return node->setEvaluatedSymbolType(QualType(TY_CHAR), manIdx); |
243 | 6485 | case BaseDataTypeNode::Type::TYPE_STRING: | |
244 |
3/6✓ Branch 0 (33→34) taken 6485 times.
✗ Branch 1 (33→85) not taken.
✓ Branch 2 (34→35) taken 6485 times.
✗ Branch 3 (34→85) not taken.
✓ Branch 4 (35→36) taken 6485 times.
✗ Branch 5 (35→85) not taken.
|
6485 | return node->setEvaluatedSymbolType(QualType(TY_STRING), manIdx); |
245 | 3398 | case BaseDataTypeNode::Type::TYPE_BOOL: | |
246 |
3/6✓ Branch 0 (38→39) taken 3398 times.
✗ Branch 1 (38→87) not taken.
✓ Branch 2 (39→40) taken 3398 times.
✗ Branch 3 (39→87) not taken.
✓ Branch 4 (40→41) taken 3398 times.
✗ Branch 5 (40→87) not taken.
|
3398 | return node->setEvaluatedSymbolType(QualType(TY_BOOL), manIdx); |
247 | 17838 | case BaseDataTypeNode::Type::TYPE_CUSTOM: { | |
248 |
2/4✓ Branch 0 (43→44) taken 17838 times.
✗ Branch 1 (43→91) not taken.
✓ Branch 2 (44→45) taken 17838 times.
✗ Branch 3 (44→89) not taken.
|
17838 | const auto customType = std::any_cast<QualType>(visit(node->customDataType)); |
249 |
4/6✓ Branch 0 (46→47) taken 17838 times.
✗ Branch 1 (46→93) not taken.
✓ Branch 2 (47→48) taken 3 times.
✓ Branch 3 (47→50) taken 17835 times.
✓ Branch 4 (48→49) taken 3 times.
✗ Branch 5 (48→93) not taken.
|
17838 | HANDLE_UNRESOLVED_TYPE_QT(customType) |
250 |
2/4✓ Branch 0 (50→51) taken 17835 times.
✗ Branch 1 (50→92) not taken.
✓ Branch 2 (51→52) taken 17835 times.
✗ Branch 3 (51→92) not taken.
|
17835 | return node->setEvaluatedSymbolType(customType, manIdx); |
251 | } | ||
252 | 112 | case BaseDataTypeNode::Type::TYPE_FUNCTION: { | |
253 |
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)); |
254 |
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) |
255 |
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); |
256 | } | ||
257 | 383 | default: | |
258 |
3/6✓ Branch 0 (67→68) taken 383 times.
✗ Branch 1 (67→99) not taken.
✓ Branch 2 (68→69) taken 383 times.
✗ Branch 3 (68→99) not taken.
✓ Branch 4 (69→70) taken 383 times.
✗ Branch 5 (69→99) not taken.
|
383 | return node->setEvaluatedSymbolType(QualType(TY_DYN), manIdx); |
259 | } | ||
260 | } | ||
261 | |||
262 | 17838 | std::any TypeChecker::visitCustomDataType(CustomDataTypeNode *node) { | |
263 | // It is a struct type -> get the access scope | ||
264 |
1/2✓ Branch 0 (3→4) taken 17838 times.
✗ Branch 1 (3→241) not taken.
|
17838 | const std::string firstFragment = node->typeNameFragments.front(); |
265 | |||
266 | // Check this type requires a runtime module | ||
267 |
2/2✓ Branch 0 (5→6) taken 17812 times.
✓ Branch 1 (5→7) taken 26 times.
|
17838 | if (node->typeNameFragments.size() == 1) |
268 |
1/2✓ Branch 0 (6→7) taken 17812 times.
✗ Branch 1 (6→239) not taken.
|
17812 | ensureLoadedRuntimeForTypeName(firstFragment); |
269 | |||
270 | // A type can either be a single fragment like "Test" or multiple fragments "a.b.Test", which means it is imported. | ||
271 | 17838 | bool isImported = node->typeNameFragments.size() > 1; | |
272 |
3/4✓ Branch 0 (8→9) taken 17838 times.
✗ Branch 1 (8→239) not taken.
✓ Branch 2 (9→10) taken 8440 times.
✓ Branch 3 (9→25) taken 9398 times.
|
17838 | if (const QualType *genericType = rootScope->lookupGenericTypeStrict(firstFragment)) { |
273 |
1/2✗ Branch 0 (10→11) not taken.
✓ Branch 1 (10→12) taken 8440 times.
|
8440 | assert(!isImported); |
274 | // Take the concrete replacement type for the name of this generic type if available | ||
275 |
4/6✓ Branch 0 (12→13) taken 8440 times.
✗ Branch 1 (12→239) not taken.
✓ Branch 2 (13→14) taken 1933 times.
✓ Branch 3 (13→16) taken 6507 times.
✓ Branch 4 (14→15) taken 1933 times.
✗ Branch 5 (14→239) not taken.
|
8440 | const QualType &symbolType = typeMapping.contains(firstFragment) ? typeMapping.at(firstFragment) : *genericType; |
276 | |||
277 | // Check if the replacement requires a runtime module | ||
278 |
3/4✓ Branch 0 (17→18) taken 8440 times.
✗ Branch 1 (17→239) not taken.
✓ Branch 2 (18→19) taken 565 times.
✓ Branch 3 (18→21) taken 7875 times.
|
8440 | if (symbolType.is(TY_STRUCT)) |
279 |
2/4✓ Branch 0 (19→20) taken 565 times.
✗ Branch 1 (19→239) not taken.
✓ Branch 2 (20→21) taken 565 times.
✗ Branch 3 (20→239) not taken.
|
565 | ensureLoadedRuntimeForTypeName(symbolType.getSubType()); |
280 | |||
281 |
2/4✓ Branch 0 (21→22) taken 8440 times.
✗ Branch 1 (21→181) not taken.
✓ Branch 2 (22→23) taken 8440 times.
✗ Branch 3 (22→181) not taken.
|
8440 | return node->setEvaluatedSymbolType(symbolType, manIdx); |
282 | } | ||
283 | |||
284 | // Check if the type exists in the exported names registry | ||
285 |
1/2✓ Branch 0 (25→26) taken 9398 times.
✗ Branch 1 (25→239) not taken.
|
9398 | const NameRegistryEntry *registryEntry = sourceFile->getNameRegistryEntry(node->fqTypeName); |
286 |
2/2✓ Branch 0 (26→27) taken 2 times.
✓ Branch 1 (26→36) taken 9396 times.
|
9398 | if (!registryEntry) |
287 |
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 + "'") |
288 |
2/4✓ Branch 0 (36→37) taken 9396 times.
✗ Branch 1 (36→39) not taken.
✓ Branch 2 (37→38) taken 9396 times.
✗ Branch 3 (37→39) not taken.
|
9396 | assert(registryEntry->targetEntry != nullptr && registryEntry->targetScope != nullptr); |
289 | 9396 | SymbolTableEntry *entry = registryEntry->targetEntry; | |
290 |
1/2✗ Branch 0 (40→41) not taken.
✓ Branch 1 (40→42) taken 9396 times.
|
9396 | assert(entry != nullptr); |
291 | 9396 | entry->used = true; | |
292 | 9396 | Scope *defScope = registryEntry->targetScope->parent; | |
293 |
1/2✓ Branch 0 (42→43) taken 9396 times.
✗ Branch 1 (42→239) not taken.
|
9396 | QualType entryType = entry->getQualType(); |
294 | |||
295 | // Enums can early-return | ||
296 |
3/4✓ Branch 0 (43→44) taken 9396 times.
✗ Branch 1 (43→239) not taken.
✓ Branch 2 (44→45) taken 112 times.
✓ Branch 3 (44→49) taken 9284 times.
|
9396 | if (entryType.is(TY_ENUM)) |
297 |
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); |
298 | |||
299 |
3/4✓ Branch 0 (49→50) taken 9284 times.
✗ Branch 1 (49→190) not taken.
✓ Branch 2 (50→51) taken 8350 times.
✓ Branch 3 (50→153) taken 934 times.
|
9284 | if (entryType.isOneOf({TY_STRUCT, TY_INTERFACE})) { |
300 |
2/4✓ Branch 0 (51→52) taken 8350 times.
✗ Branch 1 (51→53) not taken.
✗ Branch 2 (54→55) not taken.
✓ Branch 3 (54→56) taken 8350 times.
|
8350 | assert(dynamic_cast<DataTypeNode *>(node->parent->parent) != nullptr); |
301 | |||
302 | // Collect the concrete template types | ||
303 | 8350 | bool allTemplateTypesConcrete = true; | |
304 | 8350 | QualTypeList templateTypes; | |
305 |
2/2✓ Branch 0 (56→57) taken 2035 times.
✓ Branch 1 (56→89) taken 6315 times.
|
8350 | if (node->templateTypeLst) { |
306 |
1/2✗ Branch 0 (57→58) not taken.
✓ Branch 1 (57→59) taken 2035 times.
|
2035 | assert(defScope != nullptr); |
307 |
1/2✓ Branch 0 (59→60) taken 2035 times.
✗ Branch 1 (59→221) not taken.
|
2035 | isImported = defScope->isImportedBy(rootScope); |
308 | |||
309 |
1/2✓ Branch 0 (61→62) taken 2035 times.
✗ Branch 1 (61→221) not taken.
|
2035 | templateTypes.reserve(node->templateTypeLst->dataTypes.size()); |
310 |
2/2✓ Branch 0 (86→64) taken 2672 times.
✓ Branch 1 (86→87) taken 2035 times.
|
4707 | for (DataTypeNode *dataType : node->templateTypeLst->dataTypes) { |
311 |
2/4✓ Branch 0 (65→66) taken 2672 times.
✗ Branch 1 (65→193) not taken.
✓ Branch 2 (66→67) taken 2672 times.
✗ Branch 3 (66→191) not taken.
|
2672 | auto templateType = std::any_cast<QualType>(visit(dataType)); |
312 |
2/6✓ Branch 0 (68→69) taken 2672 times.
✗ Branch 1 (68→195) not taken.
✗ Branch 2 (69→70) not taken.
✓ Branch 3 (69→72) taken 2672 times.
✗ Branch 4 (70→71) not taken.
✗ Branch 5 (70→195) not taken.
|
2672 | HANDLE_UNRESOLVED_TYPE_QT(templateType) |
313 |
2/4✓ Branch 0 (72→73) taken 2672 times.
✗ Branch 1 (72→195) not taken.
✗ Branch 2 (73→74) not taken.
✓ Branch 3 (73→75) taken 2672 times.
|
2672 | if (entryType.is(TY_GENERIC)) { |
314 | ✗ | allTemplateTypesConcrete = false; | |
315 |
2/2✓ Branch 0 (75→76) taken 950 times.
✓ Branch 1 (75→82) taken 1722 times.
|
2672 | } else if (isImported) { |
316 | // Introduce the local type to the imported source file | ||
317 |
1/2✓ Branch 0 (76→77) taken 950 times.
✗ Branch 1 (76→194) not taken.
|
950 | [[maybe_unused]] QualType importedType = mapLocalTypeToImportedScopeType(defScope, templateType); |
318 |
3/6✓ Branch 0 (77→78) taken 950 times.
✗ Branch 1 (77→194) not taken.
✓ Branch 2 (78→79) taken 950 times.
✗ Branch 3 (78→194) not taken.
✗ Branch 4 (79→80) not taken.
✓ Branch 5 (79→81) taken 950 times.
|
950 | assert(importedType.is(templateType.getSuperType())); |
319 | } | ||
320 |
1/2✓ Branch 0 (82→83) taken 2672 times.
✗ Branch 1 (82→195) not taken.
|
2672 | templateTypes.push_back(templateType); |
321 | } | ||
322 |
1/2✓ Branch 0 (87→88) taken 2035 times.
✗ Branch 1 (87→197) not taken.
|
2035 | entryType = entryType.getWithTemplateTypes(templateTypes); |
323 | } | ||
324 | |||
325 | // Check if struct is defined before the current code location, if defined in the same source file | ||
326 | 8350 | const CodeLoc &declCodeLoc = entry->declNode->codeLoc; | |
327 | 8350 | const CodeLoc &codeLoc = node->codeLoc; | |
328 |
6/6✓ Branch 0 (90→91) taken 6600 times.
✓ Branch 1 (90→98) taken 1750 times.
✓ Branch 2 (96→97) taken 1 times.
✓ Branch 3 (96→98) taken 6599 times.
✓ Branch 4 (99→100) taken 1 times.
✓ Branch 5 (99→125) taken 8349 times.
|
14950 | if (declCodeLoc.sourceFile->filePath == codeLoc.sourceFile->filePath && declCodeLoc > codeLoc) { |
329 |
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)) { |
330 |
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") |
331 | } else { | ||
332 | ✗ | assert(entryType.is(TY_INTERFACE)); | |
333 | ✗ | SOFT_ERROR_QT(node, REFERENCED_UNDEFINED_INTERFACE, "Interfaces must be defined before usage") | |
334 | } | ||
335 | } | ||
336 | |||
337 |
1/2✓ Branch 0 (125→126) taken 8349 times.
✗ Branch 1 (125→147) not taken.
|
8349 | if (allTemplateTypesConcrete) { // Only do the next step, if we have concrete template types |
338 | // Set the struct/interface instance to used, if found | ||
339 | // Here, it is allowed to accept, that the struct/interface cannot be found, because there are self-referencing ones | ||
340 |
3/4✓ Branch 0 (126→127) taken 8349 times.
✗ Branch 1 (126→221) not taken.
✓ Branch 2 (127→128) taken 8191 times.
✓ Branch 3 (127→136) taken 158 times.
|
8349 | if (entryType.is(TY_STRUCT)) { |
341 |
1/2✓ Branch 0 (129→130) taken 8191 times.
✗ Branch 1 (129→215) not taken.
|
8191 | const std::string structName = node->typeNameFragments.back(); |
342 |
3/4✓ Branch 0 (130→131) taken 8191 times.
✗ Branch 1 (130→213) not taken.
✓ Branch 2 (131→132) taken 8155 times.
✓ Branch 3 (131→134) taken 36 times.
|
8191 | if (const Struct *spiceStruct = StructManager::match(defScope, structName, templateTypes, node)) |
343 |
1/2✓ Branch 0 (132→133) taken 8155 times.
✗ Branch 1 (132→212) not taken.
|
8155 | entryType = entryType.getWithBodyScope(spiceStruct->scope); |
344 | 8191 | } else { | |
345 |
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)); |
346 |
1/2✓ Branch 0 (140→141) taken 158 times.
✗ Branch 1 (140→219) not taken.
|
158 | const std::string interfaceName = node->typeNameFragments.back(); |
347 |
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)) |
348 |
1/2✓ Branch 0 (143→144) taken 158 times.
✗ Branch 1 (143→216) not taken.
|
158 | entryType = entryType.getWithBodyScope(spiceInterface->scope); |
349 | 158 | } | |
350 | } | ||
351 | |||
352 |
2/4✓ Branch 0 (147→148) taken 8349 times.
✗ Branch 1 (147→220) not taken.
✓ Branch 2 (148→149) taken 8349 times.
✗ Branch 3 (148→220) not taken.
|
8349 | return node->setEvaluatedSymbolType(entryType, manIdx); |
353 | 8350 | } | |
354 | |||
355 |
2/4✓ Branch 0 (153→154) taken 934 times.
✗ Branch 1 (153→239) not taken.
✓ Branch 2 (154→155) taken 934 times.
✗ Branch 3 (154→160) not taken.
|
934 | if (entryType.is(TY_ALIAS)) |
356 |
3/6✓ Branch 0 (155→156) taken 934 times.
✗ Branch 1 (155→224) not taken.
✓ Branch 2 (156→157) taken 934 times.
✗ Branch 3 (156→224) not taken.
✓ Branch 4 (157→158) taken 934 times.
✗ Branch 5 (157→224) not taken.
|
934 | return node->setEvaluatedSymbolType(entryType.getAliased(entry), manIdx); |
357 | |||
358 | // We tried everything to resolve it, but this type is still unknown | ||
359 | ✗ | const bool isInvalid = entryType.is(TY_INVALID); | |
360 | ✗ | SOFT_ERROR_QT(node, EXPECTED_TYPE, isInvalid ? "Used type before declared" : "Expected type, but got " + entryType.getName()) | |
361 | 17838 | } | |
362 | |||
363 | 112 | std::any TypeChecker::visitFunctionDataType(FunctionDataTypeNode *node) { | |
364 | // Visit return type | ||
365 |
1/2✓ Branch 0 (2→3) taken 112 times.
✗ Branch 1 (2→72) not taken.
|
112 | QualType returnType(TY_DYN); |
366 |
2/2✓ Branch 0 (3→4) taken 29 times.
✓ Branch 1 (3→23) taken 83 times.
|
112 | if (node->isFunction) { |
367 |
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)); |
368 |
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) |
369 |
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)) |
370 | ✗ | SOFT_ERROR_ER(node->returnType, UNEXPECTED_DYN_TYPE, "Function types cannot have return type dyn") | |
371 | } | ||
372 | |||
373 | // Visit param types | ||
374 | 112 | QualTypeList paramTypes; | |
375 |
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) { |
376 |
2/2✓ Branch 0 (38→26) taken 80 times.
✓ Branch 1 (38→39) taken 67 times.
|
147 | for (DataTypeNode *paramTypeNode : paramTypeListNode->dataTypes) { |
377 |
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)); |
378 |
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) |
379 |
1/2✓ Branch 0 (34→35) taken 80 times.
✗ Branch 1 (34→66) not taken.
|
80 | paramTypes.push_back(paramType); |
380 | } | ||
381 | } | ||
382 | |||
383 | // Build function type | ||
384 |
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; |
385 |
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); |
386 | |||
387 |
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); |
388 | 112 | } | |
389 | |||
390 | } // namespace spice::compiler | ||
391 |