From 505effd1d9f3e57fa3c408c8c7de42447c2c7cb0 Mon Sep 17 00:00:00 2001 From: Stoeffel Date: Wed, 8 Jan 2020 08:53:48 +0100 Subject: [PATCH] basic parsing of alternative cases in when .. in --- src/parse/mod.rs | 10 ++++++---- tests/test_parse.rs | 11 ++++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 5a0129f9b7..d5db05ccb2 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -889,6 +889,11 @@ pub fn case_branches<'a>( space1_before(loc!(pattern(min_indent)), min_indent).parse(arena, state)?; let original_indent = state.indent_col; let indented_more = original_indent + 1; + let (loc_first_pattern_alt, state) = zero_or_more!(skip_first!( + and!(space1(min_indent), char('|')), + space1_before(loc!(pattern(min_indent)), min_indent) + )) + .parse(arena, state)?; let (spaces_before_arrow, state) = space0(min_indent).parse(arena, state)?; // Record the spaces before the first "->", if any. @@ -912,10 +917,7 @@ pub fn case_branches<'a>( .parse(arena, state)?; // Record this as the first branch, then optionally parse additional branches. - branches.push(arena.alloc(( - (loc_first_pattern, Vec::with_capacity_in(0, arena)), - loc_first_expr, - ))); + branches.push(arena.alloc(((loc_first_pattern, loc_first_pattern_alt), loc_first_expr))); let branch_parser = and!( then( diff --git a/tests/test_parse.rs b/tests/test_parse.rs index e1df6c36f8..d909f27591 100644 --- a/tests/test_parse.rs +++ b/tests/test_parse.rs @@ -1361,10 +1361,15 @@ mod test_parse { let newlines = bumpalo::vec![in &arena; Newline]; let pattern1 = Pattern::SpaceBefore(arena.alloc(StrLiteral("blah")), newlines.into_bump_slice()); + let pattern1_alt = StrLiteral("blop"); // TODO retain spacebefore let loc_pattern1 = Located::new(1, 1, 1, 7, pattern1); + let loc_pattern1_alt = Located::new(1, 1, 10, 16, pattern1_alt); let expr1 = Int("1"); - let loc_expr1 = Located::new(1, 1, 11, 12, expr1); - let branch1 = &*arena.alloc(((loc_pattern1, bumpalo::vec![in &arena;]), loc_expr1)); + let loc_expr1 = Located::new(1, 1, 20, 21, expr1); + let branch1 = &*arena.alloc(( + (loc_pattern1, bumpalo::vec![in &arena;loc_pattern1_alt]), + loc_expr1, + )); let newlines = bumpalo::vec![in &arena; Newline]; let pattern2 = Pattern::SpaceBefore(arena.alloc(StrLiteral("mise")), newlines.into_bump_slice()); @@ -1380,7 +1385,7 @@ mod test_parse { indoc!( r#" when x is - "blah" -> 1 + "blah" | "blop" -> 1 "mise" -> 2 "# ),