Support one hardcoded import
This commit is contained in:
@ -74,9 +74,8 @@ namespace elna::boot
|
||||
return message;
|
||||
}
|
||||
|
||||
name_analysis_visitor::name_analysis_visitor(const char *path, std::shared_ptr<symbol_table> symbols,
|
||||
std::unordered_map<std::string, std::shared_ptr<alias_type>>&& unresolved)
|
||||
: error_container(path), symbols(symbols), unresolved(std::move(unresolved))
|
||||
name_analysis_visitor::name_analysis_visitor(const char *path, symbol_bag bag)
|
||||
: error_container(path), bag(bag)
|
||||
{
|
||||
}
|
||||
|
||||
@ -120,20 +119,20 @@ namespace elna::boot
|
||||
void name_analysis_visitor::visit(type_declaration *definition)
|
||||
{
|
||||
definition->body().accept(this);
|
||||
auto unresolved_declaration = this->unresolved.at(definition->identifier.identifier);
|
||||
auto unresolved_declaration = this->bag.unresolved.at(definition->identifier.identifier);
|
||||
|
||||
unresolved_declaration->reference = this->current_type;
|
||||
}
|
||||
|
||||
void name_analysis_visitor::visit(named_type_expression *type_expression)
|
||||
{
|
||||
auto unresolved_alias = this->unresolved.find(type_expression->name);
|
||||
auto unresolved_alias = this->bag.unresolved.find(type_expression->name);
|
||||
|
||||
if (unresolved_alias != this->unresolved.end())
|
||||
if (unresolved_alias != this->bag.unresolved.end())
|
||||
{
|
||||
this->current_type = type(unresolved_alias->second);
|
||||
}
|
||||
else if (auto from_symbol_table = this->symbols->lookup(type_expression->name))
|
||||
else if (auto from_symbol_table = this->bag.lookup(type_expression->name))
|
||||
{
|
||||
this->current_type = from_symbol_table->is_type()->symbol;
|
||||
}
|
||||
@ -214,28 +213,24 @@ namespace elna::boot
|
||||
{
|
||||
declaration->variable_type().accept(this);
|
||||
|
||||
this->symbols->enter(declaration->identifier.identifier,
|
||||
std::make_shared<variable_info>(this->current_type));
|
||||
this->bag.enter(declaration->identifier.identifier, std::make_shared<variable_info>(this->current_type));
|
||||
}
|
||||
|
||||
void name_analysis_visitor::visit(constant_declaration *definition)
|
||||
{
|
||||
definition->body().accept(this);
|
||||
|
||||
this->symbols->enter(definition->identifier.identifier,
|
||||
std::make_shared<constant_info>(this->current_literal));
|
||||
this->bag.enter(definition->identifier.identifier, std::make_shared<constant_info>(this->current_literal));
|
||||
}
|
||||
|
||||
void name_analysis_visitor::visit(procedure_declaration *definition)
|
||||
{
|
||||
std::shared_ptr<procedure_info> info;
|
||||
auto heading = build_procedure(definition->heading());
|
||||
|
||||
if (definition->body.has_value())
|
||||
{
|
||||
info = std::make_shared<procedure_info>(build_procedure(definition->heading()),
|
||||
definition->parameter_names, this->symbols);
|
||||
|
||||
this->symbols = info->symbols;
|
||||
info = std::make_shared<procedure_info>(heading, definition->parameter_names, this->bag.enter());
|
||||
|
||||
for (constant_declaration *const constant : definition->body.value().constants())
|
||||
{
|
||||
@ -249,14 +244,13 @@ namespace elna::boot
|
||||
{
|
||||
statement->accept(this);
|
||||
}
|
||||
this->symbols = this->symbols->scope();
|
||||
this->bag.leave();
|
||||
}
|
||||
else
|
||||
{
|
||||
info = std::make_shared<procedure_info>(build_procedure(definition->heading()),
|
||||
definition->parameter_names);
|
||||
info = std::make_shared<procedure_info>(heading, definition->parameter_names);
|
||||
}
|
||||
this->symbols->enter(definition->identifier.identifier, info);
|
||||
this->bag.enter(definition->identifier.identifier, info);
|
||||
}
|
||||
|
||||
void name_analysis_visitor::visit(assign_statement *statement)
|
||||
@ -379,14 +373,14 @@ namespace elna::boot
|
||||
{
|
||||
type->accept(this);
|
||||
}
|
||||
for (auto& unresolved : this->unresolved)
|
||||
for (auto& unresolved : this->bag.unresolved)
|
||||
{
|
||||
std::vector<std::string> path;
|
||||
|
||||
if (check_unresolved_symbol(unresolved.second, path))
|
||||
{
|
||||
auto info = std::make_shared<type_info>(type_info(type(unresolved.second)));
|
||||
this->symbols->enter(std::move(unresolved.first), info);
|
||||
this->bag.enter(unresolved.first, info);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Reference in New Issue
Block a user