mirror of
https://github.com/astral-sh/ruff.git
synced 2025-07-23 04:55:09 +00:00
Treat comments on open parentheses in return annotations as dangling (#6413)
## Summary Given: ```python def double(a: int) -> ( # Hello int ): return 2*a ``` We currently treat `# Hello` as a trailing comment on the parameters (`(a: int)`). This PR adds a placement method to instead treat it as a dangling comment on the function definition itself, so that it gets formatted at the end of the definition, like: ```python def double(a: int) -> int: # Hello return 2*a ``` The formatting in this case is unchanged, but it's incorrect IMO for that to be a trailing comment on the parameters, and that placement leads to an instability after changing the grouping in #6410. Fixing this led to a _different_ instability related to tuple return type annotations, like: ```python def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override] ): ... ``` (This is a real example.) To fix, I had to special-case tuples in that spot, though I'm not certain that's correct.
This commit is contained in:
parent
d33618062e
commit
55d6fd53cd
4 changed files with 211 additions and 12 deletions
|
@ -377,6 +377,44 @@ def f( # first
|
|||
# third
|
||||
):
|
||||
...
|
||||
|
||||
# Handle comments on empty tuple return types.
|
||||
def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override]
|
||||
): ...
|
||||
|
||||
def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override]
|
||||
# comment
|
||||
): ...
|
||||
|
||||
def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override]
|
||||
1
|
||||
): ...
|
||||
|
||||
def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override]
|
||||
1, 2
|
||||
): ...
|
||||
|
||||
def zrevrangebylex(self, name: _Key, max: _Value, min: _Value, start: int | None = None, num: int | None = None) -> ( # type: ignore[override]
|
||||
(1, 2)
|
||||
): ...
|
||||
|
||||
def handleMatch( # type: ignore[override] # https://github.com/python/mypy/issues/10197
|
||||
self, m: Match[str], data: str
|
||||
) -> Union[Tuple[None, None, None], Tuple[Element, int, int]]:
|
||||
...
|
||||
|
||||
def double(a: int # Hello
|
||||
) -> (int):
|
||||
return 2 * a
|
||||
|
||||
def double(a: int) -> ( # Hello
|
||||
int
|
||||
):
|
||||
return 2*a
|
||||
|
||||
def double(a: int) -> ( # Hello
|
||||
):
|
||||
return 2*a
|
||||
```
|
||||
|
||||
## Output
|
||||
|
@ -905,6 +943,89 @@ def f( # first
|
|||
/, # second
|
||||
):
|
||||
...
|
||||
|
||||
|
||||
# Handle comments on empty tuple return types.
|
||||
def zrevrangebylex(
|
||||
self,
|
||||
name: _Key,
|
||||
max: _Value,
|
||||
min: _Value,
|
||||
start: int | None = None,
|
||||
num: int | None = None,
|
||||
) -> ( # type: ignore[override]
|
||||
):
|
||||
...
|
||||
|
||||
|
||||
def zrevrangebylex(
|
||||
self,
|
||||
name: _Key,
|
||||
max: _Value,
|
||||
min: _Value,
|
||||
start: int | None = None,
|
||||
num: int | None = None,
|
||||
) -> ( # type: ignore[override]
|
||||
# comment
|
||||
):
|
||||
...
|
||||
|
||||
|
||||
def zrevrangebylex(
|
||||
self,
|
||||
name: _Key,
|
||||
max: _Value,
|
||||
min: _Value,
|
||||
start: int | None = None,
|
||||
num: int | None = None,
|
||||
) -> 1: # type: ignore[override]
|
||||
...
|
||||
|
||||
|
||||
def zrevrangebylex(
|
||||
self,
|
||||
name: _Key,
|
||||
max: _Value,
|
||||
min: _Value,
|
||||
start: int | None = None,
|
||||
num: int | None = None,
|
||||
) -> ( # type: ignore[override]
|
||||
1,
|
||||
2,
|
||||
):
|
||||
...
|
||||
|
||||
|
||||
def zrevrangebylex(
|
||||
self,
|
||||
name: _Key,
|
||||
max: _Value,
|
||||
min: _Value,
|
||||
start: int | None = None,
|
||||
num: int | None = None,
|
||||
) -> (1, 2): # type: ignore[override]
|
||||
...
|
||||
|
||||
|
||||
def handleMatch( # type: ignore[override] # https://github.com/python/mypy/issues/10197
|
||||
self, m: Match[str], data: str
|
||||
) -> Union[Tuple[None, None, None], Tuple[Element, int, int]]:
|
||||
...
|
||||
|
||||
|
||||
def double(
|
||||
a: int, # Hello
|
||||
) -> int:
|
||||
return 2 * a
|
||||
|
||||
|
||||
def double(a: int) -> int: # Hello
|
||||
return 2 * a
|
||||
|
||||
|
||||
def double(a: int) -> ( # Hello
|
||||
):
|
||||
return 2 * a
|
||||
```
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue