aboutsummaryrefslogtreecommitdiff
path: root/boot/validation.cc
diff options
context:
space:
mode:
Diffstat (limited to 'boot/validation.cc')
-rw-r--r--boot/validation.cc27
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);
}
}