diff --git a/compiler/parse/src/expr.rs b/compiler/parse/src/expr.rs index 1c6256bdfe..4d0654b31f 100644 --- a/compiler/parse/src/expr.rs +++ b/compiler/parse/src/expr.rs @@ -2,7 +2,9 @@ use crate::ast::{ AssignedField, Collection, CommentOrNewline, Def, Expr, ExtractSpaces, Has, Pattern, Spaceable, TypeAnnotation, TypeDef, TypeHeader, ValueDef, }; -use crate::blankspace::{space0_after_e, space0_around_ee, space0_before_e, space0_e}; +use crate::blankspace::{ + space0_after_e, space0_around_ee, space0_before_e, space0_before_optional_after, space0_e, +}; use crate::ident::{lowercase_ident, parse_ident, Ident}; use crate::keyword; use crate::parser::{ @@ -2591,14 +2593,15 @@ fn record_help<'a>( and!( trailing_sep_by0( word1(b',', ERecord::End), - space0_around_ee( + space0_before_optional_after( loc!(record_field_help(min_indent)), min_indent, ERecord::IndentEnd, ERecord::IndentEnd ), ), - space0_e(min_indent, ERecord::IndentEnd) + // Allow outdented closing braces + space0_e(0, ERecord::IndentEnd) ), word1(b'}', ERecord::End) ) diff --git a/compiler/parse/tests/snapshots/pass/outdented_app_with_record.expr.result-ast b/compiler/parse/tests/snapshots/pass/outdented_app_with_record.expr.result-ast new file mode 100644 index 0000000000..4df43e0d86 --- /dev/null +++ b/compiler/parse/tests/snapshots/pass/outdented_app_with_record.expr.result-ast @@ -0,0 +1,62 @@ +Defs( + [ + @0-29 Value( + Body( + @0-1 Identifier( + "x", + ), + @4-29 Apply( + @4-7 Var { + module_name: "", + ident: "foo", + }, + [ + @9-28 ParensAround( + Apply( + @9-12 Var { + module_name: "", + ident: "baz", + }, + [ + @13-28 Record( + Collection { + items: [ + @17-26 SpaceBefore( + RequiredValue( + @17-20 "bar", + [], + @22-26 Var { + module_name: "", + ident: "blah", + }, + ), + [ + Newline, + ], + ), + ], + final_comments: [ + Newline, + ], + }, + ), + ], + Space, + ), + ), + ], + Space, + ), + ), + ), + ], + @30-31 SpaceBefore( + Var { + module_name: "", + ident: "x", + }, + [ + Newline, + ], + ), +) diff --git a/compiler/parse/tests/snapshots/pass/outdented_app_with_record.expr.roc b/compiler/parse/tests/snapshots/pass/outdented_app_with_record.expr.roc new file mode 100644 index 0000000000..2f87899d3e --- /dev/null +++ b/compiler/parse/tests/snapshots/pass/outdented_app_with_record.expr.roc @@ -0,0 +1,4 @@ +x = foo (baz { + bar: blah +}) +x diff --git a/compiler/parse/tests/snapshots/pass/outdented_list.expr.result-ast b/compiler/parse/tests/snapshots/pass/outdented_list.expr.result-ast new file mode 100644 index 0000000000..d7db49650a --- /dev/null +++ b/compiler/parse/tests/snapshots/pass/outdented_list.expr.result-ast @@ -0,0 +1,43 @@ +Defs( + [ + @0-17 Value( + Body( + @0-1 Identifier( + "a", + ), + @4-17 List( + Collection { + items: [ + @8-9 SpaceBefore( + Num( + "1", + ), + [ + Newline, + ], + ), + @11-12 Num( + "2", + ), + @14-15 Num( + "3", + ), + ], + final_comments: [ + Newline, + ], + }, + ), + ), + ), + ], + @18-19 SpaceBefore( + Var { + module_name: "", + ident: "a", + }, + [ + Newline, + ], + ), +) diff --git a/compiler/parse/tests/snapshots/pass/outdented_list.expr.roc b/compiler/parse/tests/snapshots/pass/outdented_list.expr.roc new file mode 100644 index 0000000000..d5ae4d79bc --- /dev/null +++ b/compiler/parse/tests/snapshots/pass/outdented_list.expr.roc @@ -0,0 +1,4 @@ +a = [ + 1, 2, 3 +] +a diff --git a/compiler/parse/tests/snapshots/pass/outdented_record.expr.result-ast b/compiler/parse/tests/snapshots/pass/outdented_record.expr.result-ast new file mode 100644 index 0000000000..119d0dc5be --- /dev/null +++ b/compiler/parse/tests/snapshots/pass/outdented_record.expr.result-ast @@ -0,0 +1,51 @@ +Defs( + [ + @0-23 Value( + Body( + @0-1 Identifier( + "x", + ), + @4-23 Apply( + @4-7 Var { + module_name: "", + ident: "foo", + }, + [ + @8-23 Record( + Collection { + items: [ + @12-21 SpaceBefore( + RequiredValue( + @12-15 "bar", + [], + @17-21 Var { + module_name: "", + ident: "blah", + }, + ), + [ + Newline, + ], + ), + ], + final_comments: [ + Newline, + ], + }, + ), + ], + Space, + ), + ), + ), + ], + @24-25 SpaceBefore( + Var { + module_name: "", + ident: "x", + }, + [ + Newline, + ], + ), +) diff --git a/compiler/parse/tests/snapshots/pass/outdented_record.expr.roc b/compiler/parse/tests/snapshots/pass/outdented_record.expr.roc new file mode 100644 index 0000000000..b344f9df89 --- /dev/null +++ b/compiler/parse/tests/snapshots/pass/outdented_record.expr.roc @@ -0,0 +1,4 @@ +x = foo { + bar: blah +} +x diff --git a/compiler/parse/tests/test_parse.rs b/compiler/parse/tests/test_parse.rs index 522c89c7c6..759276523c 100644 --- a/compiler/parse/tests/test_parse.rs +++ b/compiler/parse/tests/test_parse.rs @@ -218,6 +218,9 @@ mod test_parse { pass/opaque_reference_pattern.expr, pass/opaque_reference_pattern_with_arguments.expr, pass/ops_with_newlines.expr, + pass/outdented_list.expr, + pass/outdented_record.expr, + pass/outdented_app_with_record.expr, pass/packed_singleton_list.expr, pass/parenthetical_apply.expr, pass/parenthetical_basic_field.expr,