From 87984e9ac7387204c49703d9dcf50237b5a33d89 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 8 Aug 2023 08:45:20 -0400 Subject: [PATCH] Expand parents whenever open-parenthesis comments are present (#6389) ## Summary This PR modifies our dangling-open-parenthesis handling to _always_ expand the parent expression. So, for example, given: ```python a = int( # type: ignore int( # type: ignore int( # type: ignore 6 ) ) ) ``` We now retain that as stable formatting, instead of truncating like: ```python a = int(int(int(6))) # comment # comment # comment ``` Note that Black _does_ collapse comments like this _unless_ they're `# type: ignore` comments, and perhaps in some other cases, so this is an intentional deviation ([playground](https://black.vercel.app/?version=main&state=_Td6WFoAAATm1rRGAgAhARYAAAB0L-Wj4AFEAHpdAD2IimZxl1N_WlOfrjryFgvD4ScVsKPztqdHDGJUg5knO0JCdpUfW1IrWSNmIJPx95s0hP-pRNkCQNH64-eIznIvXjeWBQ5-qax0oNw4yMOuhwr2azvMRZaEB5r8IXVPHmRCJp7fe7y4290u1zzxqK_nAi6q_5sI-jsAAAAA8HgZ9V7hG3QAAZYBxQIAAGnCHXexxGf7AgAAAAAEWVo=)). --- .../src/comments/format.rs | 9 +++---- ...onsecutive_open_parentheses_ignore.py.snap | 26 +++++++++++-------- ...ompatibility@simple_cases__torture.py.snap | 11 +++++--- .../snapshots/format@expression__call.py.snap | 4 ++- .../format@expression__dict_comp.py.snap | 5 +++- .../snapshots/format@expression__list.py.snap | 10 +++++-- .../format@statement__function.py.snap | 4 ++- 7 files changed, 44 insertions(+), 25 deletions(-) diff --git a/crates/ruff_python_formatter/src/comments/format.rs b/crates/ruff_python_formatter/src/comments/format.rs index 29781c38a66e2..316f4b5ae2339 100644 --- a/crates/ruff_python_formatter/src/comments/format.rs +++ b/crates/ruff_python_formatter/src/comments/format.rs @@ -260,11 +260,10 @@ impl Format> for FormatDanglingOpenParenthesisComments<'_> { write!( f, - [line_suffix(&format_args![ - space(), - space(), - format_comment(comment) - ])] + [ + line_suffix(&format_args![space(), space(), format_comment(comment)]), + expand_parent() + ] )?; comment.mark_formatted(); diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap index 1c0ac7dd11127..a99e1bf762e29 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__multiline_consecutive_open_parentheses_ignore.py.snap @@ -33,20 +33,18 @@ print( "111" ) # type: ignore ```diff --- Black +++ Ruff -@@ -1,12 +1,6 @@ +@@ -1,9 +1,9 @@ # This is a regression test. Issue #3737 -a = ( # type: ignore -- int( # type: ignore -- int( # type: ignore ++a = int( # type: ignore # type: ignore + int( # type: ignore + int( # type: ignore - int(6) # type: ignore -- ) -- ) --) -+a = int(int(int(6))) # type: ignore # type: ignore # type: ignore # type: ignore - - b = int(6) - ++ 6 + ) + ) + ) ``` ## Ruff Output @@ -54,7 +52,13 @@ print( "111" ) # type: ignore ```py # This is a regression test. Issue #3737 -a = int(int(int(6))) # type: ignore # type: ignore # type: ignore # type: ignore +a = int( # type: ignore # type: ignore + int( # type: ignore + int( # type: ignore + 6 + ) + ) +) b = int(6) diff --git a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__torture.py.snap b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__torture.py.snap index 69341cf62750c..f44e1053f0b4b 100644 --- a/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__torture.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/black_compatibility@simple_cases__torture.py.snap @@ -50,14 +50,15 @@ assert ( ) # assert sort_by_dependency( -@@ -25,9 +25,7 @@ +@@ -25,9 +25,9 @@ class A: def foo(self): for _ in range(10): - aaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbb.cccccccccc( -- xxxxxxxxxxxx ++ aaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbb.cccccccccc( # pylint: disable=no-member + xxxxxxxxxxxx - ) # pylint: disable=no-member -+ aaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbb.cccccccccc(xxxxxxxxxxxx) # pylint: disable=no-member ++ ) def test(self, othr): @@ -93,7 +94,9 @@ importA class A: def foo(self): for _ in range(10): - aaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbb.cccccccccc(xxxxxxxxxxxx) # pylint: disable=no-member + aaaaaaaaaaaaaaaaaaa = bbbbbbbbbbbbbbb.cccccccccc( # pylint: disable=no-member + xxxxxxxxxxxx + ) def test(self, othr): diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap index 86880bd396c5e..283a06b31a96b 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__call.py.snap @@ -224,7 +224,9 @@ f( # abc ) -f(1) # abc +f( # abc + 1 +) f( # abc diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__dict_comp.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__dict_comp.py.snap index 190d80a4513d4..4d725fc27c17c 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__dict_comp.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__dict_comp.py.snap @@ -265,7 +265,10 @@ selected_choices = { { k: v - for (x, aaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaay) in z # foo + for ( # foo + x, + aaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaayaaaay, + ) in z } a = { diff --git a/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap index ff883a8f45d2b..a4b60d427a66b 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@expression__list.py.snap @@ -101,9 +101,15 @@ c1 = [ # trailing open bracket # own-line comment ] -[1] # end-of-line comment +[ # end-of-line comment + 1 +] -[first, second, third] # inner comment # outer comment +[ # inner comment + first, + second, + third, +] # outer comment ``` diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap index 7f77fc37abe04..8fba525759753 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__function.py.snap @@ -886,7 +886,9 @@ def f( # first ... -def f(a): # first # second +def f( # first + a +): # second ...