Skip to content

Commit

Permalink
Fix crash on concatenated string + comment (fixes psf#1596)
Browse files Browse the repository at this point in the history
  • Loading branch information
bbugyi200 committed Sep 5, 2020
1 parent 25c1b6d commit 710f768
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 5 deletions.
28 changes: 23 additions & 5 deletions src/black/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2889,11 +2889,8 @@ class StringMerger(CustomSplitMapMixin, StringTransformer):
"""StringTransformer that merges strings together.
Requirements:
(A) The line contains adjacent strings such that at most one substring
has inline comments AND none of those inline comments are pragmas AND
the set of all substring prefixes is either of length 1 or equal to
{"", "f"} AND none of the substrings are raw strings (i.e. are prefixed
with 'r').
(A) The line contains adjacent strings such that ALL of the validation checks
listed in StringMerger.__validate_msg(...)'s docstring pass.
OR
(B) The line contains a string which uses line continuation backslashes.
Expand Down Expand Up @@ -3142,6 +3139,7 @@ def __validate_msg(line: Line, string_idx: int) -> TResult[None]:
* Ok(None), if ALL validation checks (listed below) pass.
OR
* Err(CannotTransform), if any of the following are true:
- The target string group does not contain ANY stand-alone comments.
- The target string is not in a string group (i.e. it has no
adjacent strings).
- The string group has more than one inline comment.
Expand All @@ -3150,6 +3148,26 @@ def __validate_msg(line: Line, string_idx: int) -> TResult[None]:
length greater than one and is not equal to {"", "f"}.
- The string group consists of raw strings.
"""
# We first check for "inner" stand-alone comments (i.e. stand-alone
# comments that have a string leaf before them AND after them).
for inc in [1, -1]:
i = string_idx
found_sa_comment = False
is_valid_index = is_valid_index_factory(line.leaves)
while is_valid_index(i) and line.leaves[i].type in [
token.STRING,
STANDALONE_COMMENT,
]:
if line.leaves[i].type == STANDALONE_COMMENT:
found_sa_comment = True
elif found_sa_comment:
return TErr(
"StringMerger does NOT merge string groups which contain "
"stand-alone comments."
)

i += inc

num_of_inline_string_comments = 0
set_of_prefixes = set()
num_of_strings = 0
Expand Down
28 changes: 28 additions & 0 deletions tests/data/long_strings__regression.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,19 @@ def who(self):
passenger_association=passenger_association,
)

xxxxxxx_xxxxxx_xxxxxxx = xxx(
[
xxxxxxxxxxxx(
xxxxxx_xxxxxxx=(
'((x.aaaaaaaaa = "xxxxxx.xxxxxxxxxxxxxxxxxxxxx") || (x.xxxxxxxxx = "xxxxxxxxxxxx")) && '
# xxxxx xxxxxxxxxxxx xxxx xxx (xxxxxxxxxxxxxxxx) xx x xxxxxxxxx xx xxxxxx.
"(x.bbbbbbbbbbbb.xxx != "
'"xxx:xxx:xxx::cccccccccccc:xxxxxxx-xxxx/xxxxxxxxxxx/xxxxxxxxxxxxxxxxx") && '
)
)
]
)

# output


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


xxxxxxx_xxxxxx_xxxxxxx = xxx(
[
xxxxxxxxxxxx(
xxxxxx_xxxxxxx=(
'((x.aaaaaaaaa = "xxxxxx.xxxxxxxxxxxxxxxxxxxxx") || (x.xxxxxxxxx ='
' "xxxxxxxxxxxx")) && '
# xxxxx xxxxxxxxxxxx xxxx xxx (xxxxxxxxxxxxxxxx) xx x xxxxxxxxx xx xxxxxx.
"(x.bbbbbbbbbbbb.xxx != "
'"xxx:xxx:xxx::cccccccccccc:xxxxxxx-xxxx/xxxxxxxxxxx/xxxxxxxxxxxxxxxxx") && '
)
)
]
)

0 comments on commit 710f768

Please sign in to comment.