mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 06:44:46 +00:00
parent
eb17d88ebb
commit
8ae2d9d407
4 changed files with 55 additions and 34 deletions
|
@ -52,41 +52,44 @@ pub fn parse_header<'a>(
|
|||
fn header<'a>() -> impl Parser<'a, Module<'a>, EHeader<'a>> {
|
||||
use crate::parser::keyword_e;
|
||||
|
||||
one_of![
|
||||
map!(
|
||||
and!(
|
||||
space0_e(0, EHeader::Space, EHeader::IndentStart),
|
||||
skip_first!(keyword_e("app", EHeader::Start), app_header())
|
||||
),
|
||||
|(spaces, mut header): (&'a [CommentOrNewline], AppHeader<'a>)| {
|
||||
header.before_header = spaces;
|
||||
|
||||
Module::App { header }
|
||||
}
|
||||
map!(
|
||||
and!(
|
||||
space0_e(0, EHeader::Space, EHeader::IndentStart),
|
||||
one_of![
|
||||
map!(
|
||||
skip_first!(keyword_e("app", EHeader::Start), app_header()),
|
||||
|mut header: AppHeader<'a>| -> Box<dyn FnOnce(&'a [CommentOrNewline]) -> Module<'a>> {
|
||||
Box::new(|spaces| {
|
||||
header.before_header = spaces;
|
||||
Module::App { header }
|
||||
})
|
||||
}
|
||||
),
|
||||
map!(
|
||||
skip_first!(keyword_e("platform", EHeader::Start), platform_header()),
|
||||
|mut header: PlatformHeader<'a>| -> Box<dyn FnOnce(&'a [CommentOrNewline]) -> Module<'a>> {
|
||||
Box::new(|spaces| {
|
||||
header.before_header = spaces;
|
||||
Module::Platform { header }
|
||||
})
|
||||
}
|
||||
),
|
||||
map!(
|
||||
skip_first!(keyword_e("interface", EHeader::Start), interface_header()),
|
||||
|mut header: InterfaceHeader<'a>| -> Box<dyn FnOnce(&'a [CommentOrNewline]) -> Module<'a>> {
|
||||
Box::new(|spaces| {
|
||||
header.before_header = spaces;
|
||||
Module::Interface { header }
|
||||
})
|
||||
}
|
||||
)
|
||||
]
|
||||
),
|
||||
map!(
|
||||
and!(
|
||||
space0_e(0, EHeader::Space, EHeader::IndentStart),
|
||||
skip_first!(keyword_e("platform", EHeader::Start), platform_header())
|
||||
),
|
||||
|(spaces, mut header): (&'a [CommentOrNewline], PlatformHeader<'a>)| {
|
||||
header.before_header = spaces;
|
||||
|
||||
Module::Platform { header }
|
||||
}
|
||||
),
|
||||
map!(
|
||||
and!(
|
||||
space0_e(0, EHeader::Space, EHeader::IndentStart),
|
||||
skip_first!(keyword_e("interface", EHeader::Start), interface_header())
|
||||
),
|
||||
|(spaces, mut header): (&'a [CommentOrNewline], InterfaceHeader<'a>)| {
|
||||
header.before_header = spaces;
|
||||
|
||||
Module::Interface { header }
|
||||
}
|
||||
)
|
||||
]
|
||||
|(spaces, make_header): (
|
||||
&'a [CommentOrNewline],
|
||||
Box<dyn FnOnce(&'a [CommentOrNewline]) -> Module<'a>>
|
||||
)| { make_header(spaces) }
|
||||
)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
Interface {
|
||||
header: InterfaceHeader {
|
||||
name: @10-11 ModuleName(
|
||||
"T",
|
||||
),
|
||||
exposes: [],
|
||||
imports: [],
|
||||
before_header: [],
|
||||
after_interface_keyword: [],
|
||||
before_exposes: [],
|
||||
after_exposes: [],
|
||||
before_imports: [],
|
||||
after_imports: [],
|
||||
},
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
interface T exposes [] imports []
|
|
@ -148,6 +148,7 @@ mod test_parse {
|
|||
pass/highest_int.expr,
|
||||
pass/if_def.expr,
|
||||
pass/int_with_underscore.expr,
|
||||
pass/interface_with_newline.header,
|
||||
pass/lowest_float.expr,
|
||||
pass/lowest_int.expr,
|
||||
pass/malformed_ident_due_to_underscore.expr,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue