Skip to content

Commit 725fbb7

Browse files
authored
[ty] Use partially qualified names when reporting diagnostics regarding bad calls to methods (#24560)
1 parent ddd6a30 commit 725fbb7

28 files changed

Lines changed: 185 additions & 167 deletions

crates/ty_python_semantic/resources/mdtest/annotations/self.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ Calling an instance method explicitly verifies the first argument:
181181
```py
182182
A.implicit_self(a)
183183

184-
# error: [invalid-argument-type] "Argument to function `implicit_self` is incorrect: Argument type `Literal[1]` does not satisfy upper bound `A` of type variable `Self`"
184+
# error: [invalid-argument-type] "Argument to function `A.implicit_self` is incorrect: Argument type `Literal[1]` does not satisfy upper bound `A` of type variable `Self`"
185185
A.implicit_self(1)
186186
```
187187

@@ -193,7 +193,7 @@ from typing import Never, Callable
193193
class Strange:
194194
def can_not_be_called(self: Never) -> None: ...
195195

196-
# error: [invalid-argument-type] "Argument to bound method `can_not_be_called` is incorrect: Expected `Never`, found `Strange`"
196+
# error: [invalid-argument-type] "Argument to bound method `Strange.can_not_be_called` is incorrect: Expected `Never`, found `Strange`"
197197
Strange().can_not_be_called()
198198
```
199199

@@ -1065,7 +1065,7 @@ class Explicit:
10651065
def forward(self: Explicit) -> None:
10661066
reveal_type(self) # revealed: Explicit
10671067

1068-
# error: [invalid-argument-type] "Argument to bound method `bad` is incorrect: Expected `Disjoint`, found `Explicit`"
1068+
# error: [invalid-argument-type] "Argument to bound method `Explicit.bad` is incorrect: Expected `Disjoint`, found `Explicit`"
10691069
Explicit().bad()
10701070

10711071
Explicit().forward()

crates/ty_python_semantic/resources/mdtest/bidirectional.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ class A:
443443

444444
A(f(1))
445445

446-
# error: [invalid-argument-type] "Argument to function `__new__` is incorrect: Expected `list[int | str]`, found `list[list[Unknown]]`"
446+
# error: [invalid-argument-type] "Argument to constructor `A.__new__` is incorrect: Expected `list[int | str]`, found `list[list[Unknown]]`"
447447
A(f([]))
448448
```
449449

crates/ty_python_semantic/resources/mdtest/call/callable_instance.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ class C:
8585

8686
c = C()
8787

88-
# error: 15 [invalid-argument-type] "Argument to bound method `__call__` is incorrect: Expected `int`, found `Literal["foo"]`"
88+
# error: 15 [invalid-argument-type] "Argument to bound method `C.__call__` is incorrect: Expected `int`, found `Literal["foo"]`"
8989
reveal_type(c("foo")) # revealed: int
9090
```
9191

@@ -99,7 +99,7 @@ class C:
9999

100100
c = C()
101101

102-
# error: 13 [invalid-argument-type] "Argument to bound method `__call__` is incorrect: Expected `int`, found `C`"
102+
# error: 13 [invalid-argument-type] "Argument to bound method `C.__call__` is incorrect: Expected `int`, found `C`"
103103
reveal_type(c()) # revealed: int
104104
```
105105

crates/ty_python_semantic/resources/mdtest/call/constructor.md

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class Foo: ...
4242

4343
reveal_type(Foo()) # revealed: Foo
4444

45-
# error: [too-many-positional-arguments] "Too many positional arguments to bound method `__init__`: expected 1, got 2"
45+
# error: [too-many-positional-arguments] "Too many positional arguments to `object.__init__`: expected 1, got 2"
4646
reveal_type(Foo(1)) # revealed: Foo
4747
```
4848

@@ -55,11 +55,11 @@ class Foo:
5555

5656
reveal_type(Foo(1)) # revealed: Foo
5757

58-
# error: [invalid-argument-type] "Argument to function `__new__` is incorrect: Expected `int`, found `Literal["x"]`"
58+
# error: [invalid-argument-type] "Argument to constructor `Foo.__new__` is incorrect: Expected `int`, found `Literal["x"]`"
5959
reveal_type(Foo("x")) # revealed: Foo
60-
# error: [missing-argument] "No argument provided for required parameter `x` of function `__new__`"
60+
# error: [missing-argument] "No argument provided for required parameter `x` of constructor `Foo.__new__`"
6161
reveal_type(Foo()) # revealed: Foo
62-
# error: [too-many-positional-arguments] "Too many positional arguments to function `__new__`: expected 2, got 3"
62+
# error: [too-many-positional-arguments] "Too many positional arguments to constructor `Foo.__new__`: expected 2, got 3"
6363
reveal_type(Foo(1, 2)) # revealed: Foo
6464
```
6565

@@ -79,9 +79,9 @@ class Foo(Base): ...
7979

8080
reveal_type(Foo(1)) # revealed: Foo
8181

82-
# error: [missing-argument] "No argument provided for required parameter `x` of function `__new__`"
82+
# error: [missing-argument] "No argument provided for required parameter `x` of constructor `Base.__new__`"
8383
reveal_type(Foo()) # revealed: Foo
84-
# error: [too-many-positional-arguments] "Too many positional arguments to function `__new__`: expected 2, got 3"
84+
# error: [too-many-positional-arguments] "Too many positional arguments to constructor `Base.__new__`: expected 2, got 3"
8585
reveal_type(Foo(1, 2)) # revealed: Foo
8686
```
8787

@@ -98,7 +98,7 @@ class Foo:
9898
reveal_type(Foo(1)) # revealed: Foo
9999

100100
Foo(1)
101-
# error: [too-many-positional-arguments] "Too many positional arguments to function `__new__`: expected 2, got 3"
101+
# error: [too-many-positional-arguments] "Too many positional arguments to constructor `Foo.__new__`: expected 2, got 3"
102102
Foo(1, 2)
103103
```
104104

@@ -114,13 +114,13 @@ def _(flag: bool) -> None:
114114
def __new__(cls, x: int, y: int = 1): ...
115115

116116
reveal_type(Foo(1)) # revealed: Foo
117-
# error: [invalid-argument-type] "Argument to function `__new__` is incorrect: Expected `int`, found `Literal["1"]`"
118-
# error: [invalid-argument-type] "Argument to function `__new__` is incorrect: Expected `int`, found `Literal["1"]`"
117+
# error: [invalid-argument-type] "Argument to constructor `Foo.__new__` is incorrect: Expected `int`, found `Literal["1"]`"
118+
# error: [invalid-argument-type] "Argument to constructor `Foo.__new__` is incorrect: Expected `int`, found `Literal["1"]`"
119119
reveal_type(Foo("1")) # revealed: Foo
120-
# error: [missing-argument] "No argument provided for required parameter `x` of function `__new__`"
121-
# error: [missing-argument] "No argument provided for required parameter `x` of function `__new__`"
120+
# error: [missing-argument] "No argument provided for required parameter `x` of constructor `Foo.__new__`"
121+
# error: [missing-argument] "No argument provided for required parameter `x` of constructor `Foo.__new__`"
122122
reveal_type(Foo()) # revealed: Foo
123-
# error: [too-many-positional-arguments] "Too many positional arguments to function `__new__`: expected 2, got 3"
123+
# error: [too-many-positional-arguments] "Too many positional arguments to constructor `Foo.__new__`: expected 2, got 3"
124124
reveal_type(Foo(1, 2)) # revealed: Foo
125125
```
126126

@@ -141,7 +141,7 @@ class Foo:
141141
__new__: Descriptor = Descriptor()
142142

143143
reveal_type(Foo(1)) # revealed: Foo
144-
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `__call__`"
144+
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `SomeCallable.__call__`"
145145
reveal_type(Foo()) # revealed: Foo
146146
```
147147

@@ -166,8 +166,8 @@ class Foo:
166166
def __new__(cls, x: int):
167167
return object.__new__(cls)
168168

169-
# error: [invalid-argument-type] "Argument to bound method `__new__` is incorrect: Expected `int`, found `<class 'Foo'>`"
170-
# error: [too-many-positional-arguments] "Too many positional arguments to bound method `__new__`: expected 1, got 2"
169+
# error: [invalid-argument-type] "Argument to bound method `Foo.__new__` is incorrect: Expected `int`, found `<class 'Foo'>`"
170+
# error: [too-many-positional-arguments] "Too many positional arguments to bound method `Foo.__new__`: expected 1, got 2"
171171
Foo(1)
172172
```
173173

@@ -184,7 +184,7 @@ class Foo:
184184
__new__ = Callable()
185185

186186
reveal_type(Foo(1)) # revealed: Foo
187-
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `__call__`"
187+
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `Callable.__call__`"
188188
reveal_type(Foo()) # revealed: Foo
189189
```
190190

@@ -237,9 +237,9 @@ class Foo:
237237

238238
reveal_type(Foo(1)) # revealed: Foo
239239

240-
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `__init__`"
240+
# error: [missing-argument] "No argument provided for required parameter `x` of `Foo.__init__`"
241241
reveal_type(Foo()) # revealed: Foo
242-
# error: [too-many-positional-arguments] "Too many positional arguments to bound method `__init__`: expected 2, got 3"
242+
# error: [too-many-positional-arguments] "Too many positional arguments to `Foo.__init__`: expected 2, got 3"
243243
reveal_type(Foo(1, 2)) # revealed: Foo
244244
```
245245

@@ -1163,9 +1163,9 @@ class C:
11631163
T = TypeVar("T", bound=C)
11641164

11651165
def f(cls: type[T]):
1166-
# error: [missing-argument] "No argument provided for required parameter `y` of function `__new__`"
1166+
# error: [missing-argument] "No argument provided for required parameter `y` of constructor `C.__new__`"
11671167
cls(1)
1168-
# error: [invalid-argument-type] "Argument to function `__new__` is incorrect: Expected `str`, found `Literal[2]`"
1168+
# error: [invalid-argument-type] "Argument to constructor `C.__new__` is incorrect: Expected `str`, found `Literal[2]`"
11691169
cls(1, 2)
11701170
reveal_type(cls(1, "foo")) # revealed: T@f
11711171
```
@@ -1199,9 +1199,9 @@ class Foo(Base): ...
11991199

12001200
reveal_type(Foo(1)) # revealed: Foo
12011201

1202-
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `__init__`"
1202+
# error: [missing-argument] "No argument provided for required parameter `x` of `Base.__init__`"
12031203
reveal_type(Foo()) # revealed: Foo
1204-
# error: [too-many-positional-arguments] "Too many positional arguments to bound method `__init__`: expected 2, got 3"
1204+
# error: [too-many-positional-arguments] "Too many positional arguments to `Base.__init__`: expected 2, got 3"
12051205
reveal_type(Foo(1, 2)) # revealed: Foo
12061206
```
12071207

@@ -1217,13 +1217,13 @@ def _(flag: bool) -> None:
12171217
def __init__(self, x: int, y: int = 1): ...
12181218

12191219
reveal_type(Foo(1)) # revealed: Foo
1220-
# error: [invalid-argument-type] "Argument to bound method `__init__` is incorrect: Expected `int`, found `Literal["1"]`"
1221-
# error: [invalid-argument-type] "Argument to bound method `__init__` is incorrect: Expected `int`, found `Literal["1"]`"
1220+
# error: [invalid-argument-type] "Argument to `Foo.__init__` is incorrect: Expected `int`, found `Literal["1"]`"
1221+
# error: [invalid-argument-type] "Argument to `Foo.__init__` is incorrect: Expected `int`, found `Literal["1"]`"
12221222
reveal_type(Foo("1")) # revealed: Foo
1223-
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `__init__`"
1224-
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `__init__`"
1223+
# error: [missing-argument] "No argument provided for required parameter `x` of `Foo.__init__`"
1224+
# error: [missing-argument] "No argument provided for required parameter `x` of `Foo.__init__`"
12251225
reveal_type(Foo()) # revealed: Foo
1226-
# error: [too-many-positional-arguments] "Too many positional arguments to bound method `__init__`: expected 2, got 3"
1226+
# error: [too-many-positional-arguments] "Too many positional arguments to `Foo.__init__`: expected 2, got 3"
12271227
reveal_type(Foo(1, 2)) # revealed: Foo
12281228
```
12291229

@@ -1246,7 +1246,7 @@ class Foo:
12461246
__init__: Descriptor = Descriptor()
12471247

12481248
reveal_type(Foo(1)) # revealed: Foo
1249-
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `__call__`"
1249+
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `SomeCallable.__call__`"
12501250
reveal_type(Foo()) # revealed: Foo
12511251
```
12521252

@@ -1263,7 +1263,7 @@ class Foo:
12631263
__init__ = Callable()
12641264

12651265
reveal_type(Foo(1)) # revealed: Foo
1266-
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `__call__`"
1266+
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `Callable.__call__`"
12671267
reveal_type(Foo()) # revealed: Foo
12681268
```
12691269

@@ -1302,11 +1302,11 @@ class Foo:
13021302
def __init__(self, x: int) -> None:
13031303
self.x = x
13041304

1305-
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `__init__`"
1305+
# error: [missing-argument] "No argument provided for required parameter `x` of `Foo.__init__`"
13061306
reveal_type(Foo()) # revealed: Foo
13071307
reveal_type(Foo(1)) # revealed: Foo
13081308

1309-
# error: [too-many-positional-arguments] "Too many positional arguments to bound method `__init__`: expected 2, got 3"
1309+
# error: [too-many-positional-arguments] "Too many positional arguments to `Foo.__init__`: expected 2, got 3"
13101310
reveal_type(Foo(1, 2)) # revealed: Foo
13111311
```
13121312

@@ -1320,10 +1320,10 @@ class Foo:
13201320
def __init__(self, x: str) -> None:
13211321
self.x = x
13221322

1323-
# error: [invalid-argument-type] "Argument to bound method `__init__` is incorrect: Expected `str`, found `Literal[1]`"
1323+
# error: [invalid-argument-type] "Argument to `Foo.__init__` is incorrect: Expected `str`, found `Literal[1]`"
13241324
Foo(1)
13251325

1326-
# error: [invalid-argument-type] "Argument to function `__new__` is incorrect: Expected `int`, found `Literal["x"]`"
1326+
# error: [invalid-argument-type] "Argument to constructor `Foo.__new__` is incorrect: Expected `int`, found `Literal["x"]`"
13271327
Foo("x")
13281328
```
13291329

@@ -1339,10 +1339,10 @@ class Foo:
13391339
def __init__(self, x):
13401340
self.x = 42
13411341

1342-
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `__init__`"
1342+
# error: [missing-argument] "No argument provided for required parameter `x` of `Foo.__init__`"
13431343
reveal_type(Foo()) # revealed: Foo
13441344

1345-
# error: [too-many-positional-arguments] "Too many positional arguments to function `__new__`: expected 1, got 2"
1345+
# error: [too-many-positional-arguments] "Too many positional arguments to constructor `Foo.__new__`: expected 1, got 2"
13461346
reveal_type(Foo(42)) # revealed: Foo
13471347

13481348
class Foo2:
@@ -1352,10 +1352,10 @@ class Foo2:
13521352
def __init__(self):
13531353
pass
13541354

1355-
# error: [missing-argument] "No argument provided for required parameter `x` of function `__new__`"
1355+
# error: [missing-argument] "No argument provided for required parameter `x` of constructor `Foo2.__new__`"
13561356
reveal_type(Foo2()) # revealed: Foo2
13571357

1358-
# error: [too-many-positional-arguments] "Too many positional arguments to bound method `__init__`: expected 1, got 2"
1358+
# error: [too-many-positional-arguments] "Too many positional arguments to `Foo2.__init__`: expected 1, got 2"
13591359
reveal_type(Foo2(42)) # revealed: Foo2
13601360

13611361
class Foo3(metaclass=abc.ABCMeta):
@@ -1365,10 +1365,10 @@ class Foo3(metaclass=abc.ABCMeta):
13651365
def __init__(self, x):
13661366
self.x = 42
13671367

1368-
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `__init__`"
1368+
# error: [missing-argument] "No argument provided for required parameter `x` of `Foo3.__init__`"
13691369
reveal_type(Foo3()) # revealed: Foo3
13701370

1371-
# error: [too-many-positional-arguments] "Too many positional arguments to function `__new__`: expected 1, got 2"
1371+
# error: [too-many-positional-arguments] "Too many positional arguments to constructor `Foo3.__new__`: expected 1, got 2"
13721372
reveal_type(Foo3(42)) # revealed: Foo3
13731373

13741374
class Foo4(metaclass=abc.ABCMeta):
@@ -1378,10 +1378,10 @@ class Foo4(metaclass=abc.ABCMeta):
13781378
def __init__(self):
13791379
pass
13801380

1381-
# error: [missing-argument] "No argument provided for required parameter `x` of function `__new__`"
1381+
# error: [missing-argument] "No argument provided for required parameter `x` of constructor `Foo4.__new__`"
13821382
reveal_type(Foo4()) # revealed: Foo4
13831383

1384-
# error: [too-many-positional-arguments] "Too many positional arguments to bound method `__init__`: expected 1, got 2"
1384+
# error: [too-many-positional-arguments] "Too many positional arguments to `Foo4.__init__`: expected 1, got 2"
13851385
reveal_type(Foo4(42)) # revealed: Foo4
13861386
```
13871387

crates/ty_python_semantic/resources/mdtest/call/methods.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ reveal_type(bound_method(1)) # revealed: str
7070
When we call the function object itself, we need to pass the `instance` explicitly:
7171

7272
```py
73-
# error: [invalid-argument-type] "Argument to function `f` is incorrect: Expected `C`, found `Literal[1]`"
73+
# error: [invalid-argument-type] "Argument to function `C.f` is incorrect: Expected `C`, found `Literal[1]`"
7474
# error: [missing-argument]
7575
C.f(1)
7676

@@ -399,7 +399,7 @@ class D:
399399
# This function is wrongly annotated, it should be `type[D]` instead of `D`
400400
pass
401401

402-
# error: [invalid-argument-type] "Argument to bound method `f` is incorrect: Expected `D`, found `<class 'D'>`"
402+
# error: [invalid-argument-type] "Argument to bound method `D.f` is incorrect: Expected `D`, found `<class 'D'>`"
403403
D.f()
404404
```
405405

crates/ty_python_semantic/resources/mdtest/call/subclass_of.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ class C:
2020
def _(subclass_of_c: type[C]):
2121
reveal_type(subclass_of_c(1)) # revealed: C
2222

23-
# error: [invalid-argument-type] "Argument to bound method `__init__` is incorrect: Expected `int`, found `Literal["a"]`"
23+
# error: [invalid-argument-type] "Argument to `C.__init__` is incorrect: Expected `int`, found `Literal["a"]`"
2424
reveal_type(subclass_of_c("a")) # revealed: C
25-
# error: [missing-argument] "No argument provided for required parameter `x` of bound method `__init__`"
25+
# error: [missing-argument] "No argument provided for required parameter `x` of `C.__init__`"
2626
reveal_type(subclass_of_c()) # revealed: C
27-
# error: [too-many-positional-arguments] "Too many positional arguments to bound method `__init__`: expected 2, got 3"
27+
# error: [too-many-positional-arguments] "Too many positional arguments to `C.__init__`: expected 2, got 3"
2828
reveal_type(subclass_of_c(1, 2)) # revealed: C
2929
```
3030

crates/ty_python_semantic/resources/mdtest/call/union.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class B:
113113

114114
def _(flag: bool):
115115
cls = A if flag else B
116-
# error: [invalid-argument-type] "Argument to bound method `__init__` is incorrect: Expected `str`, found `Literal[1]`"
116+
# error: [invalid-argument-type] "Argument to `B.__init__` is incorrect: Expected `str`, found `Literal[1]`"
117117
reveal_type(cls(1)) # revealed: A | B
118118
```
119119

@@ -129,8 +129,8 @@ class B:
129129
def __init__(self, x: int) -> None: ...
130130

131131
def _(factory: type[A] | type[B]):
132-
# error: [invalid-argument-type] "Argument to bound method `__init__` is incorrect: Expected `int`, found `Literal["hello"]`"
133-
# error: [invalid-argument-type] "Argument to bound method `__init__` is incorrect: Expected `int`, found `Literal["hello"]`"
132+
# error: [invalid-argument-type] "Argument to `A.__init__` is incorrect: Expected `int`, found `Literal["hello"]`"
133+
# error: [invalid-argument-type] "Argument to `B.__init__` is incorrect: Expected `int`, found `Literal["hello"]`"
134134
factory("hello")
135135
```
136136

@@ -155,8 +155,8 @@ class IntDiag(DeferredDiagBase[int]): ...
155155
class StrDiag(DeferredDiagBase[str]): ...
156156

157157
def _(factory: type[IntDiag] | type[StrDiag]):
158-
# error: [invalid-argument-type] "Argument to bound method `__init__` is incorrect: Expected `int`, found `float`"
159-
# error: [invalid-argument-type] "Argument to bound method `__init__` is incorrect: Expected `str`, found `float`"
158+
# error: [invalid-argument-type] "Argument to `DeferredDiagBase.__init__` is incorrect: Expected `int`, found `float`"
159+
# error: [invalid-argument-type] "Argument to `DeferredDiagBase.__init__` is incorrect: Expected `str`, found `float`"
160160
factory(1.2)
161161
```
162162

crates/ty_python_semantic/resources/mdtest/class/super.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,7 @@ class Parent:
783783

784784
class Child(Parent):
785785
def __init__(self, children: Mapping[str, Child] | None = None) -> None:
786-
# error: [invalid-argument-type] "Argument to bound method `__init__` is incorrect: Expected `Mapping[str, Self@__init__] | None`, found `Mapping[str, Child] | None`"
786+
# error: [invalid-argument-type] "Argument to `Parent.__init__` is incorrect: Expected `Mapping[str, Self@__init__] | None`, found `Mapping[str, Child] | None`"
787787
super().__init__(children)
788788

789789
# The fix is to use `Self` consistently in the subclass:

crates/ty_python_semantic/resources/mdtest/decorators.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ emit an error:
273273
```py
274274
class NoInit: ...
275275

276-
# error: [too-many-positional-arguments] "Too many positional arguments to bound method `__init__`: expected 1, got 2"
276+
# error: [too-many-positional-arguments] "Too many positional arguments to `object.__init__`: expected 1, got 2"
277277
@NoInit
278278
def foo(): ...
279279

@@ -342,7 +342,7 @@ Using `type[SomeClass]` as a decorator validates against the class's constructor
342342
class Base: ...
343343

344344
def apply_decorator(cls: type[Base]) -> None:
345-
# error: [too-many-positional-arguments] "Too many positional arguments to bound method `__init__`: expected 1, got 2"
345+
# error: [too-many-positional-arguments] "Too many positional arguments to `object.__init__`: expected 1, got 2"
346346
@cls
347347
def inner() -> None: ...
348348
```

0 commit comments

Comments
 (0)