From 8b340e210271a8108995fd479c55dbc0a34466bd Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Tue, 21 Aug 2018 21:10:59 -0700 Subject: [PATCH 1/1] wrap atoms in invisible parens to split adjacent strings (#463) --- README.md | 2 ++ black.py | 16 ++++++++++++---- tests/data/cantfit.py | 6 ++++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9cb4f18..e9937f1 100644 --- a/README.md +++ b/README.md @@ -849,6 +849,8 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md). ### 18.8b0 +* adjacent string literals are now correctly split into multiple lines (#463) + * code with `_` in numeric literals is recognized as Python 3.6+ (#461) * numeric literals are now normalized to include `_` separators on Python 3.6+ code diff --git a/black.py b/black.py index 5550b23..85cb45b 100644 --- a/black.py +++ b/black.py @@ -2587,7 +2587,11 @@ def normalize_invisible_parens(node: Node, parens_after: Set[str]) -> None: for index, child in enumerate(list(node.children)): if check_lpar: if child.type == syms.atom: - maybe_make_parens_invisible_in_atom(child) + if maybe_make_parens_invisible_in_atom(child): + lpar = Leaf(token.LPAR, "") + rpar = Leaf(token.RPAR, "") + index = child.remove() or 0 + node.insert_child(index, Node(syms.atom, [lpar, child, rpar])) elif is_one_tuple(child): # wrap child in visible parentheses lpar = Leaf(token.LPAR, "(") @@ -2695,7 +2699,11 @@ def generate_ignored_nodes(leaf: Leaf) -> Iterator[LN]: def maybe_make_parens_invisible_in_atom(node: LN) -> bool: - """If it's safe, make the parens in the atom `node` invisible, recursively.""" + """If it's safe, make the parens in the atom `node` invisible, recursively. + + Returns whether the node should itself be wrapped in invisible parentheses. + + """ if ( node.type != syms.atom or is_empty_tuple(node) @@ -2713,9 +2721,9 @@ def maybe_make_parens_invisible_in_atom(node: LN) -> bool: last.value = "" # type: ignore if len(node.children) > 1: maybe_make_parens_invisible_in_atom(node.children[1]) - return True + return False - return False + return True def is_empty_tuple(node: LN) -> bool: diff --git a/tests/data/cantfit.py b/tests/data/cantfit.py index e15e69c..2a7cde3 100644 --- a/tests/data/cantfit.py +++ b/tests/data/cantfit.py @@ -35,6 +35,7 @@ for key in """ """.split(): if key in self.connect_kwargs: raise ValueError(err.format(key)) +concatenated_strings = "some strings that are" "concatenated implicitly, so if you put them on separate" "lines it will fit" # output @@ -85,3 +86,8 @@ for key in """ """.split(): if key in self.connect_kwargs: raise ValueError(err.format(key)) +concatenated_strings = ( + "some strings that are" + "concatenated implicitly, so if you put them on separate" + "lines it will fit" +) -- 2.39.5