From b52cc84df6a6f0d21faf2ae711a50c377b5a75bf Mon Sep 17 00:00:00 2001 From: Micha Reiser Date: Tue, 22 Aug 2023 12:18:59 +0200 Subject: [PATCH] Omit tuple parentheses in for statements except when absolutely necessary (#6765) --- .../test/fixtures/ruff/statement/for.py | 28 +++++++++ .../src/expression/expr_tuple.rs | 11 +++- .../snapshots/format@statement__for.py.snap | 60 +++++++++++++++++++ 3 files changed, 96 insertions(+), 3 deletions(-) diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/for.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/for.py index c1e96d6d79..868db10fc6 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/for.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/for.py @@ -42,3 +42,31 @@ for x in (1, 2, 3): for x in 1, 2, 3,: pass + +# Don't keep parentheses around right target if it can made fit by breaking sub expressions +for column_name, ( + referenced_column_name, + referenced_table_name, +) in relations.items(): + pass + +for column_name, [ + referenced_column_name, + referenced_table_name, +] in relations.items(): + pass + +for column_name, [ + referenced_column_name, + referenced_table_name, +], in relations.items(): + pass + +for ( + # leading comment + column_name, [ + referenced_column_name, + referenced_table_name, +]) in relations.items(): + pass + diff --git a/crates/ruff_python_formatter/src/expression/expr_tuple.rs b/crates/ruff_python_formatter/src/expression/expr_tuple.rs index d101c5fdb4..94d93f373f 100644 --- a/crates/ruff_python_formatter/src/expression/expr_tuple.rs +++ b/crates/ruff_python_formatter/src/expression/expr_tuple.rs @@ -8,7 +8,7 @@ use ruff_text_size::TextRange; use crate::builders::parenthesize_if_expands; use crate::comments::SourceComment; use crate::expression::parentheses::{ - empty_parenthesized, parenthesized, NeedsParentheses, OptionalParentheses, + empty_parenthesized, optional_parentheses, parenthesized, NeedsParentheses, OptionalParentheses, }; use crate::prelude::*; @@ -138,7 +138,7 @@ impl FormatNodeRule for FormatExprTuple { } }, // If the tuple has parentheses, we generally want to keep them. The exception are for - // loops, see `TupleParentheses::StripInsideForLoop` doc comment. + // loops, see `TupleParentheses::NeverPreserve` doc comment. // // Unlike other expression parentheses, tuple parentheses are part of the range of the // tuple itself. @@ -159,7 +159,12 @@ impl FormatNodeRule for FormatExprTuple { .finish() } TupleParentheses::Preserve => group(&ExprSequence::new(item)).fmt(f), - _ => parenthesize_if_expands(&ExprSequence::new(item)).fmt(f), + TupleParentheses::NeverPreserve => { + optional_parentheses(&ExprSequence::new(item)).fmt(f) + } + TupleParentheses::Default => { + parenthesize_if_expands(&ExprSequence::new(item)).fmt(f) + } }, } } diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__for.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__for.py.snap index fbff2337ec..f76bbc6405 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__for.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__for.py.snap @@ -48,6 +48,34 @@ for x in (1, 2, 3): for x in 1, 2, 3,: pass + +# Don't keep parentheses around right target if it can made fit by breaking sub expressions +for column_name, ( + referenced_column_name, + referenced_table_name, +) in relations.items(): + pass + +for column_name, [ + referenced_column_name, + referenced_table_name, +] in relations.items(): + pass + +for column_name, [ + referenced_column_name, + referenced_table_name, +], in relations.items(): + pass + +for ( + # leading comment + column_name, [ + referenced_column_name, + referenced_table_name, +]) in relations.items(): + pass + ``` ## Output @@ -100,6 +128,38 @@ for x in ( 3, ): pass + +# Don't keep parentheses around right target if it can made fit by breaking sub expressions +for column_name, ( + referenced_column_name, + referenced_table_name, +) in relations.items(): + pass + +for column_name, [ + referenced_column_name, + referenced_table_name, +] in relations.items(): + pass + +for ( + column_name, + [ + referenced_column_name, + referenced_table_name, + ], +) in relations.items(): + pass + +for ( + # leading comment + column_name, + [ + referenced_column_name, + referenced_table_name, + ], +) in relations.items(): + pass ```