From d82accf83d463d98f0510612e5a2bf011baff25c Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Fri, 13 Dec 2024 13:56:46 -0800 Subject: [PATCH] Don't remove empty record assignment if body looks like an expect --- crates/compiler/fmt/src/def.rs | 14 +++++ ...cord_assign_expect_bang.expr.formatted.roc | 2 + ..._record_assign_expect_bang.expr.result-ast | 51 +++++++++++++++++++ .../empty_record_assign_expect_bang.expr.roc | 2 + .../test_syntax/tests/test_snapshots.rs | 1 + 5 files changed, 70 insertions(+) create mode 100644 crates/compiler/test_syntax/tests/snapshots/pass/empty_record_assign_expect_bang.expr.formatted.roc create mode 100644 crates/compiler/test_syntax/tests/snapshots/pass/empty_record_assign_expect_bang.expr.result-ast create mode 100644 crates/compiler/test_syntax/tests/snapshots/pass/empty_record_assign_expect_bang.expr.roc diff --git a/crates/compiler/fmt/src/def.rs b/crates/compiler/fmt/src/def.rs index 8e15498f4f..54ee606beb 100644 --- a/crates/compiler/fmt/src/def.rs +++ b/crates/compiler/fmt/src/def.rs @@ -1034,6 +1034,7 @@ pub fn fmt_body<'a>( && pattern_extracted.after.iter().all(|s| s.is_newline()) && !matches!(body.extract_spaces().item, Expr::Defs(..)) && !matches!(body.extract_spaces().item, Expr::Return(..)) + && !starts_with_expect_ident(body) } else { false }; @@ -1144,6 +1145,19 @@ pub fn fmt_body<'a>( } } +fn starts_with_expect_ident(expr: &Expr<'_>) -> bool { + // We need to be persnickety about not formatting `{}=expect foo` into `expect foo`, + // because `expect` is treated as a keyword at the statement level but not at the expr level. + // If we removed the `{}=` in this case, that would change the meaning + match expr { + Expr::Apply(inner, _, _) => starts_with_expect_ident(&inner.value), + Expr::Var { module_name, ident } => { + module_name.is_empty() && (*ident == "expect" || *ident == "expect!") + } + _ => false, + } +} + pub fn starts_with_block_string_literal(expr: &Expr<'_>) -> bool { match expr { Expr::Str(s) => is_str_multiline(s), diff --git a/crates/compiler/test_syntax/tests/snapshots/pass/empty_record_assign_expect_bang.expr.formatted.roc b/crates/compiler/test_syntax/tests/snapshots/pass/empty_record_assign_expect_bang.expr.formatted.roc new file mode 100644 index 0000000000..0693e6e9f3 --- /dev/null +++ b/crates/compiler/test_syntax/tests/snapshots/pass/empty_record_assign_expect_bang.expr.formatted.roc @@ -0,0 +1,2 @@ +{} = expect! w +0 \ No newline at end of file diff --git a/crates/compiler/test_syntax/tests/snapshots/pass/empty_record_assign_expect_bang.expr.result-ast b/crates/compiler/test_syntax/tests/snapshots/pass/empty_record_assign_expect_bang.expr.result-ast new file mode 100644 index 0000000000..6f75e9a028 --- /dev/null +++ b/crates/compiler/test_syntax/tests/snapshots/pass/empty_record_assign_expect_bang.expr.result-ast @@ -0,0 +1,51 @@ +@0-13 SpaceAfter( + Defs( + Defs { + tags: [ + EitherIndex(2147483648), + ], + regions: [ + @0-11, + ], + space_before: [ + Slice { start: 0, length: 0 }, + ], + space_after: [ + Slice { start: 0, length: 0 }, + ], + spaces: [], + type_defs: [], + value_defs: [ + Body( + @0-2 RecordDestructure( + [], + ), + @3-11 Apply( + @3-10 Var { + module_name: "", + ident: "expect!", + }, + [ + @10-11 Var { + module_name: "", + ident: "w", + }, + ], + Space, + ), + ), + ], + }, + @12-13 SpaceBefore( + Num( + "0", + ), + [ + Newline, + ], + ), + ), + [ + Newline, + ], +) diff --git a/crates/compiler/test_syntax/tests/snapshots/pass/empty_record_assign_expect_bang.expr.roc b/crates/compiler/test_syntax/tests/snapshots/pass/empty_record_assign_expect_bang.expr.roc new file mode 100644 index 0000000000..cf523f0026 --- /dev/null +++ b/crates/compiler/test_syntax/tests/snapshots/pass/empty_record_assign_expect_bang.expr.roc @@ -0,0 +1,2 @@ +{}=expect!w +0 diff --git a/crates/compiler/test_syntax/tests/test_snapshots.rs b/crates/compiler/test_syntax/tests/test_snapshots.rs index f6d610007f..1afbde2889 100644 --- a/crates/compiler/test_syntax/tests/test_snapshots.rs +++ b/crates/compiler/test_syntax/tests/test_snapshots.rs @@ -391,6 +391,7 @@ mod test_snapshots { pass/empty_package_header.header, pass/empty_platform_header.header, pass/empty_record.expr, + pass/empty_record_assign_expect_bang.expr, pass/empty_record_assign_return.expr, pass/empty_record_assign_tag.expr, pass/empty_record_assignment.expr,