diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/subscript.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/subscript.py index ca1cef47c7..e79678629a 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/subscript.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/expression/subscript.py @@ -4,7 +4,6 @@ result = ( + 1 )[0] - # Regression tests for: https://github.com/astral-sh/ruff/issues/10355 repro( "some long string that takes up some space" @@ -14,7 +13,7 @@ repro( repro( "some long string that takes up some space" -)[0 # some long comment also taking up space +)[0 # some long comment also taking up space ] repro( @@ -23,9 +22,20 @@ repro( repro("some long string that takes up some space")[0] # some long comment also taking up space - repro( "some long string that takes up some space" )[ # some long comment also taking up space 0:-1 ] + +( + repro +)[ # some long comment also taking up space + 0 +] + +( + repro # some long comment also taking up space +)[ + 0 +] diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index 8b26ea7cf6..3225874aeb 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -262,7 +262,9 @@ fn handle_enclosed_comment<'a>( // 0 // ] // ``` - if comment.line_position().is_end_of_line() { + if comment.line_position().is_end_of_line() + && expr_subscript.value.end() < comment.start() + { // Ensure that there are no tokens between the open bracket and the comment. let mut lexer = SimpleTokenizer::new( locator.contents(), @@ -270,13 +272,14 @@ fn handle_enclosed_comment<'a>( ) .skip_trivia(); - // Skip the opening parenthesis. - let Some(paren) = lexer.next() else { + // Skip to after the opening parenthesis (may skip some closing parentheses of value) + if !lexer + .by_ref() + .any(|token| token.kind() == SimpleTokenKind::LBracket) + { return CommentPlacement::Default(comment); }; - debug_assert_eq!(paren.kind(), SimpleTokenKind::LBracket); - // If there are no additional tokens between the open parenthesis and the comment, then // it should be attached as a dangling comment on the brackets, rather than a leading // comment on the first argument. diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__subscript.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__subscript.py.snap index 6b318daddf..71fee09c21 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__subscript.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__subscript.py.snap @@ -10,7 +10,6 @@ result = ( + 1 )[0] - # Regression tests for: https://github.com/astral-sh/ruff/issues/10355 repro( "some long string that takes up some space" @@ -20,7 +19,7 @@ repro( repro( "some long string that takes up some space" -)[0 # some long comment also taking up space +)[0 # some long comment also taking up space ] repro( @@ -29,12 +28,23 @@ repro( repro("some long string that takes up some space")[0] # some long comment also taking up space - repro( "some long string that takes up some space" )[ # some long comment also taking up space 0:-1 ] + +( + repro +)[ # some long comment also taking up space + 0 +] + +( + repro # some long comment also taking up space +)[ + 0 +] ``` ## Output @@ -45,7 +55,6 @@ result = ( + 1 )[0] - # Regression tests for: https://github.com/astral-sh/ruff/issues/10355 repro( "some long string that takes up some space" @@ -65,10 +74,17 @@ repro("some long string that takes up some space")[ 0 ] # some long comment also taking up space - repro( "some long string that takes up some space" )[ # some long comment also taking up space 0:-1 ] + +(repro)[ # some long comment also taking up space + 0 +] + +( + repro # some long comment also taking up space +)[0] ```