Support package-qualified imports

This commit is contained in:
Richard Feldman 2020-11-26 21:07:57 -05:00
parent b70f265242
commit d0c651726d
3 changed files with 15 additions and 7 deletions

View file

@ -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"); todo!("TODO Format imported package");
} }

View file

@ -2796,7 +2796,7 @@ fn exposed_from_import(entry: &ImportsEntry<'_>) -> (ModuleName, Vec<Ident>) {
(module_name.as_str().into(), exposed) (module_name.as_str().into(), exposed)
} }
Package(_package_name, _exposes) => { Package(_package_name, _module_name, _exposes) => {
todo!("TODO support exposing package-qualified module names."); todo!("TODO support exposing package-qualified module names.");
} }

View file

@ -547,8 +547,12 @@ fn typed_ident<'a>() -> impl Parser<'a, TypedIdent<'a>> {
fn imports_entry<'a>() -> impl Parser<'a, ImportsEntry<'a>> { fn imports_entry<'a>() -> impl Parser<'a, ImportsEntry<'a>> {
map_with_arena!( map_with_arena!(
and!( and!(
// e.g. `Task` and!(
module_name(), // e.g. `base.`
optional(skip_second!(lowercase_ident(), ascii_char(b'.'))),
// e.g. `Task`
module_name()
),
// e.g. `.{ Task, after}` // e.g. `.{ Task, after}`
optional(skip_first!( optional(skip_first!(
ascii_char(b'.'), ascii_char(b'.'),
@ -562,13 +566,17 @@ fn imports_entry<'a>() -> impl Parser<'a, ImportsEntry<'a>> {
)) ))
), ),
|arena, |arena,
(module_name, opt_values): ( ((opt_shortname, module_name), opt_values): (
ModuleName<'a>, (Option<&'a str>, ModuleName<'a>),
Option<Vec<'a, Located<ExposesEntry<'a, &'a str>>>> Option<Vec<'a, Located<ExposesEntry<'a, &'a str>>>>
)| { )| {
let exposed_values = opt_values.unwrap_or_else(|| Vec::new_in(arena)); 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),
}
} }
) )
} }