aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-09-13 16:07:11 +0200
committerEugen Wissner <belka@caraus.de>2026-09-13 16:07:11 +0200
commita5d033df465ca8de8457926cc64aacf38c6ae848 (patch)
treee459e27e808046ea42448768394574f3343f7015 /include
parente72e20e025ab14320c79c2dca75721a0a5e002bd (diff)
downloadelna-a5d033df465ca8de8457926cc64aacf38c6ae848.tar.gz
Visit nested statements in validation visitor
Diffstat (limited to 'include')
-rw-r--r--include/elna/boot/ast.h30
-rw-r--r--include/elna/boot/name_analysis.h8
-rw-r--r--include/elna/boot/validation.h16
-rw-r--r--include/elna/gcc/elna-generic.h5
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;