Parse interfaces with leading newlines

Closes #2420
This commit is contained in:
ayazhafiz 2022-01-29 23:52:00 -05:00
parent eb17d88ebb
commit 8ae2d9d407
4 changed files with 55 additions and 34 deletions

View file

@ -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)]

View file

@ -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: [],
},
}

View file

@ -0,0 +1,2 @@
interface T exposes [] imports []

View file

@ -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,