From: Ɓukasz Langa Date: Mon, 28 Oct 2019 19:34:37 +0000 (+0100) Subject: Always move the prefix out when wrapping with parentheses (#1103) X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/f99fad1b78a773f2a712b9ce21496e80cce6cf4f?ds=sidebyside Always move the prefix out when wrapping with parentheses (#1103) Fixes #1097 --- diff --git a/black.py b/black.py index d837c89..3231503 100644 --- a/black.py +++ b/black.py @@ -2966,16 +2966,9 @@ def normalize_invisible_parens(node: Node, parens_after: Set[str]) -> None: if child.type == syms.atom: if maybe_make_parens_invisible_in_atom(child, parent=node): - lpar = Leaf(token.LPAR, "") - rpar = Leaf(token.RPAR, "") - index = child.remove() or 0 - node.insert_child(index, Node(syms.atom, [lpar, child, rpar])) + wrap_in_parentheses(node, child, visible=False) elif is_one_tuple(child): - # wrap child in visible parentheses - lpar = Leaf(token.LPAR, "(") - rpar = Leaf(token.RPAR, ")") - child.remove() - node.insert_child(index, Node(syms.atom, [lpar, child, rpar])) + wrap_in_parentheses(node, child, visible=True) elif node.type == syms.import_from: # "import from" nodes store parentheses directly as part of # the statement @@ -2990,15 +2983,7 @@ def normalize_invisible_parens(node: Node, parens_after: Set[str]) -> None: break elif not (isinstance(child, Leaf) and is_multiline_string(child)): - # wrap child in invisible parentheses - lpar = Leaf(token.LPAR, "") - rpar = Leaf(token.RPAR, "") - index = child.remove() or 0 - prefix = child.prefix - child.prefix = "" - new_child = Node(syms.atom, [lpar, child, rpar]) - new_child.prefix = prefix - node.insert_child(index, new_child) + wrap_in_parentheses(node, child, visible=False) check_lpar = isinstance(child, Leaf) and child.value in parens_after @@ -3158,6 +3143,24 @@ def unwrap_singleton_parenthesis(node: LN) -> Optional[LN]: return wrapped +def wrap_in_parentheses(parent: Node, child: LN, *, visible: bool = True) -> None: + """Wrap `child` in parentheses. + + This replaces `child` with an atom holding the parentheses and the old + child. That requires moving the prefix. + + If `visible` is False, the leaves will be valueless (and thus invisible). + """ + lpar = Leaf(token.LPAR, "(" if visible else "") + rpar = Leaf(token.RPAR, ")" if visible else "") + prefix = child.prefix + child.prefix = "" + index = child.remove() or 0 + new_child = Node(syms.atom, [lpar, child, rpar]) + new_child.prefix = prefix + parent.insert_child(index, new_child) + + def is_one_tuple(node: LN) -> bool: """Return True if `node` holds a tuple with one element, with or without parens.""" if node.type == syms.atom: diff --git a/tests/data/tupleassign.py b/tests/data/tupleassign.py index c0debd7..d948fee 100644 --- a/tests/data/tupleassign.py +++ b/tests/data/tupleassign.py @@ -1,10 +1,23 @@ +# This is a standalone comment. sdfjklsdfsjldkflkjsf, sdfjsdfjlksdljkfsdlkf, sdfsdjfklsdfjlksdljkf, sdsfsdfjskdflsfsdf = 1, 2, 3 +# This is as well. +this_will_be_wrapped_in_parens, = struct.unpack(b"12345678901234567890") + +(a,) = call() # output + + +# This is a standalone comment. ( sdfjklsdfsjldkflkjsf, sdfjsdfjlksdljkfsdlkf, sdfsdjfklsdfjlksdljkf, sdsfsdfjskdflsfsdf, ) = (1, 2, 3) + +# This is as well. +(this_will_be_wrapped_in_parens,) = struct.unpack(b"12345678901234567890") + +(a,) = call() \ No newline at end of file