Skip to content

Commit

Permalink
Fix crash on assert and parenthesized % format (fixes #1597, fixes #1605
Browse files Browse the repository at this point in the history
)
  • Loading branch information
bbugyi200 committed Sep 5, 2020
1 parent 25c1b6d commit ccc7723
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 2 deletions.
30 changes: 28 additions & 2 deletions src/black/__init__.py
Expand Up @@ -112,6 +112,10 @@ class InvalidInput(ValueError):
"""Raised when input source code fails all parse attempts."""


class BracketMatchError(KeyError):
"""Raised when an opening bracket is unable to be matched to a closing bracket."""


T = TypeVar("T")
E = TypeVar("E", bound=Exception)

Expand Down Expand Up @@ -1308,7 +1312,13 @@ def mark(self, leaf: Leaf) -> None:
self.maybe_decrement_after_lambda_arguments(leaf)
if leaf.type in CLOSING_BRACKETS:
self.depth -= 1
opening_bracket = self.bracket_match.pop((self.depth, leaf.type))
try:
opening_bracket = self.bracket_match.pop((self.depth, leaf.type))
except KeyError as e:
raise BracketMatchError(
"Unable to match a closing bracket to the following opening"
f" bracket: {leaf}"
) from e
leaf.opening_bracket = opening_bracket
if not leaf.value:
self.invisible.append(leaf)
Expand Down Expand Up @@ -3306,10 +3316,26 @@ def do_transform(self, line: Line, string_idx: int) -> Iterator[TResult[Line]]:
yield TErr(
"Will not strip parentheses which have comments attached to them."
)
return

new_line = line.clone()
new_line.comments = line.comments.copy()
append_leaves(new_line, line, LL[: string_idx - 1])
try:
append_leaves(new_line, line, LL[: string_idx - 1])
except BracketMatchError as e:
# HACK: I believe there is currently a bug somewhere in
# right_hand_split() that is causing brackets to not be tracked
# properly by a shared BracketTracker. It is probably fine to just
# ignore this event using the `preformatted=True` keyword argument,
# but to be safe we abort this transformer when this happens.
cant_transform = CannotTransform(
"While attempting to strip parens, we were unable to match one of the"
" other brackets (i.e. NOT one of the target parens) in this line to"
" its corresponding opening/closing bracket."
)
cant_transform.__cause__ = e
yield Err(cant_transform)
return

string_leaf = Leaf(token.STRING, LL[string_idx].value)
LL[string_idx - 1].remove()
Expand Down
42 changes: 42 additions & 0 deletions tests/data/long_strings__regression.py
Expand Up @@ -310,6 +310,25 @@ def who(self):
passenger_association=passenger_association,
)

def A():
def B():
def C():
def D():
def E():
def F():
def G():
assert (
c_float(val[0][0] / val[0][1]).value
== c_float(value[0][0] / value[0][1]).value
), "%s didn't roundtrip" % tag

class xxxxxxxxxxxxxxxxxxxxx(xxxx.xxxxxxxxxxxxx):
def xxxxxxx_xxxxxx(xxxx):
assert xxxxxxx_xxxx in [
x.xxxxx.xxxxxx.xxxxx.xxxxxx,
x.xxxxx.xxxxxx.xxxxx.xxxx,
], ("xxxxxxxxxxx xxxxxxx xxxx (xxxxxx xxxx) %x xxx xxxxx" % xxxxxxx_xxxx)

# output


Expand Down Expand Up @@ -702,3 +721,26 @@ def who(self):
passenger_association=passenger_association,
)
)


def A():
def B():
def C():
def D():
def E():
def F():
def G():
assert (
c_float(val[0][0] / val[0][1]).value
== c_float(value[0][0] / value[0][1]).value
), ("%s didn't roundtrip" % tag)


class xxxxxxxxxxxxxxxxxxxxx(xxxx.xxxxxxxxxxxxx):
def xxxxxxx_xxxxxx(xxxx):
assert xxxxxxx_xxxx in [
x.xxxxx.xxxxxx.xxxxx.xxxxxx,
x.xxxxx.xxxxxx.xxxxx.xxxx,
], (
"xxxxxxxxxxx xxxxxxx xxxx (xxxxxx xxxx) %x xxx xxxxx" % xxxxxxx_xxxx
)

0 comments on commit ccc7723

Please sign in to comment.