diff --git a/crates/compiler/parse/src/expr.rs b/crates/compiler/parse/src/expr.rs index 1f9136c26d..6ab10b4fc9 100644 --- a/crates/compiler/parse/src/expr.rs +++ b/crates/compiler/parse/src/expr.rs @@ -2125,6 +2125,7 @@ fn expr_to_pattern_help<'a>(arena: &'a Bump, expr: &Expr<'a>) -> Result( Stmt::Expr(Expr::Return(return_value, _after_return)) => { if i == stmts.len() - 1 { let region = sp_stmt.item.region; - last_expr = Some( + last_expr = Some(Loc::at( + region, arena .alloc(Expr::Return(return_value, None)) - .with_spaces_before(sp_stmt.before, region), - ); + .maybe_before(arena, sp_stmt.before), + )); } else { let region = Region::span_across( &sp_stmt.item.region, &stmts[stmts.len() - 1].item.region, ); let rest = stmts_to_expr(&stmts[i + 1..], arena)?; - last_expr = Some( + last_expr = Some(Loc::at( + region, arena .alloc(Expr::Return(return_value, Some(arena.alloc(rest)))) - .with_spaces_before(sp_stmt.before, region), - ); + .maybe_before(arena, sp_stmt.before), + )); } // don't re-process the rest of the statements, they got consumed by the early return diff --git a/crates/compiler/test_syntax/tests/snapshots/fail/return_in_pat.expr.result-ast b/crates/compiler/test_syntax/tests/snapshots/fail/return_in_pat.expr.result-ast new file mode 100644 index 0000000000..0ffbe037c9 --- /dev/null +++ b/crates/compiler/test_syntax/tests/snapshots/fail/return_in_pat.expr.result-ast @@ -0,0 +1 @@ +Expr(BadOperator("=", @13), @0) \ No newline at end of file diff --git a/crates/compiler/test_syntax/tests/snapshots/fail/return_in_pat.expr.roc b/crates/compiler/test_syntax/tests/snapshots/fail/return_in_pat.expr.roc new file mode 100644 index 0000000000..198f351342 --- /dev/null +++ b/crates/compiler/test_syntax/tests/snapshots/fail/return_in_pat.expr.roc @@ -0,0 +1,3 @@ +( +return e +t)=t diff --git a/crates/compiler/test_syntax/tests/snapshots/pass/return_minus_one.expr.result-ast b/crates/compiler/test_syntax/tests/snapshots/pass/return_minus_one.expr.result-ast index f9914b9324..47c7d77aea 100644 --- a/crates/compiler/test_syntax/tests/snapshots/pass/return_minus_one.expr.result-ast +++ b/crates/compiler/test_syntax/tests/snapshots/pass/return_minus_one.expr.result-ast @@ -1,22 +1,19 @@ -@0-10 SpaceBefore( - Return( - @0-8 UnaryOp( - @7-8 Var { - module_name: "", - ident: "r", - }, - @6-7 Negate, - ), - Some( - @9-10 SpaceBefore( - Num( - "1", - ), - [ - Newline, - ], +@0-10 Return( + @0-8 UnaryOp( + @7-8 Var { + module_name: "", + ident: "r", + }, + @6-7 Negate, + ), + Some( + @9-10 SpaceBefore( + Num( + "1", ), + [ + Newline, + ], ), ), - [], ) diff --git a/crates/compiler/test_syntax/tests/snapshots/pass/return_then_nested_parens.expr.result-ast b/crates/compiler/test_syntax/tests/snapshots/pass/return_then_nested_parens.expr.result-ast index 6dac2cfe69..9fa302f53c 100644 --- a/crates/compiler/test_syntax/tests/snapshots/pass/return_then_nested_parens.expr.result-ast +++ b/crates/compiler/test_syntax/tests/snapshots/pass/return_then_nested_parens.expr.result-ast @@ -1,38 +1,35 @@ @0-17 SpaceAfter( - SpaceBefore( - Return( - @0-8 Var { - module_name: "", - ident: "n", - }, - Some( - @9-17 SpaceBefore( - ParensAround( - SpaceAfter( - ParensAround( - SpaceAfter( - Num( - "0", - ), - [ - Newline, - ], + Return( + @0-8 Var { + module_name: "", + ident: "n", + }, + Some( + @9-17 SpaceBefore( + ParensAround( + SpaceAfter( + ParensAround( + SpaceAfter( + Num( + "0", ), + [ + Newline, + ], ), - [ - LineComment( - "", - ), - ], ), + [ + LineComment( + "", + ), + ], ), - [ - Newline, - ], ), + [ + Newline, + ], ), ), - [], ), [ Newline, diff --git a/crates/compiler/test_syntax/tests/snapshots/pass/return_with_after.expr.result-ast b/crates/compiler/test_syntax/tests/snapshots/pass/return_with_after.expr.result-ast index 0dc9bc9d4c..9b1c30ea05 100644 --- a/crates/compiler/test_syntax/tests/snapshots/pass/return_with_after.expr.result-ast +++ b/crates/compiler/test_syntax/tests/snapshots/pass/return_with_after.expr.result-ast @@ -1,48 +1,45 @@ -@0-13 SpaceBefore( - Return( - @0-8 Num( - "-1", - ), - Some( - @10-13 Defs( - Defs { - tags: [ - EitherIndex(2147483648), - ], - regions: [ - @10-11, - ], - space_before: [ - Slice { start: 0, length: 1 }, - ], - space_after: [ - Slice { start: 1, length: 0 }, - ], - spaces: [ - LineComment( - "", +@0-13 Return( + @0-8 Num( + "-1", + ), + Some( + @10-13 Defs( + Defs { + tags: [ + EitherIndex(2147483648), + ], + regions: [ + @10-11, + ], + space_before: [ + Slice { start: 0, length: 1 }, + ], + space_after: [ + Slice { start: 1, length: 0 }, + ], + spaces: [ + LineComment( + "", + ), + ], + type_defs: [], + value_defs: [ + Stmt( + @10-11 Tag( + "X", ), - ], - type_defs: [], - value_defs: [ - Stmt( - @10-11 Tag( - "X", - ), - ), - ], + ), + ], + }, + @12-13 SpaceBefore( + Var { + module_name: "", + ident: "s", }, - @12-13 SpaceBefore( - Var { - module_name: "", - ident: "s", - }, - [ - Newline, - ], - ), + [ + Newline, + ], ), ), ), - [], ) diff --git a/crates/compiler/test_syntax/tests/test_snapshots.rs b/crates/compiler/test_syntax/tests/test_snapshots.rs index 11990c2d48..9c252897ec 100644 --- a/crates/compiler/test_syntax/tests/test_snapshots.rs +++ b/crates/compiler/test_syntax/tests/test_snapshots.rs @@ -240,6 +240,7 @@ mod test_snapshots { fail/record_type_open_indent.expr, fail/record_type_tab.expr, fail/return_as_single_line_expr.expr, + fail/return_in_pat.expr, fail/single_no_end.expr, fail/tab_crash.header, fail/tag_union_end.expr,