From bae256b5ad60c25caf9db3e69e514fdc577c9481 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Sat, 10 Dec 2022 09:54:31 -0800 Subject: [PATCH 1/3] Fix crash in return annotation with walrus Fixes #3419 --- CHANGES.md | 1 + src/black/linegen.py | 1 + tests/data/preview/return_annotation_brackets.py | 9 +++++++++ 3 files changed, 11 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index c84feb04934..502b52e89eb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -15,6 +15,7 @@ - Fix a crash in preview style with assert + parenthesized string (#3415) +- Fix a crash in preview style with a walrus operator in a return annotation (#3422) ### Configuration diff --git a/src/black/linegen.py b/src/black/linegen.py index 219495e9a5e..293d57beeba 100644 --- a/src/black/linegen.py +++ b/src/black/linegen.py @@ -1160,6 +1160,7 @@ def maybe_make_parens_invisible_in_atom( syms.expr_stmt, syms.assert_stmt, syms.return_stmt, + syms.funcdef, # these ones aren't useful to end users, but they do please fuzzers syms.for_stmt, syms.del_stmt, diff --git a/tests/data/preview/return_annotation_brackets.py b/tests/data/preview/return_annotation_brackets.py index 27760bd51d7..4d03fad81c7 100644 --- a/tests/data/preview/return_annotation_brackets.py +++ b/tests/data/preview/return_annotation_brackets.py @@ -91,6 +91,10 @@ def foo() -> tuple[int, int, int,]: def frobnicate() -> "ThisIsTrulyUnreasonablyExtremelyLongClassName | list[ThisIsTrulyUnreasonablyExtremelyLongClassName]": pass +# Should not remove parens around walrus operator +def walrus() -> (x := 1): + pass + # output # Control def double(a: int) -> int: @@ -220,3 +224,8 @@ def frobnicate() -> ( " list[ThisIsTrulyUnreasonablyExtremelyLongClassName]" ): pass + + +# Should not remove parens around walrus operator +def walrus() -> (x := 1): + pass From 8310b8197154df5eadbad9e2aa55f911ccde961d Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Sat, 10 Dec 2022 10:00:19 -0800 Subject: [PATCH 2/3] test only in 3.8+ --- tests/data/preview/return_annotation_brackets.py | 9 --------- tests/data/preview_38/return_annotation_brackets_py38.py | 9 +++++++++ tests/test_format.py | 7 +++++++ 3 files changed, 16 insertions(+), 9 deletions(-) create mode 100644 tests/data/preview_38/return_annotation_brackets_py38.py diff --git a/tests/data/preview/return_annotation_brackets.py b/tests/data/preview/return_annotation_brackets.py index 4d03fad81c7..27760bd51d7 100644 --- a/tests/data/preview/return_annotation_brackets.py +++ b/tests/data/preview/return_annotation_brackets.py @@ -91,10 +91,6 @@ def foo() -> tuple[int, int, int,]: def frobnicate() -> "ThisIsTrulyUnreasonablyExtremelyLongClassName | list[ThisIsTrulyUnreasonablyExtremelyLongClassName]": pass -# Should not remove parens around walrus operator -def walrus() -> (x := 1): - pass - # output # Control def double(a: int) -> int: @@ -224,8 +220,3 @@ def frobnicate() -> ( " list[ThisIsTrulyUnreasonablyExtremelyLongClassName]" ): pass - - -# Should not remove parens around walrus operator -def walrus() -> (x := 1): - pass diff --git a/tests/data/preview_38/return_annotation_brackets_py38.py b/tests/data/preview_38/return_annotation_brackets_py38.py new file mode 100644 index 00000000000..a94d43e5d85 --- /dev/null +++ b/tests/data/preview_38/return_annotation_brackets_py38.py @@ -0,0 +1,9 @@ +# Should not remove parens around walrus operator +def walrus() -> (x := 1): + pass + + +# output +# Should not remove parens around walrus operator +def walrus() -> (x := 1): + pass diff --git a/tests/test_format.py b/tests/test_format.py index 01cd61eef63..4b897fb552c 100644 --- a/tests/test_format.py +++ b/tests/test_format.py @@ -44,6 +44,13 @@ def test_preview_format(filename: str) -> None: ) +@pytest.mark.parametrize("filename", all_data_cases("preview_38")) +def test_preview_minimum_python_38_format(filename: str) -> None: + source, expected = read_data("preview_38", filename) + mode = black.Mode(preview=True) + assert_format(source, expected, mode, minimum_version=(3, 9)) + + @pytest.mark.parametrize("filename", all_data_cases("preview_39")) def test_preview_minimum_python_39_format(filename: str) -> None: source, expected = read_data("preview_39", filename) From 41994d0823ed6fa4c9ddb675e88883bbed55a3a8 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Sat, 10 Dec 2022 10:00:52 -0800 Subject: [PATCH 3/3] Update tests/test_format.py --- tests/test_format.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_format.py b/tests/test_format.py index 4b897fb552c..aeb4bc149b6 100644 --- a/tests/test_format.py +++ b/tests/test_format.py @@ -48,7 +48,7 @@ def test_preview_format(filename: str) -> None: def test_preview_minimum_python_38_format(filename: str) -> None: source, expected = read_data("preview_38", filename) mode = black.Mode(preview=True) - assert_format(source, expected, mode, minimum_version=(3, 9)) + assert_format(source, expected, mode, minimum_version=(3, 8)) @pytest.mark.parametrize("filename", all_data_cases("preview_39"))