Fix crash on some power hugging cases (#2806)
Found by the fuzzer. Repro case: python -m black -c 'importA;()<<0**0#'
This commit is contained in:
parent
32dd9ecb2e
commit
889a8d5dd2
@ -942,6 +942,7 @@ def generate_trailers_to_omit(line: Line, line_length: int) -> Iterator[Set[Leaf
|
||||
if (
|
||||
prev
|
||||
and prev.type == token.COMMA
|
||||
and leaf.opening_bracket is not None
|
||||
and not is_one_tuple_between(
|
||||
leaf.opening_bracket, leaf, line.leaves
|
||||
)
|
||||
@ -969,6 +970,7 @@ def generate_trailers_to_omit(line: Line, line_length: int) -> Iterator[Set[Leaf
|
||||
if (
|
||||
prev
|
||||
and prev.type == token.COMMA
|
||||
and leaf.opening_bracket is not None
|
||||
and not is_one_tuple_between(leaf.opening_bracket, leaf, line.leaves)
|
||||
):
|
||||
# Never omit bracket pairs with trailing commas.
|
||||
|
@ -277,7 +277,9 @@ def has_magic_trailing_comma(
|
||||
if self.is_import:
|
||||
return True
|
||||
|
||||
if not is_one_tuple_between(closing.opening_bracket, closing, self.leaves):
|
||||
if closing.opening_bracket is not None and not is_one_tuple_between(
|
||||
closing.opening_bracket, closing, self.leaves
|
||||
):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
@ -386,7 +386,8 @@ class Leaf(Base):
|
||||
value: Text
|
||||
fixers_applied: List[Any]
|
||||
bracket_depth: int
|
||||
opening_bracket: "Leaf"
|
||||
# Changed later in brackets.py
|
||||
opening_bracket: Optional["Leaf"] = None
|
||||
used_names: Optional[Set[Text]]
|
||||
_prefix = "" # Whitespace and comments preceding this token in the input
|
||||
lineno: int = 0 # Line where this token starts in the input
|
||||
@ -399,6 +400,7 @@ def __init__(
|
||||
context: Optional[Context] = None,
|
||||
prefix: Optional[Text] = None,
|
||||
fixers_applied: List[Any] = [],
|
||||
opening_bracket: Optional["Leaf"] = None,
|
||||
) -> None:
|
||||
"""
|
||||
Initializer.
|
||||
@ -416,6 +418,7 @@ def __init__(
|
||||
self._prefix = prefix
|
||||
self.fixers_applied: Optional[List[Any]] = fixers_applied[:]
|
||||
self.children = []
|
||||
self.opening_bracket = opening_bracket
|
||||
|
||||
def __repr__(self) -> str:
|
||||
"""Return a canonical string representation."""
|
||||
@ -448,6 +451,7 @@ def clone(self) -> "Leaf":
|
||||
self.value,
|
||||
(self.prefix, (self.lineno, self.column)),
|
||||
fixers_applied=self.fixers_applied,
|
||||
opening_bracket=self.opening_bracket,
|
||||
)
|
||||
|
||||
def leaves(self) -> Iterator["Leaf"]:
|
||||
|
10
tests/data/power_op_newline.py
Normal file
10
tests/data/power_op_newline.py
Normal file
@ -0,0 +1,10 @@
|
||||
importA;()<<0**0#
|
||||
|
||||
# output
|
||||
|
||||
importA
|
||||
(
|
||||
()
|
||||
<< 0
|
||||
** 0
|
||||
) #
|
@ -256,3 +256,9 @@ def test_python38() -> None:
|
||||
def test_python39() -> None:
|
||||
source, expected = read_data("python39")
|
||||
assert_format(source, expected, minimum_version=(3, 9))
|
||||
|
||||
|
||||
def test_power_op_newline() -> None:
|
||||
# requires line_length=0
|
||||
source, expected = read_data("power_op_newline")
|
||||
assert_format(source, expected, mode=black.Mode(line_length=0))
|
||||
|
Loading…
Reference in New Issue
Block a user