From a5d033df465ca8de8457926cc64aacf38c6ae848 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sun, 13 Sep 2026 16:07:11 +0200 Subject: Visit nested statements in validation visitor --- boot/validation.cc | 117 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 71 insertions(+), 46 deletions(-) (limited to 'boot/validation.cc') diff --git a/boot/validation.cc b/boot/validation.cc index 91dc064..2125a99 100644 --- a/boot/validation.cc +++ b/boot/validation.cc @@ -41,51 +41,36 @@ namespace elna::boot { } - void validation_visitor::visit(assign_statement *) - { - } - - void validation_visitor::visit(if_statement *) - { - } - - void validation_visitor::visit(while_statement *) - { - } - - void validation_visitor::visit(repeat_statement *) - { - } - - void validation_visitor::visit(for_statement *) + void validation_visitor::visit_statements(const std::vector& statements) { + for (statement *const body_statement : statements) + { + body_statement->accept(this); + } } - void validation_visitor::visit(defer_statement *) + void validation_visitor::visit(unit *unit) { - } + for (declaration *unit_declaration : unit->declarations) + { + unit_declaration->accept(this); + } + if (unit->entry_point.has_value()) + { + auto entry_point = this->bag.lookup("")->is_procedure(); - void validation_visitor::visit(empty_statement *) - { + this->bag.enter(entry_point->scope); + visit_statements(unit->entry_point->statements); + this->bag.leave(); + } } - void validation_visitor::visit(procedure_call *) + void validation_visitor::visit(type_declaration *) { } - void validation_visitor::visit(unit *unit) + void validation_visitor::visit(variable_declaration *) { - for (procedure_declaration *procedure : unit->procedures) - { - procedure->accept(this); - } - if (unit->entry_point.has_value()) - { - for (auto *entry_statement : unit->entry_point->statements) - { - entry_statement->accept(this); - } - } } void validation_visitor::visit(procedure_declaration *declaration) @@ -94,10 +79,7 @@ namespace elna::boot { auto procedure = this->bag.lookup(declaration->identifier.name())->is_procedure(); this->bag.enter(procedure->scope); - for (auto *statement : declaration->body.value().statements) - { - statement->accept(this); - } + visit_statements(declaration->body.value().statements); this->bag.leave(); } } @@ -106,17 +88,11 @@ namespace elna::boot { for (const switch_case& case_block : statement->cases) { - for (auto *block_statement : case_block.statements) - { - block_statement->accept(this); - } + visit_statements(case_block.statements); } if (statement->alternative != nullptr) { - for (auto *block_statement : *statement->alternative) - { - block_statement->accept(this); - } + visit_statements(*statement->alternative); } std::unordered_map seen; @@ -139,4 +115,53 @@ namespace elna::boot } } } + + void validation_visitor::visit(assign_statement *) + { + } + + void validation_visitor::visit(if_statement *statement) + { + visit_statements(statement->branch().statements); + for (const conditional_statements *branch : statement->branches) + { + visit_statements(branch->statements); + } + if (statement->alternative != nullptr) + { + visit_statements(*statement->alternative); + } + } + + void validation_visitor::visit(while_statement *statement) + { + visit_statements(statement->branch().statements); + for (const conditional_statements *branch : statement->branches) + { + visit_statements(branch->statements); + } + } + + void validation_visitor::visit(repeat_statement *statement) + { + visit_statements(statement->body); + } + + void validation_visitor::visit(for_statement *statement) + { + visit_statements(statement->body); + } + + void validation_visitor::visit(defer_statement *statement) + { + visit_statements(statement->statements); + } + + void validation_visitor::visit(empty_statement *) + { + } + + void validation_visitor::visit(procedure_call *) + { + } } -- cgit v1.2.3