diff options
Diffstat (limited to 'boot/name_analysis.cc')
| -rw-r--r-- | boot/name_analysis.cc | 128 |
1 files changed, 78 insertions, 50 deletions
diff --git a/boot/name_analysis.cc b/boot/name_analysis.cc index 4a1a0ca..d5b2e91 100644 --- a/boot/name_analysis.cc +++ b/boot/name_analysis.cc @@ -278,9 +278,9 @@ namespace elna::boot void forward_declaration_visitor::visit(unit *unit) { - for (type_declaration *const type : unit->types) + for (auto *const unit_declaration: unit->declarations) { - type->accept(this); + unit_declaration->accept(this); } } @@ -296,6 +296,14 @@ namespace elna::boot } } + void forward_declaration_visitor::visit(variable_declaration *) + { + } + + void forward_declaration_visitor::visit(procedure_declaration *) + { + } + resolving_visitor::resolving_visitor(symbol_bag& bag, const target_info& target, const std::filesystem::path& module_path) : bag(bag), constant_evaluator(this->bag, target), module_file(module_path) @@ -502,41 +510,6 @@ namespace elna::boot return type(); } - void resolving_visitor::visit(variable_declaration *declaration) - { - const type variable_type = resolve_type(declaration->variable_type()); - std::optional<constant_value> computed; - - if (declaration->initializer != nullptr) - { - declaration->initializer->accept(this); - computed = this->constant_evaluator.evaluate(*declaration->initializer); - - if (this->bag.is_global() && !computed.has_value()) - { - add_error<non_constant_expression_error>(declaration->initializer->position(), - non_constant_expression_error::initializer{ extract_identifiers(declaration->identifiers) }); - } - } - else if (!declaration->is_extern && resolve_aliases(variable_type).get<constant_type>() != nullptr) - { - auto position_span = source_position( - declaration->identifiers.front().id().position().start(), - declaration->identifiers.back().id().position().end()); - add_error<declaration_format_error>(position_span, - declaration_format_error::not_initialized{ extract_identifiers(declaration->identifiers) }); - } - for (const auto& variable_identifier : declaration->identifiers) - { - auto variable_symbol = register_variable(variable_identifier.name(), - variable_type, declaration->position(), declaration->is_extern); - variable_symbol->exported = variable_identifier.exported(); - variable_symbol->alignment = - evaluate_attributes<attribute_kind::aligned>(variable_identifier.attributes).alignment; - variable_symbol->value = computed; - } - } - std::vector<type> resolving_visitor::enter_parameters(const std::vector<identifier>& parameters) { std::vector<type> result; @@ -1324,17 +1297,9 @@ namespace elna::boot void declaration_visitor::visit(unit *unit) { - for (type_declaration *const type : unit->types) + for (declaration *const unit_declaration : unit->declarations) { - type->accept(this); - } - for (variable_declaration *const variable : unit->variables) - { - variable->accept(this); - } - for (procedure_declaration *const procedure : unit->procedures) - { - procedure->accept(this); + unit_declaration->accept(this); } if (unit->entry_point.has_value()) { @@ -1422,6 +1387,41 @@ namespace elna::boot } } + void declaration_visitor::visit(variable_declaration *declaration) + { + const type variable_type = resolve_type(declaration->variable_type()); + std::optional<constant_value> computed; + + if (declaration->initializer != nullptr) + { + declaration->initializer->accept(this); + computed = this->constant_evaluator.evaluate(*declaration->initializer); + + if (!computed.has_value()) + { + add_error<non_constant_expression_error>(declaration->initializer->position(), + non_constant_expression_error::initializer{ extract_identifiers(declaration->identifiers) }); + } + } + else if (!declaration->is_extern && resolve_aliases(variable_type).get<constant_type>() != nullptr) + { + auto position_span = source_position( + declaration->identifiers.front().id().position().start(), + declaration->identifiers.back().id().position().end()); + add_error<declaration_format_error>(position_span, + declaration_format_error::not_initialized{ extract_identifiers(declaration->identifiers) }); + } + for (const auto& variable_identifier : declaration->identifiers) + { + auto variable_symbol = register_variable(variable_identifier.name(), + variable_type, declaration->position(), declaration->is_extern); + variable_symbol->exported = variable_identifier.exported(); + variable_symbol->alignment = + evaluate_attributes<attribute_kind::aligned>(variable_identifier.attributes).alignment; + variable_symbol->value = computed; + } + } + void declaration_visitor::visit(procedure_declaration *declaration) { // The scope is opened before the heading is built so that the type @@ -1482,9 +1482,9 @@ namespace elna::boot void name_analysis_visitor::visit(unit *unit) { - for (procedure_declaration *const procedure : unit->procedures) + for (declaration *const unit_declaration : unit->declarations) { - procedure->accept(this); + unit_declaration->accept(this); } if (unit->entry_point.has_value()) { @@ -1498,7 +1498,35 @@ namespace elna::boot void name_analysis_visitor::visit(type_declaration *) { - __builtin_unreachable(); + } + + void name_analysis_visitor::visit(variable_declaration *declaration) + { + if (!this->bag.is_global()) + { + const type variable_type = resolve_type(declaration->variable_type()); + + if (declaration->initializer != nullptr) + { + declaration->initializer->accept(this); + } + else if (resolve_aliases(variable_type).get<constant_type>() != nullptr) + { + auto position_span = source_position( + declaration->identifiers.front().id().position().start(), + declaration->identifiers.back().id().position().end()); + add_error<declaration_format_error>(position_span, + declaration_format_error::not_initialized{ extract_identifiers(declaration->identifiers) }); + } + for (const auto& variable_identifier : declaration->identifiers) + { + auto variable_symbol = register_variable(variable_identifier.name(), + variable_type, declaration->position(), declaration->is_extern); + variable_symbol->exported = variable_identifier.exported(); + variable_symbol->alignment = + evaluate_attributes<attribute_kind::aligned>(variable_identifier.attributes).alignment; + } + } } void name_analysis_visitor::visit(procedure_declaration *declaration) |
