From de806405d2934b629d67e2a6317ad7e826765a20 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Tue, 7 May 2019 09:51:28 -0400 Subject: [PATCH] Add parentheses around tuple unpack assignment (#832) Fixes #656 --- black.py | 14 +++++++++++++- tests/data/tupleassign.py | 10 ++++++++++ tests/test_black.py | 8 ++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 tests/data/tupleassign.py diff --git a/black.py b/black.py index cada4d0..7bfcfca 100644 --- a/black.py +++ b/black.py @@ -2726,6 +2726,14 @@ def normalize_invisible_parens(node: Node, parens_after: Set[str]) -> None: check_lpar = False for index, child in enumerate(list(node.children)): + # Add parentheses around long tuple unpacking in assignments. + if ( + index == 0 + and isinstance(child, Node) + and child.type == syms.testlist_star_expr + ): + check_lpar = True + if check_lpar: if child.type == syms.atom: if maybe_make_parens_invisible_in_atom(child, parent=node): @@ -2757,7 +2765,11 @@ def normalize_invisible_parens(node: Node, parens_after: Set[str]) -> None: lpar = Leaf(token.LPAR, "") rpar = Leaf(token.RPAR, "") index = child.remove() or 0 - node.insert_child(index, Node(syms.atom, [lpar, child, rpar])) + prefix = child.prefix + child.prefix = "" + new_child = Node(syms.atom, [lpar, child, rpar]) + new_child.prefix = prefix + node.insert_child(index, new_child) check_lpar = isinstance(child, Leaf) and child.value in parens_after diff --git a/tests/data/tupleassign.py b/tests/data/tupleassign.py new file mode 100644 index 0000000..c0debd7 --- /dev/null +++ b/tests/data/tupleassign.py @@ -0,0 +1,10 @@ +sdfjklsdfsjldkflkjsf, sdfjsdfjlksdljkfsdlkf, sdfsdjfklsdfjlksdljkf, sdsfsdfjskdflsfsdf = 1, 2, 3 + + +# output +( + sdfjklsdfsjldkflkjsf, + sdfjsdfjlksdljkfsdlkf, + sdfsdjfklsdfjlksdljkf, + sdsfsdfjskdflsfsdf, +) = (1, 2, 3) diff --git a/tests/test_black.py b/tests/test_black.py index 86175aa..896ad0c 100644 --- a/tests/test_black.py +++ b/tests/test_black.py @@ -542,6 +542,14 @@ class BlackTestCase(unittest.TestCase): black.assert_equivalent(source, actual) black.assert_stable(source, actual, black.FileMode()) + @patch("black.dump_to_file", dump_to_stderr) + def test_tuple_assign(self) -> None: + source, expected = read_data("tupleassign") + actual = fs(source) + self.assertFormatEqual(expected, actual) + black.assert_equivalent(source, actual) + black.assert_stable(source, actual, black.FileMode()) + def test_tab_comment_indentation(self) -> None: contents_tab = "if 1:\n\tif 2:\n\t\tpass\n\t# comment\n\tpass\n" contents_spc = "if 1:\n if 2:\n pass\n # comment\n pass\n" -- 2.39.2