aboutsummaryrefslogtreecommitdiff
path: root/boot/validation.cc
diff options
context:
space:
mode:
Diffstat (limited to 'boot/validation.cc')
-rw-r--r--boot/validation.cc56
1 files changed, 51 insertions, 5 deletions
diff --git a/boot/validation.cc b/boot/validation.cc
index b29381a..0c03fd0 100644
--- a/boot/validation.cc
+++ b/boot/validation.cc
@@ -55,6 +55,38 @@ 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(defer_statement *)
+ {
+ }
+
+ void validation_visitor::visit(empty_statement *)
+ {
+ }
+
+ void validation_visitor::visit(procedure_call *)
+ {
+ }
+
void validation_visitor::visit(unit *unit)
{
for (procedure_declaration *procedure : unit->procedures)
@@ -73,17 +105,31 @@ namespace elna::boot
{
auto procedure = this->bag.lookup(declaration->identifier.name())->is_procedure();
this->bag.enter(procedure->scope);
- }
- walking_visitor::visit(declaration);
- if (declaration->body.has_value())
- {
+ for (auto *statement : declaration->body.value().entry_point)
+ {
+ statement->accept(this);
+ }
this->bag.leave();
}
}
void validation_visitor::visit(case_statement *statement)
{
- walking_visitor::visit(statement);
+ for (const switch_case& case_block : statement->cases)
+ {
+ for (auto *block_statement : case_block.statements)
+ {
+ block_statement->accept(this);
+ }
+ }
+ if (statement->alternative != nullptr)
+ {
+ for (auto *block_statement : *statement->alternative)
+ {
+ block_statement->accept(this);
+ }
+ }
+
std::unordered_map<constant_value, source_position, constant_value_hash> seen;
for (const auto& case_block : statement->cases)
{