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:
Jelle Zijlstra 2022-01-26 16:47:36 -08:00 committed by GitHub
parent 32dd9ecb2e
commit 889a8d5dd2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 2 deletions

View File

@ -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.

View File

@ -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

View File

@ -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"]:

View File

@ -0,0 +1,10 @@
importA;()<<0**0#
# output
importA
(
()
<< 0
** 0
) #

View File

@ -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))