Fix multiline strings unnecessarily wrapped in optional parentheses
Fixes #215
This commit is contained in:
parent
665ed8a240
commit
3ad0f5855c
@ -653,6 +653,9 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md).
|
|||||||
* fixed non-deterministic formatting when multiple pairs of removable parentheses
|
* fixed non-deterministic formatting when multiple pairs of removable parentheses
|
||||||
were used (#183)
|
were used (#183)
|
||||||
|
|
||||||
|
* fixed multiline strings being unnecessarily wrapped in optional
|
||||||
|
parentheses in long assignments (#215)
|
||||||
|
|
||||||
* fixed not splitting long from-imports with only a single name
|
* fixed not splitting long from-imports with only a single name
|
||||||
|
|
||||||
* fixed Python 3.6+ file discovery by also looking at function calls with
|
* fixed Python 3.6+ file discovery by also looking at function calls with
|
||||||
|
10
black.py
10
black.py
@ -1315,7 +1315,7 @@ def visit_stmt(
|
|||||||
The relevant Python language `keywords` for a given statement will be
|
The relevant Python language `keywords` for a given statement will be
|
||||||
NAME leaves within it. This methods puts those on a separate line.
|
NAME leaves within it. This methods puts those on a separate line.
|
||||||
|
|
||||||
`parens` holds a set of string leaf values immeditely after which
|
`parens` holds a set of string leaf values immediately after which
|
||||||
invisible parens should be put.
|
invisible parens should be put.
|
||||||
"""
|
"""
|
||||||
normalize_invisible_parens(node, parens_after=parens)
|
normalize_invisible_parens(node, parens_after=parens)
|
||||||
@ -2361,7 +2361,7 @@ def normalize_invisible_parens(node: Node, parens_after: Set[str]) -> None:
|
|||||||
rpar = Leaf(token.RPAR, ")")
|
rpar = Leaf(token.RPAR, ")")
|
||||||
index = child.remove() or 0
|
index = child.remove() or 0
|
||||||
node.insert_child(index, Node(syms.atom, [lpar, child, rpar]))
|
node.insert_child(index, Node(syms.atom, [lpar, child, rpar]))
|
||||||
else:
|
elif not (isinstance(child, Leaf) and is_multiline_string(child)):
|
||||||
# wrap child in invisible parentheses
|
# wrap child in invisible parentheses
|
||||||
lpar = Leaf(token.LPAR, "")
|
lpar = Leaf(token.LPAR, "")
|
||||||
rpar = Leaf(token.RPAR, "")
|
rpar = Leaf(token.RPAR, "")
|
||||||
@ -2472,6 +2472,12 @@ def is_vararg(leaf: Leaf, within: Set[NodeType]) -> bool:
|
|||||||
return p.type in within
|
return p.type in within
|
||||||
|
|
||||||
|
|
||||||
|
def is_multiline_string(leaf: Leaf) -> bool:
|
||||||
|
"""Return True if `leaf` is a multiline string that actually spans many lines."""
|
||||||
|
value = leaf.value.lstrip("furbFURB")
|
||||||
|
return value[:3] in {'"""', "'''"} and "\n" in value
|
||||||
|
|
||||||
|
|
||||||
def is_stub_suite(node: Node) -> bool:
|
def is_stub_suite(node: Node) -> bool:
|
||||||
"""Return True if `node` is a suite with a stub body."""
|
"""Return True if `node` is a suite with a stub body."""
|
||||||
if (
|
if (
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
def func():
|
def func():
|
||||||
|
x = """
|
||||||
|
a really long string
|
||||||
|
"""
|
||||||
lcomp3 = [
|
lcomp3 = [
|
||||||
# This one is actually too long to fit in a single line.
|
# This one is actually too long to fit in a single line.
|
||||||
element.split("\n", 1)[0]
|
element.split("\n", 1)[0]
|
||||||
|
Loading…
Reference in New Issue
Block a user