diff --git a/compiler/fmt/src/module.rs b/compiler/fmt/src/module.rs index aa856ca8ca..6ceca3d28c 100644 --- a/compiler/fmt/src/module.rs +++ b/compiler/fmt/src/module.rs @@ -175,7 +175,7 @@ fn fmt_imports_entry<'a>(buf: &mut String<'a>, entry: &'a ImportsEntry<'a>, inde } } - Package(_name, _entries) => { + Package(_pkg, _name, _entries) => { todo!("TODO Format imported package"); } diff --git a/compiler/load/src/file.rs b/compiler/load/src/file.rs index f3cba328a6..0175e0bb77 100644 --- a/compiler/load/src/file.rs +++ b/compiler/load/src/file.rs @@ -2796,7 +2796,7 @@ fn exposed_from_import(entry: &ImportsEntry<'_>) -> (ModuleName, Vec) { (module_name.as_str().into(), exposed) } - Package(_package_name, _exposes) => { + Package(_package_name, _module_name, _exposes) => { todo!("TODO support exposing package-qualified module names."); } diff --git a/compiler/parse/src/module.rs b/compiler/parse/src/module.rs index fff9a6a94f..800e3aab4f 100644 --- a/compiler/parse/src/module.rs +++ b/compiler/parse/src/module.rs @@ -547,8 +547,12 @@ fn typed_ident<'a>() -> impl Parser<'a, TypedIdent<'a>> { fn imports_entry<'a>() -> impl Parser<'a, ImportsEntry<'a>> { map_with_arena!( and!( - // e.g. `Task` - module_name(), + and!( + // e.g. `base.` + optional(skip_second!(lowercase_ident(), ascii_char(b'.'))), + // e.g. `Task` + module_name() + ), // e.g. `.{ Task, after}` optional(skip_first!( ascii_char(b'.'), @@ -562,13 +566,17 @@ fn imports_entry<'a>() -> impl Parser<'a, ImportsEntry<'a>> { )) ), |arena, - (module_name, opt_values): ( - ModuleName<'a>, + ((opt_shortname, module_name), opt_values): ( + (Option<&'a str>, ModuleName<'a>), Option>>> )| { let exposed_values = opt_values.unwrap_or_else(|| Vec::new_in(arena)); - ImportsEntry::Module(module_name, exposed_values) + match opt_shortname { + Some(shortname) => ImportsEntry::Package(shortname, module_name, exposed_values), + + None => ImportsEntry::Module(module_name, exposed_values), + } } ) }