| 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 |