From 40fae18134916b8499bd992d8bef4ae23bcd2986 Mon Sep 17 00:00:00 2001 From: Sergey Vartanov Date: Wed, 9 Jun 2021 00:37:34 +0300 Subject: [PATCH] Possible fix for issue with indentation and fmt: skip (#2281) Not sure the fix is right. Here is what I found: issue is connected with line first.prefix = prefix[comment.consumed :] in `comments.py`. `first.prefix` is a prefix of the line, that ends with `# fmt: skip`, but `comment.consumed` is the length of the `" # fmt: skip"` string. If prefix length is greater than 14, `first.prefix` will grow every time we apply formatting. Fixes #2254 --- CHANGES.md | 1 + src/black/comments.py | 5 ++++- tests/data/fmtskip6.py | 13 +++++++++++++ tests/test_format.py | 1 + 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 tests/data/fmtskip6.py diff --git a/CHANGES.md b/CHANGES.md index 02b3fdf..2d2b3b4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,6 +4,7 @@ ### _Black_ +- Fix failure caused by `fmt: skip` and indentation (#2281) - Account for += assignment when deciding whether to split string (#2312) - Correct max string length calculation when there are string operators (#2292) - Fixed option usage when using the `--code` flag (#2259) diff --git a/src/black/comments.py b/src/black/comments.py index 415e391..c7513c2 100644 --- a/src/black/comments.py +++ b/src/black/comments.py @@ -159,7 +159,10 @@ def convert_one_fmt_off_pair(node: Node) -> bool: first = ignored_nodes[0] # Can be a container node with the `leaf`. parent = first.parent prefix = first.prefix - first.prefix = prefix[comment.consumed :] + if comment.value in FMT_OFF: + first.prefix = prefix[comment.consumed :] + if comment.value in FMT_SKIP: + first.prefix = "" hidden_value = "".join(str(n) for n in ignored_nodes) if comment.value in FMT_OFF: hidden_value = comment.value + "\n" + hidden_value diff --git a/tests/data/fmtskip6.py b/tests/data/fmtskip6.py new file mode 100644 index 0000000..0a779fc --- /dev/null +++ b/tests/data/fmtskip6.py @@ -0,0 +1,13 @@ +class A: + def f(self): + for line in range(10): + if True: + pass # fmt: skip + +# output + +class A: + def f(self): + for line in range(10): + if True: + pass # fmt: skip diff --git a/tests/test_format.py b/tests/test_format.py index 5c78afe..fc9678a 100644 --- a/tests/test_format.py +++ b/tests/test_format.py @@ -41,6 +41,7 @@ SIMPLE_CASES = [ "fmtskip3", "fmtskip4", "fmtskip5", + "fmtskip6", "fstring", "function", "function2", -- 2.39.5