Fix for "# fmt: on" with decorators (#1325)
This commit is contained in:
parent
c8ca6b2b9f
commit
892eddacd2
49
black.py
49
black.py
@ -3116,18 +3116,49 @@ def generate_ignored_nodes(leaf: Leaf) -> Iterator[LN]:
|
|||||||
"""
|
"""
|
||||||
container: Optional[LN] = container_of(leaf)
|
container: Optional[LN] = container_of(leaf)
|
||||||
while container is not None and container.type != token.ENDMARKER:
|
while container is not None and container.type != token.ENDMARKER:
|
||||||
is_fmt_on = False
|
if fmt_on(container):
|
||||||
for comment in list_comments(container.prefix, is_endmarker=False):
|
|
||||||
if comment.value in FMT_ON:
|
|
||||||
is_fmt_on = True
|
|
||||||
elif comment.value in FMT_OFF:
|
|
||||||
is_fmt_on = False
|
|
||||||
if is_fmt_on:
|
|
||||||
return
|
return
|
||||||
|
|
||||||
yield container
|
# fix for fmt: on in children
|
||||||
|
if contains_fmt_on_at_column(container, leaf.column):
|
||||||
|
for child in container.children:
|
||||||
|
if contains_fmt_on_at_column(child, leaf.column):
|
||||||
|
return
|
||||||
|
yield child
|
||||||
|
else:
|
||||||
|
yield container
|
||||||
|
container = container.next_sibling
|
||||||
|
|
||||||
container = container.next_sibling
|
|
||||||
|
def fmt_on(container: LN) -> bool:
|
||||||
|
is_fmt_on = False
|
||||||
|
for comment in list_comments(container.prefix, is_endmarker=False):
|
||||||
|
if comment.value in FMT_ON:
|
||||||
|
is_fmt_on = True
|
||||||
|
elif comment.value in FMT_OFF:
|
||||||
|
is_fmt_on = False
|
||||||
|
return is_fmt_on
|
||||||
|
|
||||||
|
|
||||||
|
def contains_fmt_on_at_column(container: LN, column: int) -> bool:
|
||||||
|
for child in container.children:
|
||||||
|
if (
|
||||||
|
isinstance(child, Node)
|
||||||
|
and first_leaf_column(child) == column
|
||||||
|
or isinstance(child, Leaf)
|
||||||
|
and child.column == column
|
||||||
|
):
|
||||||
|
if fmt_on(child):
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def first_leaf_column(node: Node) -> Optional[int]:
|
||||||
|
for child in node.children:
|
||||||
|
if isinstance(child, Leaf):
|
||||||
|
return child.column
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def maybe_make_parens_invisible_in_atom(node: LN, parent: LN) -> bool:
|
def maybe_make_parens_invisible_in_atom(node: LN, parent: LN) -> bool:
|
||||||
|
31
tests/data/fmtonoff4.py
Normal file
31
tests/data/fmtonoff4.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# fmt: off
|
||||||
|
@test([
|
||||||
|
1, 2,
|
||||||
|
3, 4,
|
||||||
|
])
|
||||||
|
# fmt: on
|
||||||
|
def f(): pass
|
||||||
|
|
||||||
|
@test([
|
||||||
|
1, 2,
|
||||||
|
3, 4,
|
||||||
|
])
|
||||||
|
def f(): pass
|
||||||
|
|
||||||
|
# output
|
||||||
|
|
||||||
|
# fmt: off
|
||||||
|
@test([
|
||||||
|
1, 2,
|
||||||
|
3, 4,
|
||||||
|
])
|
||||||
|
# fmt: on
|
||||||
|
def f():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@test(
|
||||||
|
[1, 2, 3, 4,]
|
||||||
|
)
|
||||||
|
def f():
|
||||||
|
pass
|
@ -632,6 +632,14 @@ def test_fmtonoff3(self) -> None:
|
|||||||
black.assert_equivalent(source, actual)
|
black.assert_equivalent(source, actual)
|
||||||
black.assert_stable(source, actual, black.FileMode())
|
black.assert_stable(source, actual, black.FileMode())
|
||||||
|
|
||||||
|
@patch("black.dump_to_file", dump_to_stderr)
|
||||||
|
def test_fmtonoff4(self) -> None:
|
||||||
|
source, expected = read_data("fmtonoff4")
|
||||||
|
actual = fs(source)
|
||||||
|
self.assertFormatEqual(expected, actual)
|
||||||
|
black.assert_equivalent(source, actual)
|
||||||
|
black.assert_stable(source, actual, black.FileMode())
|
||||||
|
|
||||||
@patch("black.dump_to_file", dump_to_stderr)
|
@patch("black.dump_to_file", dump_to_stderr)
|
||||||
def test_remove_empty_parentheses_after_class(self) -> None:
|
def test_remove_empty_parentheses_after_class(self) -> None:
|
||||||
source, expected = read_data("class_blank_parentheses")
|
source, expected = read_data("class_blank_parentheses")
|
||||||
|
Loading…
Reference in New Issue
Block a user