Skip to content

Commit

Permalink
Fix removed comments in stub files (#3745)
Browse files Browse the repository at this point in the history
  • Loading branch information
JelleZijlstra committed Jul 9, 2023
1 parent 2593af2 commit 257d392
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 3 deletions.
2 changes: 2 additions & 0 deletions CHANGES.md
Expand Up @@ -15,6 +15,8 @@

- Fix a bug where an illegal trailing comma was added to return type annotations using
PEP 604 unions (#3735)
- Fix several bugs and crashes where comments in stub files were removed or mishandled
under some circumstances. (#3745)
- Fix a bug where multi-line open parenthesis magic comment like `type: ignore` were not
correctly parsed (#3740)

Expand Down
11 changes: 10 additions & 1 deletion src/black/nodes.py
Expand Up @@ -714,6 +714,11 @@ def is_multiline_string(leaf: Leaf) -> bool:

def is_stub_suite(node: Node) -> bool:
"""Return True if `node` is a suite with a stub body."""

# If there is a comment, we want to keep it.
if node.prefix.strip():
return False

if (
len(node.children) != 4
or node.children[0].type != token.NEWLINE
Expand All @@ -722,6 +727,9 @@ def is_stub_suite(node: Node) -> bool:
):
return False

if node.children[3].prefix.strip():
return False

return is_stub_body(node.children[2])


Expand All @@ -735,7 +743,8 @@ def is_stub_body(node: LN) -> bool:

child = node.children[0]
return (
child.type == syms.atom
not child.prefix.strip()
and child.type == syms.atom
and len(child.children) == 3
and all(leaf == Leaf(token.DOT, ".") for leaf in child.children)
)
Expand Down
41 changes: 41 additions & 0 deletions tests/data/simple_cases/ignore_pyi.py
@@ -0,0 +1,41 @@
def f(): # type: ignore
...

class x: # some comment
...

class y:
... # comment

# whitespace doesn't matter (note the next line has a trailing space and tab)
class z:
...

def g():
# hi
...

def h():
...
# bye

# output

def f(): # type: ignore
...

class x: # some comment
...

class y: ... # comment

# whitespace doesn't matter (note the next line has a trailing space and tab)
class z: ...

def g():
# hi
...

def h():
...
# bye
5 changes: 3 additions & 2 deletions tests/test_format.py
Expand Up @@ -33,9 +33,10 @@ def check_file(
@pytest.mark.parametrize("filename", all_data_cases("simple_cases"))
def test_simple_format(filename: str) -> None:
magic_trailing_comma = filename != "skip_magic_trailing_comma"
check_file(
"simple_cases", filename, black.Mode(magic_trailing_comma=magic_trailing_comma)
mode = black.Mode(
magic_trailing_comma=magic_trailing_comma, is_pyi=filename.endswith("_pyi")
)
check_file("simple_cases", filename, mode)


@pytest.mark.parametrize("filename", all_data_cases("preview"))
Expand Down

0 comments on commit 257d392

Please sign in to comment.