Module Params' proposal import syntax

I previously implemented the syntax in "Proposal: Module and Package Changes" [1]:

```
import [map, map2] from JsonDecode as JD
```

However, we decided [2] to use the one that appears in "Proposal: Module Params" [3]:

```
import JsonDecode as JD exposing [map, map2]
```

The new implementation also now supports comments and newlines between all the tokens.

[1] https://docs.google.com/document/d/1E_77fO-44BtoBtXoVeWyGh1xN2KRTWTu8q6i25RNNx0/edit
[2] 405410612
[3] https://docs.google.com/document/d/110MwQi7Dpo1Y69ECFXyyvDWzF4OYv1BLojIm08qDTvg/edit
This commit is contained in:
Agus Zubiaga 2023-12-04 09:13:09 -03:00
parent 5cd084b73c
commit c56091ee3e
No known key found for this signature in database
20 changed files with 767 additions and 204 deletions

View file

@ -838,54 +838,53 @@ pub fn parse_single_def<'a>(
}
}
#[inline(always)]
fn import<'a>() -> impl Parser<'a, ValueDef<'a>, EImport> {
map!(
skip_first!(
crate::parser::keyword_e(crate::keyword::IMPORT, EImport::Import),
and!(
crate::parser::keyword_e(crate::keyword::IMPORT, EImport::Import),
spaces()
),
and!(
optional(skip_second!(
skip_second!(
collection_trailing_sep_e!(
word1(b'[', EImport::ExposedListStart),
loc!(import_exposed_name()),
word1(b',', EImport::ExposedListEnd),
word1(b']', EImport::ExposedListEnd),
Spaced::SpaceBefore
),
spaces()
),
skip_second!(
crate::parser::keyword_e(crate::keyword::FROM, EImport::From),
spaces()
)
)),
spaces_around(loc!(map!(
crate::module::module_name_help(EImport::ModuleName),
Spaced::Item
))),
and!(
loc!(crate::module::module_name_help(EImport::ModuleName)),
optional(backtrackable(skip_first!(
optional(skip_first!(
crate::parser::keyword_e(crate::keyword::AS, EImport::As),
spaces_around(loc!(map!(
crate::module::module_name_help(EImport::ModuleName),
Spaced::Item
)))
)),
optional(skip_first!(
crate::parser::keyword_e(crate::keyword::EXPOSING, EImport::Exposing),
and!(
spaces(),
and!(
crate::parser::keyword_e(crate::keyword::AS, EImport::As),
spaces()
collection_trailing_sep_e!(
word1(b'[', EImport::ExposedListStart),
loc!(import_exposed_name()),
word1(b',', EImport::ExposedListEnd),
word1(b']', EImport::ExposedListEnd),
Spaced::SpaceBefore
)
),
loc!(crate::module::module_name_help(EImport::Alias))
)))
)
))
)
)
),
|(exposed, (name, alias)): (
Option<Collection<'a, Loc<Spaced<'a, crate::header::ExposedName<'a>>>>>,
_
|(name, (alias, exposed)): (
Loc<Spaced<'a, crate::header::ModuleName<'a>>>,
(
Option<Loc<Spaced<'a, crate::header::ModuleName<'a>>>>,
Option<(
&'a [CommentOrNewline<'a>],
Collection<'a, Loc<Spaced<'a, crate::header::ExposedName<'a>>>>
)>
)
)| {
ValueDef::ModuleImport {
exposed: exposed.unwrap_or_else(Collection::empty),
name,
alias,
exposed,
}
}
)