Fix crash on concatenated string + comment (fixes #1596) (#1677)

Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
Bryan Bugyi 2020-09-06 11:02:57 -04:00 committed by GitHub
parent e3ccabb23c
commit 7bca930ca3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 5 deletions

View File

@ -2889,11 +2889,8 @@ class StringMerger(CustomSplitMapMixin, StringTransformer):
"""StringTransformer that merges strings together. """StringTransformer that merges strings together.
Requirements: Requirements:
(A) The line contains adjacent strings such that at most one substring (A) The line contains adjacent strings such that ALL of the validation checks
has inline comments AND none of those inline comments are pragmas AND listed in StringMerger.__validate_msg(...)'s docstring pass.
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').
OR OR
(B) The line contains a string which uses line continuation backslashes. (B) The line contains a string which uses line continuation backslashes.
@ -3142,6 +3139,7 @@ def __validate_msg(line: Line, string_idx: int) -> TResult[None]:
* Ok(None), if ALL validation checks (listed below) pass. * Ok(None), if ALL validation checks (listed below) pass.
OR OR
* Err(CannotTransform), if any of the following are true: * 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 - The target string is not in a string group (i.e. it has no
adjacent strings). adjacent strings).
- The string group has more than one inline comment. - The string group has more than one inline comment.
@ -3150,6 +3148,26 @@ def __validate_msg(line: Line, string_idx: int) -> TResult[None]:
length greater than one and is not equal to {"", "f"}. length greater than one and is not equal to {"", "f"}.
- The string group consists of raw strings. - 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 num_of_inline_string_comments = 0
set_of_prefixes = set() set_of_prefixes = set()
num_of_strings = 0 num_of_strings = 0

View File

@ -310,6 +310,19 @@ def who(self):
passenger_association=passenger_association, 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") && '
)
)
]
)
if __name__ == "__main__": if __name__ == "__main__":
for i in range(4, 8): for i in range(4, 8):
cmd = ( cmd = (
@ -709,6 +722,20 @@ def who(self):
) )
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") && '
)
)
]
)
if __name__ == "__main__": if __name__ == "__main__":
for i in range(4, 8): for i in range(4, 8):
cmd = ( cmd = (