Fix an infinite loop when using # fmt: on/off ... (#3158)

... in the middle of an expression or code block by adding a missing return.

Co-authored-by: Richard Si <63936253+ichard26@users.noreply.github.com>
Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
This commit is contained in:
Yilei "Dolee" Yang 2022-07-19 17:57:23 -07:00 committed by GitHub
parent 6ea4eddf93
commit 249c6536c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 1 deletions

View File

@ -10,6 +10,8 @@
<!-- Changes that affect Black's stable style -->
- Fix an infinite loop when using `# fmt: on/off` in the middle of an expression or code
block (#3158)
- Fix incorrect handling of `# fmt: skip` on colon `:` lines. (#3148)
- Comments are no longer deleted when a line had spaces removed around power operators
(#2874)

View File

@ -13,7 +13,7 @@
from blib2to3.pgen2 import token
from black.nodes import first_leaf_column, preceding_leaf, container_of
from black.nodes import STANDALONE_COMMENT, WHITESPACE
from black.nodes import CLOSING_BRACKETS, STANDALONE_COMMENT, WHITESPACE
# types
LN = Union[Leaf, Node]
@ -227,6 +227,14 @@ def generate_ignored_nodes(
# fix for fmt: on in children
if contains_fmt_on_at_column(container, leaf.column, preview=preview):
for child in container.children:
if isinstance(child, Leaf) and is_fmt_on(child, preview=preview):
if child.type in CLOSING_BRACKETS:
# This means `# fmt: on` is placed at a different bracket level
# than `# fmt: off`. This is an invalid use, but as a courtesy,
# we include this closing bracket in the ignored nodes.
# The alternative is to fail the formatting.
yield child
return
if contains_fmt_on_at_column(child, leaf.column, preview=preview):
return
yield child

View File

@ -0,0 +1,36 @@
# Regression test for https://github.com/psf/black/issues/3129.
setup(
entry_points={
# fmt: off
"console_scripts": [
"foo-bar"
"=foo.bar.:main",
# fmt: on
] # Includes an formatted indentation.
},
)
# Regression test for https://github.com/psf/black/issues/2015.
run(
# fmt: off
[
"ls",
"-la",
]
# fmt: on
+ path,
check=True,
)
# Regression test for https://github.com/psf/black/issues/3026.
def test_func():
# yapf: disable
if unformatted( args ):
return True
# yapf: enable
elif b:
return True
return False