Set up module ids properly

This commit is contained in:
Joshua Warner 2024-12-08 11:12:18 -08:00
parent cbd6d50584
commit 6b636d9539
No known key found for this signature in database
GPG key ID: 89AD497003F93FDD
3 changed files with 34 additions and 8 deletions

View file

@ -896,7 +896,7 @@ impl<'a, 'b> RecursiveValueDefIter<'a, 'b> {
}
}
fn push_pending_from_expr(&mut self, expr: &'b Expr<'a>) {
pub fn push_pending_from_expr(&mut self, expr: &'b Expr<'a>) {
let mut expr_stack = vec![expr];
use Expr::*;

View file

@ -7,7 +7,10 @@ use roc_can::expr::canonicalize_expr;
use roc_can::scope::Scope;
use roc_error_macros::set_panic_not_exit;
use roc_fmt::{annotation::Formattable, header::fmt_header, MigrationFlags};
use roc_module::ident::QualifiedModuleName;
use roc_module::symbol::{IdentIds, Interns, ModuleIds, PackageModuleIds, Symbol};
use roc_parse::ast::RecursiveValueDefIter;
use roc_parse::ast::ValueDef;
use roc_parse::header::parse_module_defs;
use roc_parse::parser::Parser;
use roc_parse::parser::SyntaxError;
@ -146,8 +149,35 @@ impl<'a> Output<'a> {
}
Output::Expr(loc_expr) => {
let mut var_store = VarStore::default();
let qualified_module_ids = PackageModuleIds::default();
let home = ModuleIds::default().get_or_insert(&"Test".into());
let mut imported: Vec<(QualifiedModuleName, Region)> = vec![];
let empty_defs = Defs::default();
let mut it = RecursiveValueDefIter::new(&empty_defs);
it.push_pending_from_expr(&loc_expr.value);
for (def, region) in it {
if let ValueDef::ModuleImport(import) = def {
imported.push((import.name.value.into(), *region));
}
}
let mut module_ids = ModuleIds::default();
let mut qualified_module_ids = PackageModuleIds::default();
let mut dep_idents = IdentIds::exposed_builtins(0);
// Make sure the module_ids has ModuleIds for all our deps,
// then record those ModuleIds in can_module_ids for later.
// For each of our imports, add an entry to deps_by_name
//
// e.g. for `import pf.Foo exposing [bar]`, add `Foo` to deps_by_name
//
// Also build a list of imported_values_to_expose (like `bar` above.)
for (qualified_module_name, _region) in imported.into_iter() {
let pq_module_name = qualified_module_name.into_pq_module_name(None);
let module_id = qualified_module_ids.get_or_insert(&pq_module_name);
dep_idents.get_or_insert(module_id);
}
let home = module_ids.get_or_insert(&"Test".into());
let mut scope = Scope::new(
home,
@ -156,7 +186,6 @@ impl<'a> Output<'a> {
Default::default(),
);
let dep_idents = IdentIds::exposed_builtins(0);
let mut env = Env::new(
arena,
src,

View file

@ -704,10 +704,7 @@ mod test_snapshots {
// This is the current list as of writing.
// We should be driving these down to zero over time.
// Adding this protection in now to avoid accidentally adding more.
"all_the_bangs"
| "import_in_closure_with_curlies_after"
| "inline_import"
| "newline_before_import_curlies" => true,
"all_the_bangs" => true,
// When adding new snapshot tests, strongly prefer fixing any canonicalization panics
// they may run into rather than adding them to this list.