From e0b0b54b253244641283973f2d04d7a27f83eb68 Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Thu, 13 Nov 2025 10:09:37 -0500 Subject: [PATCH] try a different approach --- .../src/comments/placement.rs | 12 ++--- .../src/expression/binary_like.rs | 6 ++- .../format@expression__unary.py.snap | 46 +++++++++++++++---- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index 1f763563f0..234752ba53 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -1861,16 +1861,10 @@ fn handle_unary_op_comment<'a>( | SimpleTokenKind::Plus | SimpleTokenKind::Minus ))); - let lparen_start = tokenizer + let up_to = tokenizer .find(|token| token.kind == SimpleTokenKind::LParen) - .map(|lparen| lparen.start()); - let up_to = lparen_start.unwrap_or(unary_op.operand.start()); - if lparen_start.is_none() - && comment.end() < unary_op.operand.start() - && comment.line_position().is_end_of_line() - { - CommentPlacement::dangling(unary_op, comment) - } else if comment.end() < up_to { + .map_or(unary_op.operand.start(), |lparen| lparen.start()); + if comment.end() < up_to { CommentPlacement::leading(unary_op, comment) } else { CommentPlacement::Default(comment) diff --git a/crates/ruff_python_formatter/src/expression/binary_like.rs b/crates/ruff_python_formatter/src/expression/binary_like.rs index 5d86608452..bc6df28cd1 100644 --- a/crates/ruff_python_formatter/src/expression/binary_like.rs +++ b/crates/ruff_python_formatter/src/expression/binary_like.rs @@ -836,7 +836,8 @@ impl<'a> Operand<'a> { let leading = comments.leading(*expression); if is_expression_parenthesized((*expression).into(), comments.ranges(), source) { leading.iter().any(|comment| { - !comment.is_formatted() + comment.end() <= expression.start() + && !comment.is_formatted() && matches!( SimpleTokenizer::new( source, @@ -922,7 +923,8 @@ impl Format> for Operand<'_> { let leading_before_parentheses_end = leading .iter() .rposition(|comment| { - comment.is_unformatted() + comment.end() <= expression.start() + && comment.is_unformatted() && matches!( SimpleTokenizer::new( f.context().source(), diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__unary.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__unary.py.snap index 74ba326706..697fe3747c 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__unary.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__unary.py.snap @@ -200,10 +200,21 @@ def foo(): ): pass -# Regression test for https://github.com/astral-sh/ruff/issues/19226 +# Regression tests for https://github.com/astral-sh/ruff/issues/19226 if '' and (not # 0): pass + +if '' and (not # +(0) +): + pass + +if '' and (not + ( # + 0 +)): + pass ``` ## Output @@ -322,28 +333,31 @@ if ( ## Trailing operator comments -if ( - not aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa # comment +if ( # comment + not aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ): pass if ( - ~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa # comment + # comment + ~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ): pass if ( - -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa # comment + # comment + -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ): pass if ( - +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa # comment + # comment + +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ): pass @@ -368,7 +382,9 @@ if ( ): pass -if not a: # comment +if ( # comment + not a +): pass # Regression test for: https://github.com/astral-sh/ruff/issues/7423 @@ -416,9 +432,21 @@ def foo(): pass -# Regression test for https://github.com/astral-sh/ruff/issues/19226 +# Regression tests for https://github.com/astral-sh/ruff/issues/19226 +if "" and ( # + not 0 +): + pass + +if "" and ( # + not (0) +): + pass + if "" and ( - not 0 # + not ( # + 0 + ) ): pass ```