From 533e4dd5217b5918332366a5a4a26f8fa128610b Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 25 Oct 2023 18:09:36 -0400 Subject: [PATCH] Avoid introducing new parentheses in annotated assignments --- crates/ruff_python_formatter/README.md | 22 ------------ .../fixtures/ruff/statement/ann_assign.py | 11 ++++++ .../src/statement/stmt_ann_assign.rs | 7 +--- .../format@statement__ann_assign.py.snap | 36 +++++++++++++++++-- docs/formatter/black.md | 22 ------------ 5 files changed, 45 insertions(+), 53 deletions(-) diff --git a/crates/ruff_python_formatter/README.md b/crates/ruff_python_formatter/README.md index a87c2056dcd882..4d52242e08b638 100644 --- a/crates/ruff_python_formatter/README.md +++ b/crates/ruff_python_formatter/README.md @@ -537,28 +537,6 @@ def update_emission_strength(): value = self.emission_strength * 2 ``` -#### Type annotations may be parenthesized when expanded ([#7315](https://github.com/astral-sh/ruff/issues/7315)) - -Black will avoid parenthesizing type annotations in an annotated assignment, while Ruff will insert -parentheses in some cases. - -For example: - -```python -# Black -StartElementHandler: Callable[[str, dict[str, str]], Any] | Callable[[str, list[str]], Any] | Callable[ - [str, dict[str, str], list[str]], Any -] | None - -# Ruff -StartElementHandler: ( - Callable[[str, dict[str, str]], Any] - | Callable[[str, list[str]], Any] - | Callable[[str, dict[str, str], list[str]], Any] - | None -) -``` - #### Call chain calls break differently ([#7051](https://github.com/astral-sh/ruff/issues/7051)) Black occasionally breaks call chains differently than Ruff; in particular, Black occasionally diff --git a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/ann_assign.py b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/ann_assign.py index b965199c982609..3cd52cb2e0ab9c 100644 --- a/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/ann_assign.py +++ b/crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/ann_assign.py @@ -1,6 +1,17 @@ # Regression test: Don't forget the parentheses in the value when breaking aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: int = a + 1 * a +bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: Bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = ( + Bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb() +) + +JSONSerializable: TypeAlias = ( + "str | int | float | bool | None | list | tuple | JSONMapping" +) + +JSONSerializable: str | int | float | bool | None | list | tuple | JSONMapping = {1, 2, 3, 4} + +JSONSerializable: str | int | float | bool | None | list | tuple | JSONMapping = aaaaaaaaaaaaaaaa # Regression test: Don't forget the parentheses in the annotation when breaking class DefaultRunner: diff --git a/crates/ruff_python_formatter/src/statement/stmt_ann_assign.rs b/crates/ruff_python_formatter/src/statement/stmt_ann_assign.rs index a29798d4c33160..f22457cc4b56a4 100644 --- a/crates/ruff_python_formatter/src/statement/stmt_ann_assign.rs +++ b/crates/ruff_python_formatter/src/statement/stmt_ann_assign.rs @@ -21,12 +21,7 @@ impl FormatNodeRule for FormatStmtAnnAssign { write!( f, - [ - target.format(), - token(":"), - space(), - maybe_parenthesize_expression(annotation, item, Parenthesize::IfBreaks) - ] + [target.format(), token(":"), space(), annotation.format(),] )?; if let Some(value) = value { diff --git a/crates/ruff_python_formatter/tests/snapshots/format@statement__ann_assign.py.snap b/crates/ruff_python_formatter/tests/snapshots/format@statement__ann_assign.py.snap index 52d136a3bef135..a27cafa30feb73 100644 --- a/crates/ruff_python_formatter/tests/snapshots/format@statement__ann_assign.py.snap +++ b/crates/ruff_python_formatter/tests/snapshots/format@statement__ann_assign.py.snap @@ -7,6 +7,17 @@ input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/statement/ # Regression test: Don't forget the parentheses in the value when breaking aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: int = a + 1 * a +bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: Bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = ( + Bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb() +) + +JSONSerializable: TypeAlias = ( + "str | int | float | bool | None | list | tuple | JSONMapping" +) + +JSONSerializable: str | int | float | bool | None | list | tuple | JSONMapping = {1, 2, 3, 4} + +JSONSerializable: str | int | float | bool | None | list | tuple | JSONMapping = aaaaaaaaaaaaaaaa # Regression test: Don't forget the parentheses in the annotation when breaking class DefaultRunner: @@ -20,12 +31,31 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: int = a + 1 * a ) +bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb: Bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = ( + Bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb() +) + +JSONSerializable: TypeAlias = ( + "str | int | float | bool | None | list | tuple | JSONMapping" +) + +JSONSerializable: str | int | float | bool | None | list | tuple | JSONMapping = { + 1, + 2, + 3, + 4, +} + +JSONSerializable: str | int | float | bool | None | list | tuple | JSONMapping = ( + aaaaaaaaaaaaaaaa +) + # Regression test: Don't forget the parentheses in the annotation when breaking class DefaultRunner: - task_runner_cls: ( - TaskRunnerProtocol | typing.Callable[[], typing.Any] - ) = DefaultTaskRunner + task_runner_cls: TaskRunnerProtocol | typing.Callable[ + [], typing.Any + ] = DefaultTaskRunner ``` diff --git a/docs/formatter/black.md b/docs/formatter/black.md index 44816f62beb020..d9683c89b02bc2 100644 --- a/docs/formatter/black.md +++ b/docs/formatter/black.md @@ -399,28 +399,6 @@ def update_emission_strength(): value = self.emission_strength * 2 ``` -### Type annotations may be parenthesized when expanded - -Black will avoid parenthesizing type annotations in an annotated assignment, while Ruff will insert -parentheses in some cases. - -For example: - -```python -# Black -StartElementHandler: Callable[[str, dict[str, str]], Any] | Callable[[str, list[str]], Any] | Callable[ - [str, dict[str, str], list[str]], Any -] | None - -# Ruff -StartElementHandler: ( - Callable[[str, dict[str, str]], Any] - | Callable[[str, list[str]], Any] - | Callable[[str, dict[str, str], list[str]], Any] - | None -) -``` - ### Call chain calls break differently Black occasionally breaks call chains differently than Ruff; in particular, Black occasionally