Support one hardcoded import

This commit is contained in:
2025-07-10 00:43:17 +02:00
parent 181b19eefe
commit 22c787f0f5
14 changed files with 195 additions and 115 deletions

View File

@@ -64,53 +64,65 @@ static bool elna_langhook_init(void)
static void elna_parse_file(const char *filename)
{
std::ifstream file{ filename, std::ios::in };
if (!file)
{
fatal_error(UNKNOWN_LOCATION, "cannot open filename %s: %m", filename);
}
elna::boot::dependency_graph outcome = elna::boot::read_sources(file, filename);
std::shared_ptr<elna::boot::symbol_table> info_table = elna::boot::builtin_symbol_table();
std::shared_ptr<elna::gcc::symbol_table> symbol_table = elna::gcc::builtin_symbol_table();
linemap_add(line_table, LC_ENTER, 0, filename, 1);
auto y = std::make_shared<elna::boot::symbol_table>(info_table);
std::ifstream entry_point{ filename, std::ios::in };
if (!entry_point)
{
fatal_error(UNKNOWN_LOCATION, "Cannot open filename %s: %m", filename);
}
elna::boot::dependency outcome = elna::boot::read_sources(entry_point, filename);
if (outcome.has_errors())
{
elna::gcc::report_errors(outcome.errors());
}
else
elna::boot::dependency dependency;
elna::boot::symbol_bag outcome_bag = elna::boot::symbol_bag{ std::move(outcome.unresolved), y };
{
for (const std::unique_ptr<elna::boot::program>& module_tree : outcome.modules)
auto sub_path = "source/" + outcome.tree->imports.front()->segments.front() + ".elna";
auto x = std::make_shared<elna::boot::symbol_table>(info_table);
std::ifstream entry_point{ sub_path, std::ios::in };
if (!entry_point)
{
elna::boot::declaration_visitor declaration_visitor(filename);
declaration_visitor.visit(module_tree.get());
if (declaration_visitor.errors().empty())
{
elna::boot::name_analysis_visitor name_analysis_visitor(filename, info_table,
std::move(declaration_visitor.unresolved));
name_analysis_visitor.visit(module_tree.get());
if (name_analysis_visitor.errors().empty())
{
elna::gcc::rewrite_symbol_table(info_table, symbol_table);
elna::gcc::generic_visitor generic_visitor{ symbol_table, info_table };
generic_visitor.visit(module_tree.get());
}
else
{
elna::gcc::report_errors(name_analysis_visitor.errors());
}
}
else
{
elna::gcc::report_errors(declaration_visitor.errors());
}
fatal_error(UNKNOWN_LOCATION, "Cannot open filename %s: %m", sub_path.c_str());
}
dependency = elna::boot::read_sources(entry_point, sub_path.c_str());
if (dependency.has_errors())
{
elna::gcc::report_errors(dependency.errors());
}
elna::boot::symbol_bag dependency_bag = elna::boot::symbol_bag{ std::move(dependency.unresolved), x };
elna::boot::name_analysis_visitor name_analysis_visitor(sub_path.c_str(), dependency_bag);
dependency.tree->accept(&name_analysis_visitor);
if (!name_analysis_visitor.errors().empty())
{
elna::gcc::report_errors(name_analysis_visitor.errors());
}
linemap_add(line_table, LC_ENTER, 0, sub_path.c_str(), 1);
elna::gcc::rewrite_symbol_table(x, symbol_table);
linemap_add(line_table, LC_LEAVE, 0, NULL, 0);
outcome_bag.add_import(dependency_bag);
}
elna::boot::name_analysis_visitor name_analysis_visitor(filename, outcome_bag);
outcome.tree->accept(&name_analysis_visitor);
if (!name_analysis_visitor.errors().empty())
{
elna::gcc::report_errors(name_analysis_visitor.errors());
}
linemap_add(line_table, LC_ENTER, 0, filename, 1);
elna::gcc::rewrite_symbol_table(y, symbol_table);
elna::gcc::generic_visitor generic_visitor{ symbol_table, outcome_bag };
outcome.tree->accept(&generic_visitor);
linemap_add(line_table, LC_LEAVE, 0, NULL, 0);
}