mirror of https://github.com/astral-sh/ruff
add Self from implicit type[Self] to gc too
This commit is contained in:
parent
826e2f331b
commit
c25fc5923c
|
|
@ -282,8 +282,10 @@ reveal_type(C().method()) # revealed: C
|
||||||
|
|
||||||
## Class Methods
|
## Class Methods
|
||||||
|
|
||||||
|
### Explicit
|
||||||
|
|
||||||
```py
|
```py
|
||||||
from typing import Self, TypeVar
|
from typing import Self
|
||||||
|
|
||||||
class Shape:
|
class Shape:
|
||||||
def foo(self: Self) -> Self:
|
def foo(self: Self) -> Self:
|
||||||
|
|
@ -298,6 +300,64 @@ class Circle(Shape): ...
|
||||||
|
|
||||||
reveal_type(Shape().foo()) # revealed: Shape
|
reveal_type(Shape().foo()) # revealed: Shape
|
||||||
reveal_type(Shape.bar()) # revealed: Shape
|
reveal_type(Shape.bar()) # revealed: Shape
|
||||||
|
|
||||||
|
reveal_type(Circle().foo()) # revealed: Circle
|
||||||
|
reveal_type(Circle.bar()) # revealed: Circle
|
||||||
|
```
|
||||||
|
|
||||||
|
### Implicit
|
||||||
|
|
||||||
|
```py
|
||||||
|
from typing import Self
|
||||||
|
|
||||||
|
class Shape:
|
||||||
|
def foo(self) -> Self:
|
||||||
|
return self
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def bar(cls) -> Self:
|
||||||
|
reveal_type(cls) # revealed: type[Self@bar]
|
||||||
|
return cls()
|
||||||
|
|
||||||
|
class Circle(Shape): ...
|
||||||
|
|
||||||
|
reveal_type(Shape().foo()) # revealed: Shape
|
||||||
|
reveal_type(Shape.bar()) # revealed: Shape
|
||||||
|
|
||||||
|
reveal_type(Circle().foo()) # revealed: Circle
|
||||||
|
reveal_type(Circle.bar()) # revealed: Circle
|
||||||
|
```
|
||||||
|
|
||||||
|
### Implicit in generic class
|
||||||
|
|
||||||
|
```py
|
||||||
|
from typing import Self
|
||||||
|
|
||||||
|
class GenericShape[T]:
|
||||||
|
def foo(self) -> Self:
|
||||||
|
return self
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def bar(cls) -> Self:
|
||||||
|
reveal_type(cls) # revealed: type[Self@bar]
|
||||||
|
return cls()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def baz[U](cls, u: U) -> "GenericShape[U]":
|
||||||
|
reveal_type(cls) # revealed: type[Self@baz]
|
||||||
|
return cls()
|
||||||
|
|
||||||
|
class GenericCircle[T](GenericShape[T]): ...
|
||||||
|
|
||||||
|
reveal_type(GenericShape().foo()) # revealed: GenericShape[Unknown]
|
||||||
|
reveal_type(GenericShape.bar()) # revealed: GenericShape[Unknown]
|
||||||
|
reveal_type(GenericShape[int].bar()) # revealed: GenericShape[int]
|
||||||
|
reveal_type(GenericShape.baz(1)) # revealed: GenericShape[Literal[1]]
|
||||||
|
|
||||||
|
reveal_type(GenericCircle().foo()) # revealed: GenericCircle[Unknown]
|
||||||
|
reveal_type(GenericCircle.bar()) # revealed: GenericCircle[Unknown]
|
||||||
|
reveal_type(GenericCircle[int].bar()) # revealed: GenericCircle[int]
|
||||||
|
reveal_type(GenericCircle.baz(1)) # revealed: GenericShape[Literal[1]]
|
||||||
```
|
```
|
||||||
|
|
||||||
## Attributes
|
## Attributes
|
||||||
|
|
|
||||||
|
|
@ -732,7 +732,13 @@ impl<'db> Signature<'db> {
|
||||||
// signature's generic context, too. (The generic context should include any synthetic
|
// signature's generic context, too. (The generic context should include any synthetic
|
||||||
// typevars created for `typing.Self`, even if the `typing.Self` annotation was added
|
// typevars created for `typing.Self`, even if the `typing.Self` annotation was added
|
||||||
// implicitly.)
|
// implicitly.)
|
||||||
if let Type::TypeVar(self_typevar) = self_type {
|
let self_typevar = match self_type {
|
||||||
|
Type::TypeVar(self_typevar) => Some(self_typevar),
|
||||||
|
Type::SubclassOf(subclass_of) => subclass_of.into_type_var(),
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(self_typevar) = self_typevar {
|
||||||
match self.generic_context.as_mut() {
|
match self.generic_context.as_mut() {
|
||||||
Some(generic_context)
|
Some(generic_context)
|
||||||
if generic_context
|
if generic_context
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue