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 (
|
if (
|
||||||
prev
|
prev
|
||||||
and prev.type == token.COMMA
|
and prev.type == token.COMMA
|
||||||
|
and leaf.opening_bracket is not None
|
||||||
and not is_one_tuple_between(
|
and not is_one_tuple_between(
|
||||||
leaf.opening_bracket, leaf, line.leaves
|
leaf.opening_bracket, leaf, line.leaves
|
||||||
)
|
)
|
||||||
@ -969,6 +970,7 @@ def generate_trailers_to_omit(line: Line, line_length: int) -> Iterator[Set[Leaf
|
|||||||
if (
|
if (
|
||||||
prev
|
prev
|
||||||
and prev.type == token.COMMA
|
and prev.type == token.COMMA
|
||||||
|
and leaf.opening_bracket is not None
|
||||||
and not is_one_tuple_between(leaf.opening_bracket, leaf, line.leaves)
|
and not is_one_tuple_between(leaf.opening_bracket, leaf, line.leaves)
|
||||||
):
|
):
|
||||||
# Never omit bracket pairs with trailing commas.
|
# Never omit bracket pairs with trailing commas.
|
||||||
|
@ -277,7 +277,9 @@ def has_magic_trailing_comma(
|
|||||||
if self.is_import:
|
if self.is_import:
|
||||||
return True
|
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 True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
@ -386,7 +386,8 @@ class Leaf(Base):
|
|||||||
value: Text
|
value: Text
|
||||||
fixers_applied: List[Any]
|
fixers_applied: List[Any]
|
||||||
bracket_depth: int
|
bracket_depth: int
|
||||||
opening_bracket: "Leaf"
|
# Changed later in brackets.py
|
||||||
|
opening_bracket: Optional["Leaf"] = None
|
||||||
used_names: Optional[Set[Text]]
|
used_names: Optional[Set[Text]]
|
||||||
_prefix = "" # Whitespace and comments preceding this token in the input
|
_prefix = "" # Whitespace and comments preceding this token in the input
|
||||||
lineno: int = 0 # Line where this token starts in the input
|
lineno: int = 0 # Line where this token starts in the input
|
||||||
@ -399,6 +400,7 @@ def __init__(
|
|||||||
context: Optional[Context] = None,
|
context: Optional[Context] = None,
|
||||||
prefix: Optional[Text] = None,
|
prefix: Optional[Text] = None,
|
||||||
fixers_applied: List[Any] = [],
|
fixers_applied: List[Any] = [],
|
||||||
|
opening_bracket: Optional["Leaf"] = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""
|
"""
|
||||||
Initializer.
|
Initializer.
|
||||||
@ -416,6 +418,7 @@ def __init__(
|
|||||||
self._prefix = prefix
|
self._prefix = prefix
|
||||||
self.fixers_applied: Optional[List[Any]] = fixers_applied[:]
|
self.fixers_applied: Optional[List[Any]] = fixers_applied[:]
|
||||||
self.children = []
|
self.children = []
|
||||||
|
self.opening_bracket = opening_bracket
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
"""Return a canonical string representation."""
|
"""Return a canonical string representation."""
|
||||||
@ -448,6 +451,7 @@ def clone(self) -> "Leaf":
|
|||||||
self.value,
|
self.value,
|
||||||
(self.prefix, (self.lineno, self.column)),
|
(self.prefix, (self.lineno, self.column)),
|
||||||
fixers_applied=self.fixers_applied,
|
fixers_applied=self.fixers_applied,
|
||||||
|
opening_bracket=self.opening_bracket,
|
||||||
)
|
)
|
||||||
|
|
||||||
def leaves(self) -> Iterator["Leaf"]:
|
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:
|
def test_python39() -> None:
|
||||||
source, expected = read_data("python39")
|
source, expected = read_data("python39")
|
||||||
assert_format(source, expected, minimum_version=(3, 9))
|
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