From 90c04b9cffdd37ae8bfd5b9a09ac3e7942829aca Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Mon, 20 Feb 2023 19:42:23 -0500 Subject: [PATCH] Enable `tupleassign` test (#3080) --- crates/ruff_python_formatter/src/format/expr.rs | 7 +++++-- crates/ruff_python_formatter/src/lib.rs | 4 ++-- crates/ruff_python_formatter/src/newlines.rs | 2 ++ ...n_formatter__tests__simple_cases__tupleassign.py.snap} | 8 +++----- 4 files changed, 12 insertions(+), 9 deletions(-) rename crates/ruff_python_formatter/src/snapshots/{expect/ruff_python_formatter__tests__simple_cases__tupleassign.py.snap.expect => ruff_python_formatter__tests__simple_cases__tupleassign.py.snap} (71%) diff --git a/crates/ruff_python_formatter/src/format/expr.rs b/crates/ruff_python_formatter/src/format/expr.rs index 184bebd771..240270cfe2 100644 --- a/crates/ruff_python_formatter/src/format/expr.rs +++ b/crates/ruff_python_formatter/src/format/expr.rs @@ -134,6 +134,8 @@ fn format_tuple( .trivia .iter() .any(|c| matches!(c.kind, TriviaKind::MagicTrailingComma)); + let is_unbroken = + expr.location.row() == expr.end_location.unwrap().row(); if magic_trailing_comma { write!(f, [expand_parent()])?; } @@ -143,7 +145,7 @@ fn format_tuple( write!(f, [text(",")])?; write!(f, [soft_line_break_or_space()])?; } else { - if magic_trailing_comma { + if magic_trailing_comma || is_unbroken { write!(f, [if_group_breaks(&text(","))])?; } } @@ -156,6 +158,7 @@ fn format_tuple( .trivia .iter() .any(|c| matches!(c.kind, TriviaKind::MagicTrailingComma)); + let is_unbroken = expr.location.row() == expr.end_location.unwrap().row(); if magic_trailing_comma { write!(f, [expand_parent()])?; } @@ -165,7 +168,7 @@ fn format_tuple( write!(f, [text(",")])?; write!(f, [soft_line_break_or_space()])?; } else { - if magic_trailing_comma { + if magic_trailing_comma || is_unbroken { write!(f, [if_group_breaks(&text(","))])?; } } diff --git a/crates/ruff_python_formatter/src/lib.rs b/crates/ruff_python_formatter/src/lib.rs index d5b66a913e..2ccbe6186c 100644 --- a/crates/ruff_python_formatter/src/lib.rs +++ b/crates/ruff_python_formatter/src/lib.rs @@ -74,6 +74,8 @@ mod tests { #[test_case(Path::new("simple_cases/remove_newline_after_code_block_open.py"); "remove_newline_after_code_block_open")] #[test_case(Path::new("simple_cases/slices.py"); "slices")] #[test_case(Path::new("simple_cases/tricky_unicode_symbols.py"); "tricky_unicode_symbols")] + // Passing except that `1, 2, 3,` should be `(1, 2, 3)`. + #[test_case(Path::new("simple_cases/tupleassign.py"); "tupleassign")] fn passing(path: &Path) -> Result<()> { let snapshot = format!("{}", path.display()); let content = std::fs::read_to_string(test_resource_path( @@ -102,8 +104,6 @@ mod tests { } #[ignore] - // Passing apart from one deviation in RHS tuple assignment. - #[test_case(Path::new("simple_cases/tupleassign.py"); "tupleassign")] // Lots of deviations, _mostly_ related to string normalization and wrapping. #[test_case(Path::new("simple_cases/expression.py"); "expression")] // Passing apart from a trailing end-of-line comment within an if statement, which is being diff --git a/crates/ruff_python_formatter/src/newlines.rs b/crates/ruff_python_formatter/src/newlines.rs index 0e42e5a73a..eae8f4b71b 100644 --- a/crates/ruff_python_formatter/src/newlines.rs +++ b/crates/ruff_python_formatter/src/newlines.rs @@ -62,6 +62,8 @@ impl<'a> Visitor<'a> for NewlineNormalizer { if matches!(self.trailer, Trailer::None) { // If this is the first statement in the block, remove any leading empty lines. + // TODO(charlie): If we have a function or class definition within a non-scoped block, + // like an if-statement, retain a line before and after. let mut seen_non_empty = false; stmt.trivia.retain(|c| { if seen_non_empty { diff --git a/crates/ruff_python_formatter/src/snapshots/expect/ruff_python_formatter__tests__simple_cases__tupleassign.py.snap.expect b/crates/ruff_python_formatter/src/snapshots/ruff_python_formatter__tests__simple_cases__tupleassign.py.snap similarity index 71% rename from crates/ruff_python_formatter/src/snapshots/expect/ruff_python_formatter__tests__simple_cases__tupleassign.py.snap.expect rename to crates/ruff_python_formatter/src/snapshots/ruff_python_formatter__tests__simple_cases__tupleassign.py.snap index 59b201d8ac..863532ace1 100644 --- a/crates/ruff_python_formatter/src/snapshots/expect/ruff_python_formatter__tests__simple_cases__tupleassign.py.snap.expect +++ b/crates/ruff_python_formatter/src/snapshots/ruff_python_formatter__tests__simple_cases__tupleassign.py.snap @@ -1,7 +1,6 @@ --- -source: src/source_code/mod.rs -assertion_line: 0 -expression: formatted +source: crates/ruff_python_formatter/src/lib.rs +expression: formatted.print()?.as_code() --- # This is a standalone comment. ( @@ -9,10 +8,9 @@ expression: formatted sdfjsdfjlksdljkfsdlkf, sdfsdjfklsdfjlksdljkf, sdsfsdfjskdflsfsdf, -) = (1, 2, 3) +) = 1, 2, 3 # This is as well. (this_will_be_wrapped_in_parens,) = struct.unpack(b"12345678901234567890") (a,) = call() -