Make sure Black doesn't crash when fmt:off is used before a closing paren (#4363)

This commit is contained in:
Yilei Yang 2024-05-15 17:32:27 -07:00 committed by GitHub
parent b9c63230b4
commit 9c1fd463e1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 27 additions and 12 deletions

View File

@ -10,6 +10,8 @@
<!-- Changes that affect Black's stable style --> <!-- Changes that affect Black's stable style -->
- Fix crash when `# fmt: off` is used before a closing parenthesis or bracket. (#4363)
### Preview style ### Preview style
<!-- Changes that affect Black's preview style --> <!-- Changes that affect Black's preview style -->

View File

@ -184,24 +184,24 @@ def convert_one_fmt_off_pair(
for leaf in node.leaves(): for leaf in node.leaves():
previous_consumed = 0 previous_consumed = 0
for comment in list_comments(leaf.prefix, is_endmarker=False): for comment in list_comments(leaf.prefix, is_endmarker=False):
should_pass_fmt = comment.value in FMT_OFF or _contains_fmt_skip_comment( is_fmt_off = comment.value in FMT_OFF
comment.value, mode is_fmt_skip = _contains_fmt_skip_comment(comment.value, mode)
) if (not is_fmt_off and not is_fmt_skip) or (
if not should_pass_fmt: # Invalid use when `# fmt: off` is applied before a closing bracket.
is_fmt_off
and leaf.type in CLOSING_BRACKETS
):
previous_consumed = comment.consumed previous_consumed = comment.consumed
continue continue
# We only want standalone comments. If there's no previous leaf or # We only want standalone comments. If there's no previous leaf or
# the previous leaf is indentation, it's a standalone comment in # the previous leaf is indentation, it's a standalone comment in
# disguise. # disguise.
if should_pass_fmt and comment.type != STANDALONE_COMMENT: if comment.type != STANDALONE_COMMENT:
prev = preceding_leaf(leaf) prev = preceding_leaf(leaf)
if prev: if prev:
if comment.value in FMT_OFF and prev.type not in WHITESPACE: if is_fmt_off and prev.type not in WHITESPACE:
continue continue
if ( if is_fmt_skip and prev.type in WHITESPACE:
_contains_fmt_skip_comment(comment.value, mode)
and prev.type in WHITESPACE
):
continue continue
ignored_nodes = list(generate_ignored_nodes(leaf, comment, mode)) ignored_nodes = list(generate_ignored_nodes(leaf, comment, mode))
@ -213,7 +213,7 @@ def convert_one_fmt_off_pair(
prefix = first.prefix prefix = first.prefix
if comment.value in FMT_OFF: if comment.value in FMT_OFF:
first.prefix = prefix[comment.consumed :] first.prefix = prefix[comment.consumed :]
if _contains_fmt_skip_comment(comment.value, mode): if is_fmt_skip:
first.prefix = "" first.prefix = ""
standalone_comment_prefix = prefix standalone_comment_prefix = prefix
else: else:
@ -233,7 +233,7 @@ def convert_one_fmt_off_pair(
fmt_off_prefix = fmt_off_prefix.split("\n")[-1] fmt_off_prefix = fmt_off_prefix.split("\n")[-1]
standalone_comment_prefix += fmt_off_prefix standalone_comment_prefix += fmt_off_prefix
hidden_value = comment.value + "\n" + hidden_value hidden_value = comment.value + "\n" + hidden_value
if _contains_fmt_skip_comment(comment.value, mode): if is_fmt_skip:
hidden_value += ( hidden_value += (
comment.leading_whitespace comment.leading_whitespace
if Preview.no_normalize_fmt_skip_whitespace in mode if Preview.no_normalize_fmt_skip_whitespace in mode

View File

@ -0,0 +1,13 @@
# Regression test for https://github.com/psf/black/issues/2478.
def foo():
arr = (
(3833567325051000, 5, 1, 2, 4229.25, 6, 0),
# fmt: off
)
# Regression test for https://github.com/psf/black/issues/3458.
dependencies = {
a: b,
# fmt: off
}