Skip to content

Commit 324ac30

Browse files
committed
update snapshots
1 parent 964961e commit 324ac30

25 files changed

+103
-93
lines changed

crates/red_knot_python_semantic/resources/mdtest/annotations/callable.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ def _(c: Callable[[int, Unpack[Ts]], int]):
289289
from typing import Callable
290290

291291
def _(c: Callable[[int], int]):
292-
reveal_type(c.__init__) # revealed: Literal[__init__]
292+
reveal_type(c.__init__) # revealed: def __init__(self) -> None
293293
reveal_type(c.__class__) # revealed: type
294294

295295
# TODO: The member lookup for `Callable` uses `object` which does not have a `__call__`

crates/red_knot_python_semantic/resources/mdtest/attributes.md

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,7 +1285,7 @@ from typing import Any
12851285
class Foo(Any): ...
12861286

12871287
reveal_type(Foo.bar) # revealed: Any
1288-
reveal_type(Foo.__repr__) # revealed: Literal[__repr__] & Any
1288+
reveal_type(Foo.__repr__) # revealed: def __repr__(self) -> str & Any
12891289
```
12901290

12911291
Similar principles apply if `Any` appears in the middle of an inheritance hierarchy:
@@ -1584,7 +1584,7 @@ Some attributes are special-cased, however:
15841584

15851585
```py
15861586
reveal_type(f.__get__) # revealed: <method-wrapper `__get__` of `f`>
1587-
reveal_type(f.__call__) # revealed: <bound method `__call__` of `Literal[f]`>
1587+
reveal_type(f.__call__) # revealed: bound method def f() -> Unknown.__call__(*args: Any, **kwargs: Any) -> Any
15881588
```
15891589

15901590
### Int-literal attributes
@@ -1593,7 +1593,7 @@ Most attribute accesses on int-literal types are delegated to `builtins.int`, si
15931593
integers are instances of that class:
15941594

15951595
```py
1596-
reveal_type((2).bit_length) # revealed: <bound method `bit_length` of `Literal[2]`>
1596+
reveal_type((2).bit_length) # revealed: bound method Literal[2].bit_length() -> int
15971597
reveal_type((2).denominator) # revealed: Literal[1]
15981598
```
15991599

@@ -1610,8 +1610,12 @@ Most attribute accesses on bool-literal types are delegated to `builtins.bool`,
16101610
bools are instances of that class:
16111611

16121612
```py
1613-
reveal_type(True.__and__) # revealed: <bound method `__and__` of `Literal[True]`>
1614-
reveal_type(False.__or__) # revealed: <bound method `__or__` of `Literal[False]`>
1613+
reveal_type(
1614+
True.__and__
1615+
) # revealed: bound method Literal[True].__and__(**kwargs: @Todo(todo signature **kwargs)) -> @Todo(return type of overloaded function)
1616+
reveal_type(
1617+
False.__or__
1618+
) # revealed: bound method Literal[False].__or__(**kwargs: @Todo(todo signature **kwargs)) -> @Todo(return type of overloaded function)
16151619
```
16161620

16171621
Some attributes are special-cased, however:
@@ -1626,8 +1630,10 @@ reveal_type(False.real) # revealed: Literal[0]
16261630
All attribute access on literal `bytes` types is currently delegated to `builtins.bytes`:
16271631

16281632
```py
1629-
reveal_type(b"foo".join) # revealed: <bound method `join` of `Literal[b"foo"]`>
1630-
reveal_type(b"foo".endswith) # revealed: <bound method `endswith` of `Literal[b"foo"]`>
1633+
reveal_type(b"foo".join) # revealed: bound method Literal[b"foo"].join(iterable_of_bytes: @Todo(generics), /) -> bytes
1634+
reveal_type(
1635+
b"foo".endswith
1636+
) # revealed: bound method Literal[b"foo"].endswith(suffix: @Todo(Support for `typing.TypeAlias`), start: SupportsIndex | None = ellipsis, end: SupportsIndex | None = ellipsis, /) -> bool
16311637
```
16321638

16331639
## Instance attribute edge cases

crates/red_knot_python_semantic/resources/mdtest/binary/custom.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -350,30 +350,30 @@ reveal_type(no() + no()) # revealed: Unknown
350350
def f():
351351
pass
352352

353-
# error: [unsupported-operator] "Operator `+` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
353+
# error: [unsupported-operator] "Operator `+` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
354354
reveal_type(f + f) # revealed: Unknown
355-
# error: [unsupported-operator] "Operator `-` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
355+
# error: [unsupported-operator] "Operator `-` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
356356
reveal_type(f - f) # revealed: Unknown
357-
# error: [unsupported-operator] "Operator `*` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
357+
# error: [unsupported-operator] "Operator `*` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
358358
reveal_type(f * f) # revealed: Unknown
359-
# error: [unsupported-operator] "Operator `@` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
359+
# error: [unsupported-operator] "Operator `@` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
360360
reveal_type(f @ f) # revealed: Unknown
361-
# error: [unsupported-operator] "Operator `/` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
361+
# error: [unsupported-operator] "Operator `/` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
362362
reveal_type(f / f) # revealed: Unknown
363-
# error: [unsupported-operator] "Operator `%` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
363+
# error: [unsupported-operator] "Operator `%` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
364364
reveal_type(f % f) # revealed: Unknown
365-
# error: [unsupported-operator] "Operator `**` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
365+
# error: [unsupported-operator] "Operator `**` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
366366
reveal_type(f**f) # revealed: Unknown
367-
# error: [unsupported-operator] "Operator `<<` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
367+
# error: [unsupported-operator] "Operator `<<` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
368368
reveal_type(f << f) # revealed: Unknown
369-
# error: [unsupported-operator] "Operator `>>` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
369+
# error: [unsupported-operator] "Operator `>>` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
370370
reveal_type(f >> f) # revealed: Unknown
371-
# error: [unsupported-operator] "Operator `|` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
371+
# error: [unsupported-operator] "Operator `|` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
372372
reveal_type(f | f) # revealed: Unknown
373-
# error: [unsupported-operator] "Operator `^` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
373+
# error: [unsupported-operator] "Operator `^` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
374374
reveal_type(f ^ f) # revealed: Unknown
375-
# error: [unsupported-operator] "Operator `&` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
375+
# error: [unsupported-operator] "Operator `&` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
376376
reveal_type(f & f) # revealed: Unknown
377-
# error: [unsupported-operator] "Operator `//` is unsupported between objects of type `Literal[f]` and `Literal[f]`"
377+
# error: [unsupported-operator] "Operator `//` is unsupported between objects of type `def f() -> Unknown` and `def f() -> Unknown`"
378378
reveal_type(f // f) # revealed: Unknown
379379
```

crates/red_knot_python_semantic/resources/mdtest/call/getattr_static.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ We can access attributes on objects of all kinds:
5757
import sys
5858

5959
reveal_type(inspect.getattr_static(sys, "dont_write_bytecode")) # revealed: bool
60-
reveal_type(inspect.getattr_static(inspect, "getattr_static")) # revealed: Literal[getattr_static]
60+
reveal_type(
61+
inspect.getattr_static(inspect, "getattr_static")
62+
) # revealed: def getattr_static(obj: object, attr: str, default: Any | None = ellipsis) -> Any
6163

6264
reveal_type(inspect.getattr_static(1, "real")) # revealed: property
6365
```
@@ -144,7 +146,9 @@ def _(a: Any, tuple_of_any: tuple[Any]):
144146
reveal_type(inspect.getattr_static(a, "x", "default")) # revealed: Any | Literal["default"]
145147

146148
# TODO: Ideally, this would just be `Literal[index]`
147-
reveal_type(inspect.getattr_static(tuple_of_any, "index", "default")) # revealed: Literal[index] | Literal["default"]
149+
reveal_type(
150+
inspect.getattr_static(tuple_of_any, "index", "default")
151+
) # revealed: Literal[def index(self, value: Any, start: SupportsIndex = Literal[0], stop: SupportsIndex = int, /) -> int] | Literal["default"]
148152
```
149153

150154
[official documentation]: https://docs.python.org/3/library/inspect.html#inspect.getattr_static

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

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,20 @@ the latter case, it returns a *bound method* object:
3232
```py
3333
from inspect import getattr_static
3434

35-
reveal_type(getattr_static(C, "f")) # revealed: Literal[f]
35+
reveal_type(getattr_static(C, "f")) # revealed: def f(self, x: int) -> str
3636

3737
reveal_type(getattr_static(C, "f").__get__) # revealed: <method-wrapper `__get__` of `f`>
3838

39-
reveal_type(getattr_static(C, "f").__get__(None, C)) # revealed: Literal[f]
40-
reveal_type(getattr_static(C, "f").__get__(C(), C)) # revealed: <bound method `f` of `C`>
39+
reveal_type(getattr_static(C, "f").__get__(None, C)) # revealed: def f(self, x: int) -> str
40+
reveal_type(getattr_static(C, "f").__get__(C(), C)) # revealed: bound method C.f(x: int) -> str
4141
```
4242

4343
In conclusion, this is why we see the following two types when accessing the `f` attribute on the
4444
class object `C` and on an instance `C()`:
4545

4646
```py
47-
reveal_type(C.f) # revealed: Literal[f]
48-
reveal_type(C().f) # revealed: <bound method `f` of `C`>
47+
reveal_type(C.f) # revealed: def f(self, x: int) -> str
48+
reveal_type(C().f) # revealed: bound method C.f(x: int) -> str
4949
```
5050

5151
A bound method is a callable object that contains a reference to the `instance` that it was called
@@ -56,7 +56,7 @@ via `__func__`):
5656
bound_method = C().f
5757

5858
reveal_type(bound_method.__self__) # revealed: C
59-
reveal_type(bound_method.__func__) # revealed: Literal[f]
59+
reveal_type(bound_method.__func__) # revealed: def f(self, x: int) -> str
6060
```
6161

6262
When we call the bound method, the `instance` is implicitly passed as the first argument (`self`):
@@ -80,13 +80,13 @@ When we access methods from derived classes, they will be bound to instances of
8080
class D(C):
8181
pass
8282

83-
reveal_type(D().f) # revealed: <bound method `f` of `D`>
83+
reveal_type(D().f) # revealed: bound method D.f(x: int) -> str
8484
```
8585

8686
If we access an attribute on a bound method object itself, it will defer to `types.MethodType`:
8787

8888
```py
89-
reveal_type(bound_method.__hash__) # revealed: <bound method `__hash__` of `MethodType`>
89+
reveal_type(bound_method.__hash__) # revealed: bound method MethodType.__hash__() -> int
9090
```
9191

9292
If an attribute is not available on the bound method object, it will be looked up on the underlying
@@ -181,10 +181,10 @@ class B:
181181
return "a"
182182

183183
def f(a_or_b: A | B, any_or_a: Any | A):
184-
reveal_type(a_or_b.f) # revealed: <bound method `f` of `A`> | <bound method `f` of `B`>
184+
reveal_type(a_or_b.f) # revealed: bound method A.f() -> int | bound method B.f() -> str
185185
reveal_type(a_or_b.f()) # revealed: int | str
186186

187-
reveal_type(any_or_a.f) # revealed: Any | <bound method `f` of `A`>
187+
reveal_type(any_or_a.f) # revealed: Any | bound method A.f() -> int
188188
reveal_type(any_or_a.f()) # revealed: Any | int
189189
```
190190

@@ -198,7 +198,7 @@ python-version = "3.12"
198198
```py
199199
type IntOrStr = int | str
200200

201-
reveal_type(IntOrStr.__or__) # revealed: <bound method `__or__` of `typing.TypeAliasType`>
201+
reveal_type(IntOrStr.__or__) # revealed: bound method typing.TypeAliasType.__or__(right: Any) -> _SpecialForm
202202
```
203203

204204
## Error cases: Calling `__get__` for methods
@@ -270,7 +270,7 @@ class Meta(type):
270270
class C(metaclass=Meta):
271271
pass
272272

273-
reveal_type(C.f) # revealed: <bound method `f` of `Literal[C]`>
273+
reveal_type(C.f) # revealed: bound method Literal[C].f(arg: int) -> str
274274
reveal_type(C.f(1)) # revealed: str
275275
```
276276

@@ -322,8 +322,8 @@ class C:
322322
def f(cls: type[C], x: int) -> str:
323323
return "a"
324324

325-
reveal_type(C.f) # revealed: <bound method `f` of `Literal[C]`>
326-
reveal_type(C().f) # revealed: <bound method `f` of `type[C]`>
325+
reveal_type(C.f) # revealed: bound method Literal[C].f(x: int) -> str
326+
reveal_type(C().f) # revealed: bound method type[C].f(x: int) -> str
327327
```
328328

329329
The `cls` method argument is then implicitly passed as the first argument when calling the method:
@@ -360,8 +360,8 @@ When a class method is accessed on a derived class, it is bound to that derived
360360
class Derived(C):
361361
pass
362362

363-
reveal_type(Derived.f) # revealed: <bound method `f` of `Literal[Derived]`>
364-
reveal_type(Derived().f) # revealed: <bound method `f` of `type[Derived]`>
363+
reveal_type(Derived.f) # revealed: bound method Literal[Derived].f(x: int) -> str
364+
reveal_type(Derived().f) # revealed: bound method type[Derived].f(x: int) -> str
365365

366366
reveal_type(Derived.f(1)) # revealed: str
367367
reveal_type(Derived().f(1)) # revealed: str
@@ -379,22 +379,22 @@ class C:
379379
@classmethod
380380
def f(cls): ...
381381

382-
reveal_type(getattr_static(C, "f")) # revealed: Literal[f]
382+
reveal_type(getattr_static(C, "f")) # revealed: def f(cls) -> Unknown
383383
reveal_type(getattr_static(C, "f").__get__) # revealed: <method-wrapper `__get__` of `f`>
384384
```
385385

386386
But we correctly model how the `classmethod` descriptor works:
387387

388388
```py
389-
reveal_type(getattr_static(C, "f").__get__(None, C)) # revealed: <bound method `f` of `Literal[C]`>
390-
reveal_type(getattr_static(C, "f").__get__(C(), C)) # revealed: <bound method `f` of `Literal[C]`>
391-
reveal_type(getattr_static(C, "f").__get__(C())) # revealed: <bound method `f` of `type[C]`>
389+
reveal_type(getattr_static(C, "f").__get__(None, C)) # revealed: bound method Literal[C].f() -> Unknown
390+
reveal_type(getattr_static(C, "f").__get__(C(), C)) # revealed: bound method Literal[C].f() -> Unknown
391+
reveal_type(getattr_static(C, "f").__get__(C())) # revealed: bound method type[C].f() -> Unknown
392392
```
393393

394394
The `owner` argument takes precedence over the `instance` argument:
395395

396396
```py
397-
reveal_type(getattr_static(C, "f").__get__("dummy", C)) # revealed: <bound method `f` of `Literal[C]`>
397+
reveal_type(getattr_static(C, "f").__get__("dummy", C)) # revealed: bound method Literal[C].f() -> Unknown
398398
```
399399

400400
### Classmethods mixed with other decorators

crates/red_knot_python_semantic/resources/mdtest/decorators.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ first argument:
207207
def wrong_signature(f: int) -> str:
208208
return "a"
209209

210-
# error: [invalid-argument-type] "Argument to this function is incorrect: Expected `int`, found `Literal[f]`"
210+
# error: [invalid-argument-type] "Argument to this function is incorrect: Expected `int`, found `def f(x) -> Unknown`"
211211
@wrong_signature
212212
def f(x): ...
213213

crates/red_knot_python_semantic/resources/mdtest/descriptor_protocol.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -563,18 +563,18 @@ from inspect import getattr_static
563563
def f(x: object) -> str:
564564
return "a"
565565

566-
reveal_type(f) # revealed: Literal[f]
566+
reveal_type(f) # revealed: def f(x: object) -> str
567567
reveal_type(f.__get__) # revealed: <method-wrapper `__get__` of `f`>
568-
reveal_type(f.__get__(None, type(f))) # revealed: Literal[f]
568+
reveal_type(f.__get__(None, type(f))) # revealed: def f(x: object) -> str
569569
reveal_type(f.__get__(None, type(f))(1)) # revealed: str
570570

571571
wrapper_descriptor = getattr_static(f, "__get__")
572572

573573
reveal_type(wrapper_descriptor) # revealed: <wrapper-descriptor `__get__` of `function` objects>
574-
reveal_type(wrapper_descriptor(f, None, type(f))) # revealed: Literal[f]
574+
reveal_type(wrapper_descriptor(f, None, type(f))) # revealed: def f(x: object) -> str
575575

576576
# Attribute access on the method-wrapper `f.__get__` falls back to `MethodWrapperType`:
577-
reveal_type(f.__get__.__hash__) # revealed: <bound method `__hash__` of `MethodWrapperType`>
577+
reveal_type(f.__get__.__hash__) # revealed: bound method MethodWrapperType.__hash__() -> int
578578

579579
# Attribute access on the wrapper-descriptor falls back to `WrapperDescriptorType`:
580580
reveal_type(wrapper_descriptor.__qualname__) # revealed: str
@@ -587,7 +587,7 @@ class C: ...
587587

588588
bound_method = wrapper_descriptor(f, C(), C)
589589

590-
reveal_type(bound_method) # revealed: <bound method `f` of `C`>
590+
reveal_type(bound_method) # revealed: bound method C.f() -> str
591591
```
592592

593593
We can then call it, and the instance of `C` is implicitly passed to the first parameter of `f`

crates/red_knot_python_semantic/resources/mdtest/exception/control_flow.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -591,9 +591,9 @@ try:
591591
reveal_type(x) # revealed: B | D
592592
reveal_type(x) # revealed: B | D
593593
x = foo
594-
reveal_type(x) # revealed: Literal[foo]
594+
reveal_type(x) # revealed: def foo(param=A) -> Unknown
595595
except:
596-
reveal_type(x) # revealed: Literal[1] | Literal[foo]
596+
reveal_type(x) # revealed: Literal[1] | Literal[def foo(param=A) -> Unknown]
597597

598598
class Bar:
599599
x = could_raise_returns_E()
@@ -603,9 +603,9 @@ except:
603603
reveal_type(x) # revealed: Literal[Bar]
604604
finally:
605605
# TODO: should be `Literal[1] | Literal[foo] | Literal[Bar]`
606-
reveal_type(x) # revealed: Literal[foo] | Literal[Bar]
606+
reveal_type(x) # revealed: Literal[def foo(param=A) -> Unknown] | Literal[Bar]
607607

608-
reveal_type(x) # revealed: Literal[foo] | Literal[Bar]
608+
reveal_type(x) # revealed: Literal[def foo(param=A) -> Unknown] | Literal[Bar]
609609
```
610610

611611
[1]: https://astral-sh.notion.site/Exception-handler-control-flow-11348797e1ca80bb8ce1e9aedbbe439d

crates/red_knot_python_semantic/resources/mdtest/generics/scoping.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,18 +102,18 @@ class C[T]:
102102
def f(self, x: T) -> str:
103103
return "a"
104104

105-
reveal_type(getattr_static(C[int], "f")) # revealed: Literal[f[int]]
105+
reveal_type(getattr_static(C[int], "f")) # revealed: def f(self, x: int) -> str
106106
reveal_type(getattr_static(C[int], "f").__get__) # revealed: <method-wrapper `__get__` of `f[int]`>
107-
reveal_type(getattr_static(C[int], "f").__get__(None, C[int])) # revealed: Literal[f[int]]
108-
# revealed: <bound method `f` of `C[int]`>
107+
reveal_type(getattr_static(C[int], "f").__get__(None, C[int])) # revealed: def f(self, x: int) -> str
108+
# revealed: bound method C[int].f(x: int) -> str
109109
reveal_type(getattr_static(C[int], "f").__get__(C[int](), C[int]))
110110

111-
reveal_type(C[int].f) # revealed: Literal[f[int]]
112-
reveal_type(C[int]().f) # revealed: <bound method `f` of `C[int]`>
111+
reveal_type(C[int].f) # revealed: def f(self, x: int) -> str
112+
reveal_type(C[int]().f) # revealed: bound method C[int].f(x: int) -> str
113113

114114
bound_method = C[int]().f
115115
reveal_type(bound_method.__self__) # revealed: C[int]
116-
reveal_type(bound_method.__func__) # revealed: Literal[f[int]]
116+
reveal_type(bound_method.__func__) # revealed: def f(self, x: int) -> str
117117

118118
reveal_type(C[int]().f(1)) # revealed: str
119119
reveal_type(bound_method(1)) # revealed: str
@@ -124,7 +124,7 @@ reveal_type(C[int].f(C[int](), 1)) # revealed: str
124124
class D[U](C[U]):
125125
pass
126126

127-
reveal_type(D[int]().f) # revealed: <bound method `f` of `D[int]`>
127+
reveal_type(D[int]().f) # revealed: bound method D[int].f(x: int) -> str
128128
```
129129

130130
## Methods can mention other typevars

crates/red_knot_python_semantic/resources/mdtest/import/builtins.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ Builtin symbols can be explicitly imported:
77
```py
88
import builtins
99

10-
reveal_type(builtins.chr) # revealed: Literal[chr]
10+
reveal_type(builtins.chr) # revealed: def chr(i: int | SupportsIndex, /) -> str
1111
```
1212

1313
## Implicit use of builtin
1414

1515
Or used implicitly:
1616

1717
```py
18-
reveal_type(chr) # revealed: Literal[chr]
18+
reveal_type(chr) # revealed: def chr(i: int | SupportsIndex, /) -> str
1919
reveal_type(str) # revealed: Literal[str]
2020
```
2121

crates/red_knot_python_semantic/resources/mdtest/import/conditional.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ else:
104104
from b import f
105105

106106
# TODO: We should disambiguate in such cases, showing `Literal[b.f, c.f]`.
107-
reveal_type(f) # revealed: Literal[f, f]
107+
reveal_type(f) # revealed: Literal[def f() -> Unknown, def f() -> Unknown]
108108
```
109109

110110
## Reimport with stub declaration

0 commit comments

Comments
 (0)