Line data Source code
1 : #include "../../../inc/visitors/validateTree/validateTree.h"
2 : #include "../../../inc/parsingAnalysis/ast/vector/ast_index.h"
3 : #include "../../../inc/parsingAnalysis/ast/vector/ast_vector.h"
4 : #include "../../../inc/parsingAnalysis/checkPosition.h"
5 :
6 : namespace nicole {
7 :
8 : std::expected<bool, Error>
9 0 : ValidateTree::visit(const AST_VECTOR *node) const noexcept {
10 0 : if (!node) {
11 0 : return createError(ERROR_TYPE::NULL_NODE, "invalid AST_VECTOR");
12 0 : }
13 0 : if (CheckPosition::hasEveryAncestorInOrder(
14 0 : node, {AST_TYPE::STATEMENT, AST_TYPE::BODY})) {
15 0 : return createError(ERROR_TYPE::VALIDATE_TREE, "dangling vector");
16 0 : }
17 0 : for (const auto &value : node->values()) {
18 0 : const auto result{value->accept(*this)};
19 0 : if (!result) {
20 0 : return createError(result.error());
21 0 : }
22 0 : }
23 0 : return true;
24 0 : }
25 :
26 : // chained
27 : std::expected<bool, Error>
28 0 : ValidateTree::visit(const AST_INDEX *node) const noexcept {
29 0 : if (!node) {
30 0 : return createError(ERROR_TYPE::NULL_NODE, "invalid AST_INDEX");
31 0 : }
32 0 : if (!CheckPosition::hasAnyAncestorOf(node, {AST_TYPE::CHAIN})) {
33 0 : return createError(ERROR_TYPE::VALIDATE_TREE,
34 0 : "index operator can only appear in a chain expression");
35 0 : }
36 0 : const auto result{node->index()->accept(*this)};
37 0 : if (!result) {
38 0 : return createError(result.error());
39 0 : }
40 0 : return true;
41 0 : }
42 :
43 : }
|