diff options
Diffstat (limited to 'boot/validation.cc')
| -rw-r--r-- | boot/validation.cc | 27 |
1 files changed, 9 insertions, 18 deletions
diff --git a/boot/validation.cc b/boot/validation.cc index 0c9259e..4539633 100644 --- a/boot/validation.cc +++ b/boot/validation.cc @@ -41,34 +41,27 @@ namespace elna::boot { } - void validation_visitor::visit_statements(const std::vector<statement *>& statements) + void validation_visitor::visit_statements(const std::vector<statement *>& statements, + const std::shared_ptr<symbol_table>& scope) { - for (statement *const body_statement : statements) - { - body_statement->accept(this); - } + this->bag.enter(scope); + visit_all(this, statements); + this->bag.leave(); } void validation_visitor::visit_block(const block& body) { - this->bag.enter(body.symbols); - visit_statements(body.statements); - this->bag.leave(); + visit_statements(body.statements, body.symbols); } void validation_visitor::visit(unit *unit) { - for (declaration *unit_declaration : unit->declarations) - { - unit_declaration->accept(this); - } + visit_all(this, unit->declarations); if (unit->entry_point.has_value()) { const std::shared_ptr<procedure_info> entry_point = this->bag.lookup("")->is_procedure(); - this->bag.enter(entry_point->scope); - visit_statements(unit->entry_point.value()); - this->bag.leave(); + visit_statements(unit->entry_point.value(), entry_point->scope); } } @@ -87,9 +80,7 @@ namespace elna::boot const std::shared_ptr<procedure_info> procedure = this->bag.lookup(declaration->identifier.name())->is_procedure(); - this->bag.enter(procedure->scope); - visit_statements(declaration->body.value().statements); - this->bag.leave(); + visit_statements(declaration->body.value().statements, procedure->scope); } } |
