diff --git a/CHANGES.md b/CHANGES.md index 5510b4b..68a2fe3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -10,6 +10,8 @@ +- Fix crash when `# fmt: off` is used before a closing parenthesis or bracket. (#4363) + ### Preview style diff --git a/src/black/comments.py b/src/black/comments.py index ea54e24..a835f58 100644 --- a/src/black/comments.py +++ b/src/black/comments.py @@ -184,24 +184,24 @@ def convert_one_fmt_off_pair( for leaf in node.leaves(): previous_consumed = 0 for comment in list_comments(leaf.prefix, is_endmarker=False): - should_pass_fmt = comment.value in FMT_OFF or _contains_fmt_skip_comment( - comment.value, mode - ) - if not should_pass_fmt: + is_fmt_off = comment.value in FMT_OFF + is_fmt_skip = _contains_fmt_skip_comment(comment.value, mode) + if (not is_fmt_off and not is_fmt_skip) or ( + # Invalid use when `# fmt: off` is applied before a closing bracket. + is_fmt_off + and leaf.type in CLOSING_BRACKETS + ): previous_consumed = comment.consumed continue # We only want standalone comments. If there's no previous leaf or # the previous leaf is indentation, it's a standalone comment in # disguise. - if should_pass_fmt and comment.type != STANDALONE_COMMENT: + if comment.type != STANDALONE_COMMENT: prev = preceding_leaf(leaf) 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 - if ( - _contains_fmt_skip_comment(comment.value, mode) - and prev.type in WHITESPACE - ): + if is_fmt_skip and prev.type in WHITESPACE: continue ignored_nodes = list(generate_ignored_nodes(leaf, comment, mode)) @@ -213,7 +213,7 @@ def convert_one_fmt_off_pair( prefix = first.prefix if comment.value in FMT_OFF: first.prefix = prefix[comment.consumed :] - if _contains_fmt_skip_comment(comment.value, mode): + if is_fmt_skip: first.prefix = "" standalone_comment_prefix = prefix else: @@ -233,7 +233,7 @@ def convert_one_fmt_off_pair( fmt_off_prefix = fmt_off_prefix.split("\n")[-1] standalone_comment_prefix += fmt_off_prefix hidden_value = comment.value + "\n" + hidden_value - if _contains_fmt_skip_comment(comment.value, mode): + if is_fmt_skip: hidden_value += ( comment.leading_whitespace if Preview.no_normalize_fmt_skip_whitespace in mode diff --git a/tests/data/cases/fmtonoff6.py b/tests/data/cases/fmtonoff6.py new file mode 100644 index 0000000..9d23925 --- /dev/null +++ b/tests/data/cases/fmtonoff6.py @@ -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 +}