diff --git a/compiler/parse/src/module.rs b/compiler/parse/src/module.rs index 0852be36ee..42031bad83 100644 --- a/compiler/parse/src/module.rs +++ b/compiler/parse/src/module.rs @@ -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 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 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 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 Module<'a>> + )| { make_header(spaces) } + ) } #[inline(always)] diff --git a/compiler/parse/tests/snapshots/pass/interface_with_newline.header.result-ast b/compiler/parse/tests/snapshots/pass/interface_with_newline.header.result-ast new file mode 100644 index 0000000000..fe67388046 --- /dev/null +++ b/compiler/parse/tests/snapshots/pass/interface_with_newline.header.result-ast @@ -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: [], + }, +} diff --git a/compiler/parse/tests/snapshots/pass/interface_with_newline.header.roc b/compiler/parse/tests/snapshots/pass/interface_with_newline.header.roc new file mode 100644 index 0000000000..696cdada15 --- /dev/null +++ b/compiler/parse/tests/snapshots/pass/interface_with_newline.header.roc @@ -0,0 +1,2 @@ + +interface T exposes [] imports [] diff --git a/compiler/parse/tests/test_parse.rs b/compiler/parse/tests/test_parse.rs index d575d677a1..0aaf95b559 100644 --- a/compiler/parse/tests/test_parse.rs +++ b/compiler/parse/tests/test_parse.rs @@ -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,