diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-09-13 16:07:11 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-09-13 16:07:11 +0200 |
| commit | a5d033df465ca8de8457926cc64aacf38c6ae848 (patch) | |
| tree | e459e27e808046ea42448768394574f3343f7015 /include | |
| parent | e72e20e025ab14320c79c2dca75721a0a5e002bd (diff) | |
| download | elna-a5d033df465ca8de8457926cc64aacf38c6ae848.tar.gz | |
Visit nested statements in validation visitor
Diffstat (limited to 'include')
| -rw-r--r-- | include/elna/boot/ast.h | 30 | ||||
| -rw-r--r-- | include/elna/boot/name_analysis.h | 8 | ||||
| -rw-r--r-- | include/elna/boot/validation.h | 16 | ||||
| -rw-r--r-- | include/elna/gcc/elna-generic.h | 5 |
4 files changed, 28 insertions, 31 deletions
diff --git a/include/elna/boot/ast.h b/include/elna/boot/ast.h index 0fc5e32..5d5bdce 100644 --- a/include/elna/boot/ast.h +++ b/include/elna/boot/ast.h @@ -395,13 +395,8 @@ namespace elna::boot /** * Symbol definition. */ - class declaration : public node + class declaration : public virtual node { - protected: - declaration(const source_position position, identifier_definition identifier); - - public: - const identifier_definition identifier; }; /** @@ -591,7 +586,7 @@ namespace elna::boot /** * Variable declaration. */ - class variable_declaration : public node + class variable_declaration : public declaration { std::shared_ptr<type_expression> m_variable_type; @@ -680,7 +675,8 @@ namespace elna::boot procedure_type_expression *m_heading; public: - std::optional<procedure_body> body; + const identifier_definition identifier; + const std::optional<procedure_body> body; /** * Type parameters bound by this declaration. Empty for a plain @@ -707,9 +703,9 @@ namespace elna::boot type_expression *m_underlying_type; public: - /** - * Type parameters bound by this declaration. Empty for a plain type. - */ + const identifier_definition identifier; + + /// Type parameters bound by this declaration. Empty for a plain type. std::vector<elna::boot::identifier> parameters; type_declaration(const source_position position, identifier_definition identifier, @@ -1049,23 +1045,17 @@ namespace elna::boot { public: const std::vector<import_declaration *> imports; - const std::vector<type_declaration *> types; - const std::vector<procedure_declaration *> procedures; - const std::vector<variable_declaration *> variables; + const std::vector<declaration *> declarations; const std::optional<procedure_body> entry_point; const std::vector<identifier> parameters; const std::optional<source_position> entry_position; unit(const source_position position, std::vector<import_declaration *>&& imports, - std::vector<type_declaration *>&& types, - std::vector<variable_declaration *>&& variables, - std::vector<procedure_declaration *>&& procedures); + std::vector<declaration *>&& declarations); unit(const source_position position, std::vector<import_declaration *>&& imports, - std::vector<type_declaration *>&& types, - std::vector<variable_declaration *>&& variables, - std::vector<procedure_declaration *>&& procedures, + std::vector<declaration *>&& declarations, std::vector<identifier>&& parameters, const source_position entry_position, std::optional<procedure_body>&& body); diff --git a/include/elna/boot/name_analysis.h b/include/elna/boot/name_analysis.h index 73f0a66..eff122b 100644 --- a/include/elna/boot/name_analysis.h +++ b/include/elna/boot/name_analysis.h @@ -191,6 +191,8 @@ namespace elna::boot void visit(unit *unit) override; void visit(type_declaration *declaration) override; + void visit(variable_declaration *) override; + void visit(procedure_declaration *) override; }; /** @@ -293,8 +295,6 @@ namespace elna::boot type lookup_field(const type& composite_type, const std::string& field_name); public: - void visit(variable_declaration *declaration) override; - void visit(array_type_expression *expression) override; void visit(slice_type_expression *expression) override; void visit(pointer_type_expression *expression) override; @@ -367,6 +367,7 @@ namespace elna::boot void visit(unit *unit) override; void visit(type_declaration *declaration) override; + void visit(variable_declaration *declaration) override; void visit(procedure_declaration *declaration) override; [[noreturn]] void visit(for_statement *) override; @@ -385,7 +386,8 @@ namespace elna::boot const std::filesystem::path& module_path); void visit(unit *unit) override; - [[noreturn]] void visit(type_declaration *) override; + void visit(type_declaration *) override; + void visit(variable_declaration *declaration) override; void visit(procedure_declaration *declaration) override; void visit(for_statement *statement) override; diff --git a/include/elna/boot/validation.h b/include/elna/boot/validation.h index c99ce07..8598ada 100644 --- a/include/elna/boot/validation.h +++ b/include/elna/boot/validation.h @@ -48,19 +48,23 @@ namespace elna::boot symbol_bag& bag; evaluator constant_evaluator; + void visit_statements(const std::vector<statement *>& statements); + public: validation_visitor(symbol_bag& bag, const target_info& target); void visit(unit *unit) override; + void visit(type_declaration *declaration) override; + void visit(variable_declaration *) override; void visit(procedure_declaration *declaration) override; - void visit(case_statement *statement) override; + void visit(case_statement *statement) override; void visit(assign_statement *) override; - void visit(if_statement *) override; - void visit(while_statement *) override; - void visit(repeat_statement *) override; - void visit(for_statement *) override; - void visit(defer_statement *) override; + void visit(if_statement *statement) override; + void visit(while_statement *statement) override; + void visit(repeat_statement *statement) override; + void visit(for_statement *statement) override; + void visit(defer_statement *statement) override; void visit(empty_statement *) override; void visit(procedure_call *) override; }; diff --git a/include/elna/gcc/elna-generic.h b/include/elna/gcc/elna-generic.h index d67f3c9..fbd68d8 100644 --- a/include/elna/gcc/elna-generic.h +++ b/include/elna/gcc/elna-generic.h @@ -71,7 +71,9 @@ namespace elna::gcc generic_visitor(const std::shared_ptr<symbol_table>& symbol_table, elna::boot::symbol_bag bag, const elna::boot::target_info& target); - void visit(boot::procedure_declaration *declaration) override; + void visit(boot::type_declaration *) override; + void visit(boot::variable_declaration *declaration) override; + void visit(boot::procedure_declaration *) override; void visit(boot::procedure_call *call) override; void visit(boot::cast_expression *expression) override; void visit(boot::literal<boot::integer_literal> *literal) override; @@ -83,7 +85,6 @@ namespace elna::gcc void visit(boot::traits_expression *trait) override; void visit(boot::binary_expression *expression) override; void visit(boot::unary_expression *expression) override; - void visit(boot::variable_declaration *declaration) override; void visit(boot::named_expression *expression) override; void visit(boot::array_access_expression *expression) override; void visit(boot::field_access_expression *expression) override; |
