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>> {
|
fn header<'a>() -> impl Parser<'a, Module<'a>, EHeader<'a>> {
|
||||||
use crate::parser::keyword_e;
|
use crate::parser::keyword_e;
|
||||||
|
|
||||||
one_of![
|
map!(
|
||||||
map!(
|
and!(
|
||||||
and!(
|
space0_e(0, EHeader::Space, EHeader::IndentStart),
|
||||||
space0_e(0, EHeader::Space, EHeader::IndentStart),
|
one_of![
|
||||||
skip_first!(keyword_e("app", EHeader::Start), app_header())
|
map!(
|
||||||
),
|
skip_first!(keyword_e("app", EHeader::Start), app_header()),
|
||||||
|(spaces, mut header): (&'a [CommentOrNewline], AppHeader<'a>)| {
|
|mut header: AppHeader<'a>| -> Box<dyn FnOnce(&'a [CommentOrNewline]) -> Module<'a>> {
|
||||||
header.before_header = spaces;
|
Box::new(|spaces| {
|
||||||
|
header.before_header = spaces;
|
||||||
Module::App { header }
|
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!(
|
|(spaces, make_header): (
|
||||||
and!(
|
&'a [CommentOrNewline],
|
||||||
space0_e(0, EHeader::Space, EHeader::IndentStart),
|
Box<dyn FnOnce(&'a [CommentOrNewline]) -> Module<'a>>
|
||||||
skip_first!(keyword_e("platform", EHeader::Start), platform_header())
|
)| { make_header(spaces) }
|
||||||
),
|
)
|
||||||
|(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 }
|
|
||||||
}
|
|
||||||
)
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[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/highest_int.expr,
|
||||||
pass/if_def.expr,
|
pass/if_def.expr,
|
||||||
pass/int_with_underscore.expr,
|
pass/int_with_underscore.expr,
|
||||||
|
pass/interface_with_newline.header,
|
||||||
pass/lowest_float.expr,
|
pass/lowest_float.expr,
|
||||||
pass/lowest_int.expr,
|
pass/lowest_int.expr,
|
||||||
pass/malformed_ident_due_to_underscore.expr,
|
pass/malformed_ident_due_to_underscore.expr,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue