diff --git a/crates/ruff_python_formatter/src/snapshots/ruff_python_formatter__tests__black_test__remove_for_brackets_py.snap b/crates/ruff_python_formatter/src/snapshots/ruff_python_formatter__tests__black_test__remove_for_brackets_py.snap index 465bfb265d46b..d43018c8dcb74 100644 --- a/crates/ruff_python_formatter/src/snapshots/ruff_python_formatter__tests__black_test__remove_for_brackets_py.snap +++ b/crates/ruff_python_formatter/src/snapshots/ruff_python_formatter__tests__black_test__remove_for_brackets_py.snap @@ -36,7 +36,7 @@ for (((((k, v))))) in d.items(): # Only remove tuple brackets after `for` -for k, v in d.items(): - print(k, v) -+for (k, v) in NOT_IMPLEMENTED_call(): ++for k, v in NOT_IMPLEMENTED_call(): + NOT_IMPLEMENTED_call() # Don't touch tuple brackets after `in` @@ -62,13 +62,13 @@ for (((((k, v))))) in d.items(): - dfkasdjfldsjflkdsjflkdsjfdslkfjldsjfgkjdshgkljjdsfldgkhsdofudsfudsofajdslkfjdslkfjldisfjdffjsdlkfjdlkjjkdflskadjldkfjsalkfjdasj.items() -): - print(k, v) -+for (k, v) in NOT_IMPLEMENTED_call(): ++for k, v in NOT_IMPLEMENTED_call(): + NOT_IMPLEMENTED_call() # Test deeply nested brackets -for k, v in d.items(): - print(k, v) -+for (k, v) in NOT_IMPLEMENTED_call(): ++for k, v in NOT_IMPLEMENTED_call(): + NOT_IMPLEMENTED_call() ``` @@ -76,7 +76,7 @@ for (((((k, v))))) in d.items(): ```py # Only remove tuple brackets after `for` -for (k, v) in NOT_IMPLEMENTED_call(): +for k, v in NOT_IMPLEMENTED_call(): NOT_IMPLEMENTED_call() # Don't touch tuple brackets after `in` @@ -91,11 +91,11 @@ for ( ) in NOT_IMPLEMENTED_call(): NOT_IMPLEMENTED_call() -for (k, v) in NOT_IMPLEMENTED_call(): +for k, v in NOT_IMPLEMENTED_call(): NOT_IMPLEMENTED_call() # Test deeply nested brackets -for (k, v) in NOT_IMPLEMENTED_call(): +for k, v in NOT_IMPLEMENTED_call(): NOT_IMPLEMENTED_call() ``` diff --git a/crates/ruff_python_formatter/src/snapshots/ruff_python_formatter__tests__ruff_test__statement__for_py.snap b/crates/ruff_python_formatter/src/snapshots/ruff_python_formatter__tests__ruff_test__statement__for_py.snap index befc6a42f378d..b176abbfb0990 100644 --- a/crates/ruff_python_formatter/src/snapshots/ruff_python_formatter__tests__ruff_test__statement__for_py.snap +++ b/crates/ruff_python_formatter/src/snapshots/ruff_python_formatter__tests__ruff_test__statement__for_py.snap @@ -75,7 +75,7 @@ for ( # remove brackets around x,y but keep them around z,w -for (x, y) in (z, w): +for x, y in (z, w): ... diff --git a/crates/ruff_python_formatter/src/statement/stmt_for.rs b/crates/ruff_python_formatter/src/statement/stmt_for.rs index 39ff33378ebf4..528e06f152639 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_for.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_for.rs @@ -1,10 +1,26 @@ use crate::comments::{leading_alternate_branch_comments, trailing_comments}; +use crate::expression::expr_tuple::TupleParentheses; use crate::expression::parentheses::Parenthesize; use crate::prelude::*; use crate::{FormatNodeRule, PyFormatter}; use ruff_formatter::{write, Buffer, FormatResult}; use ruff_python_ast::node::AstNode; -use rustpython_parser::ast::{Ranged, Stmt, StmtFor}; +use rustpython_parser::ast::{Expr, Ranged, Stmt, StmtFor}; + +#[derive(Debug)] +struct ExprTupleWithoutParentheses<'a>(&'a Expr); + +impl Format> for ExprTupleWithoutParentheses<'_> { + fn fmt(&self, f: &mut Formatter>) -> FormatResult<()> { + match self.0 { + Expr::Tuple(expr_tuple) => expr_tuple + .format() + .with_options(TupleParentheses::StripInsideForLoop) + .fmt(f), + other => other.format().with_options(Parenthesize::IfBreaks).fmt(f), + } + } +} #[derive(Default)] pub struct FormatStmtFor; @@ -34,9 +50,7 @@ impl FormatNodeRule for FormatStmtFor { [ text("for"), space(), - // TODO: the `IfBreaks` is currently ignored by - // https://github.com/astral-sh/ruff/blob/4b9b6829dccabdd4faf6efa6a118b4868347a701/crates/ruff_python_formatter/src/expression/expr_tuple.rs#L78 - target.format().with_options(Parenthesize::IfBreaks), + ExprTupleWithoutParentheses(target.as_ref()), space(), text("in"), space(),