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 679f43acb53c2..ca1cef47c7b1b 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 @@ -3,3 +3,29 @@ f(111111111111111111111111111111111111111111111111111111111111111111111111111111111) + 1 )[0] + + +# Regression tests for: https://github.com/astral-sh/ruff/issues/10355 +repro( + "some long string that takes up some space" +)[ # some long comment also taking up space + 0 +] + +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" +)[0] # some long comment also taking up space + +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 +] diff --git a/crates/ruff_python_formatter/src/comments/placement.rs b/crates/ruff_python_formatter/src/comments/placement.rs index eeef8e32f7b74..8b26ea7cf604a 100644 --- a/crates/ruff_python_formatter/src/comments/placement.rs +++ b/crates/ruff_python_formatter/src/comments/placement.rs @@ -251,10 +251,41 @@ fn handle_enclosed_comment<'a>( } AnyNodeRef::ExprSubscript(expr_subscript) => { if let Expr::Slice(expr_slice) = expr_subscript.slice.as_ref() { - handle_slice_comments(comment, expr_slice, comment_ranges, locator) - } else { - CommentPlacement::Default(comment) + return handle_slice_comments(comment, expr_slice, comment_ranges, locator); + } + + // Handle non-slice subscript end-of-line comments coming after the `[` + // ```python + // repro( + // "some long string that takes up some space" + // )[ # some long comment also taking up space + // 0 + // ] + // ``` + if comment.line_position().is_end_of_line() { + // Ensure that there are no tokens between the open bracket and the comment. + let mut lexer = SimpleTokenizer::new( + locator.contents(), + TextRange::new(expr_subscript.value.end(), comment.start()), + ) + .skip_trivia(); + + // Skip the opening parenthesis. + let Some(paren) = lexer.next() else { + 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. + if lexer.next().is_none() { + return CommentPlacement::dangling(expr_subscript, comment); + } } + + CommentPlacement::Default(comment) } AnyNodeRef::ModModule(module) => { handle_trailing_module_comment(module, comment).or_else(|comment| { 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 35f5f5e92994f..6b318daddf0e2 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 @@ -9,6 +9,32 @@ result = ( f(111111111111111111111111111111111111111111111111111111111111111111111111111111111) + 1 )[0] + + +# Regression tests for: https://github.com/astral-sh/ruff/issues/10355 +repro( + "some long string that takes up some space" +)[ # some long comment also taking up space + 0 +] + +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" +)[0] # some long comment also taking up space + +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 +] ``` ## Output @@ -18,7 +44,31 @@ result = ( f(111111111111111111111111111111111111111111111111111111111111111111111111111111111) + 1 )[0] -``` +# Regression tests for: https://github.com/astral-sh/ruff/issues/10355 +repro( + "some long string that takes up some space" +)[ # some long comment also taking up space + 0 +] + +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")[ + 0 +] # some long comment also taking up space +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 +] +```