Line |
Branch |
Exec |
Source |
1 |
|
|
// Copyright (c) 2021-2025 ChilliBits. All rights reserved. |
2 |
|
|
|
3 |
|
|
#pragma once |
4 |
|
|
|
5 |
|
|
#include <exception> |
6 |
|
|
#include <string> |
7 |
|
|
|
8 |
|
|
#include <Token.h> |
9 |
|
|
|
10 |
|
|
namespace spice::compiler { |
11 |
|
|
|
12 |
|
|
// Forward declarations |
13 |
|
|
class ASTNode; |
14 |
|
|
class SourceFile; |
15 |
|
|
struct CodeLoc; |
16 |
|
|
|
17 |
|
|
enum SemanticErrorType : uint8_t { |
18 |
|
|
REFERENCED_UNDEFINED_FUNCTION, |
19 |
|
|
REFERENCED_UNDEFINED_VARIABLE, |
20 |
|
|
REFERENCED_UNDEFINED_STRUCT, |
21 |
|
|
REFERENCED_UNDEFINED_INTERFACE, |
22 |
|
|
REFERENCED_UNDEFINED_FIELD, |
23 |
|
|
USED_BEFORE_DECLARED, |
24 |
|
|
FUNCTION_AMBIGUITY, |
25 |
|
|
STRUCT_AMBIGUITY, |
26 |
|
|
INTERFACE_AMBIGUITY, |
27 |
|
|
DUPLICATE_SYMBOL, |
28 |
|
|
VARIABLE_DECLARED_TWICE, |
29 |
|
|
GLOBAL_DECLARED_TWICE, |
30 |
|
|
FUNCTION_DECLARED_TWICE, |
31 |
|
|
PROCEDURE_DECLARED_TWICE, |
32 |
|
|
GENERIC_TYPE_DECLARED_TWICE, |
33 |
|
|
STRUCT_WITH_ILLEGAL_NAME, |
34 |
|
|
STRUCT_INFINITE_SIZE, |
35 |
|
|
STRUCT_DECLARED_TWICE, |
36 |
|
|
MISSING_NO_ARGS_CTOR, |
37 |
|
|
COPY_CTOR_REQUIRED, |
38 |
|
|
INTERFACE_DECLARED_TWICE, |
39 |
|
|
INTERFACE_METHOD_NOT_IMPLEMENTED, |
40 |
|
|
ENUM_DECLARED_TWICE, |
41 |
|
|
INVALID_SYMBOL_ACCESS, |
42 |
|
|
DUPLICATE_ENUM_ITEM_NAME, |
43 |
|
|
DUPLICATE_ENUM_ITEM_VALUE, |
44 |
|
|
GLOBAL_OF_TYPE_DYN, |
45 |
|
|
GLOBAL_OF_INVALID_TYPE, |
46 |
|
|
GLOBAL_CONST_WITHOUT_VALUE, |
47 |
|
|
MISSING_RETURN_STMT, |
48 |
|
|
INVALID_PARAM_ORDER, |
49 |
|
|
LAMBDA_WITH_OPTIONAL_PARAMS, |
50 |
|
|
REFERENCED_OVERLOADED_FCT, |
51 |
|
|
DTOR_MUST_BE_PROCEDURE, |
52 |
|
|
DTOR_WITH_PARAMS, |
53 |
|
|
OPERATOR_WRONG_DATA_TYPE, |
54 |
|
|
INVALID_ITERATOR, |
55 |
|
|
UNEXPECTED_DYN_TYPE, |
56 |
|
|
REASSIGN_CONST_VARIABLE, |
57 |
|
|
CONDITION_MUST_BE_BOOL, |
58 |
|
|
SWITCH_EXPR_MUST_BE_PRIMITIVE, |
59 |
|
|
SWITCH_CASE_TYPE_MISMATCH, |
60 |
|
|
MISSING_MAIN_FUNCTION, |
61 |
|
|
FCT_PARAM_IS_TYPE_DYN, |
62 |
|
|
INVALID_BREAK_NUMBER, |
63 |
|
|
INVALID_CONTINUE_NUMBER, |
64 |
|
|
FALLTHROUGH_NOT_ALLOWED, |
65 |
|
|
CASE_CONSTANT_INVALID_TYPE, |
66 |
|
|
PRINTF_TYPE_ERROR, |
67 |
|
|
PRINTF_ARG_COUNT_ERROR, |
68 |
|
|
DUPLICATE_IMPORT_NAME, |
69 |
|
|
IMPORTED_FILE_NOT_EXISTING, |
70 |
|
|
CIRCULAR_DEPENDENCY, |
71 |
|
|
ACCESS_TO_NON_EXISTING_MEMBER, |
72 |
|
|
INVALID_MEMBER_ACCESS, |
73 |
|
|
SCOPE_ACCESS_ONLY_IMPORTS, |
74 |
|
|
UNKNOWN_DATATYPE, |
75 |
|
|
UNKNOWN_ATTR, |
76 |
|
|
INVALID_ATTR_TARGET, |
77 |
|
|
MISSING_ATTR_VALUE, |
78 |
|
|
NUMBER_OF_FIELDS_NOT_MATCHING, |
79 |
|
|
FIELD_TYPE_NOT_MATCHING, |
80 |
|
|
ARRAY_SIZE_INVALID, |
81 |
|
|
FOREACH_IDX_NOT_LONG, |
82 |
|
|
ARRAY_INDEX_NOT_INT_OR_LONG, |
83 |
|
|
ARRAY_ITEM_TYPE_NOT_MATCHING, |
84 |
|
|
EXPECTED_ARRAY_TYPE, |
85 |
|
|
EXPECTED_ERROR_TYPE, |
86 |
|
|
INVALID_SYSCALL_NUMBER_TYPE, |
87 |
|
|
SYSCALL_NUMBER_OUT_OF_RANGE, |
88 |
|
|
TOO_MANY_SYSCALL_ARGS, |
89 |
|
|
RETURN_WITHOUT_VALUE_RESULT, |
90 |
|
|
RETURN_WITH_VALUE_IN_PROCEDURE, |
91 |
|
|
RETURN_OF_TEMPORARY_VALUE, |
92 |
|
|
INVALID_STRUCT_INSTANTIATION, |
93 |
|
|
DYN_POINTERS_NOT_ALLOWED, |
94 |
|
|
REF_POINTERS_ARE_NOT_ALLOWED, |
95 |
|
|
DYN_REFERENCES_NOT_ALLOWED, |
96 |
|
|
MULTI_REF_NOT_ALLOWED, |
97 |
|
|
DYN_ARRAYS_NOT_ALLOWED, |
98 |
|
|
REFERENCE_WITHOUT_INITIALIZER, |
99 |
|
|
TEMP_TO_NON_CONST_REF, |
100 |
|
|
GENERIC_TYPE_NOT_IN_TEMPLATE, |
101 |
|
|
QUALIFIER_AT_ILLEGAL_CONTEXT, |
102 |
|
|
INSUFFICIENT_VISIBILITY, |
103 |
|
|
JOIN_ARG_MUST_BE_TID, |
104 |
|
|
EXPECTED_GENERIC_TYPE, |
105 |
|
|
EXPECTED_NON_GENERIC_TYPE, |
106 |
|
|
EXPECTED_STRUCT_TYPE, |
107 |
|
|
EXPECTED_INTERFACE_TYPE, |
108 |
|
|
ALIAS_WITH_TEMPLATE_LIST, |
109 |
|
|
INTERFACE_WITH_TEMPLATE_LIST, |
110 |
|
|
INVALID_TEMPLATE_TYPES, |
111 |
|
|
EXPECTED_VALUE, |
112 |
|
|
EXPECTED_TYPE, |
113 |
|
|
UNSAFE_OPERATION_IN_SAFE_CONTEXT, |
114 |
|
|
ASSERTION_CONDITION_BOOL, |
115 |
|
|
ARRAY_INDEX_OUT_OF_BOUNDS, |
116 |
|
|
EXPECTED_CONST_VARIABLE, |
117 |
|
|
DIVISION_BY_ZERO, |
118 |
|
|
TEST_FUNCTION_WITH_PARAMS, |
119 |
|
|
TEST_FUNCTION_WRONG_RETURN_TYPE, |
120 |
|
|
COMING_SOON_SA |
121 |
|
|
}; |
122 |
|
|
|
123 |
|
|
/** |
124 |
|
|
* Custom exception for errors, occurring in the semantic analysis phase |
125 |
|
|
*/ |
126 |
|
|
class SemanticError final : public std::exception { |
127 |
|
|
public: |
128 |
|
|
// Constructors |
129 |
|
|
SemanticError(const ASTNode *node, const SemanticErrorType &type, const std::string &message, bool printErrorMessage = true); |
130 |
|
|
|
131 |
|
|
// Public methods |
132 |
|
|
[[nodiscard]] const char *what() const noexcept override; |
133 |
|
|
[[nodiscard]] static std::string getMessagePrefix(SemanticErrorType errorType); |
134 |
|
|
|
135 |
|
|
// Public members |
136 |
|
|
std::string errorMessage; |
137 |
|
|
}; |
138 |
|
|
|
139 |
|
|
} // namespace spice::compiler |
140 |
|
|
|