Incorrect inferred variance of type variable in decorated method for Protocol
- Dominant language
- Rust
- Stars
- 7k
- Forks
- 516
- PR merge metrics
- No merged PRs in 30d
Description
### Describe the Bug
Given the following MWE of a custom static method descriptor:
```
from typing import Any, Callable, Generic, Protocol, ParamSpec, TypeVar
P = ParamSpec("P")
T = TypeVar("T")
T_co = TypeVar("T_co", covariant=True)
class StaticMethodDescriptor(Protocol[P, T_co]):
def __get__(self, instance: Any, owner: type[Any] | None = None) -> Callable[P, T_co]: ...
def static_method(_: Callable[P, T]) -> StaticMethodDescriptor[P, T]: ...
class Foo(Generic[T]):
@static_method
def foo(x: T) -> T: ...
class Bar(Protocol[T]):
@static_method
def foo(x: T) -> T: ...
```
Pyrefly correctly infers type variable `T` to be invariant in `Foo(Generic[T])`, but surprisingly determines `T` to be covariant in `Bar(Protocol[T])`.
### Sandbox Link
https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEALqcROgOZ0Q3G6UN0BBdKQA0dAMKooUVNlhiA4jHQxKEAMZiACtQa51uKNtSVUNAMrEYmugBVmMAGomAOujda6AXjpaTZy2sAChcQLVCASjdbbzsHZ0oQkFtI6IB9A1j7KwSk2wzcULEDADcTCAwGL1tKAFcYKPcm9Rk4ODpzBlQGDQBZGAYAC1xMABF4dTViPUSdXD0DKABtLTF8gwBdCMQ3Nzp9ukwYMDo0tLYBs6C4GCgwMVY4LvR1GERBYTFcAHcVSnemFYlkJSBs6AAfOgAOVwKliMJUEToAFoAHwSKQyOQwFZrAobd6EIm7JpHE5PboaNI0AbDTBBNLvSTSWSwXF2LYo9GdSnqfpDEbjOCTCDTXjs2wEuhEwgktwtVBtOgAMVwuCCSj%2BGiWku2JIOdAAAhSeupqbSRnsDmS6GA1UF8O9bEi0XZCcSmvLWu0AEImIJzBaGHVbHZNA3Grqm80CzBW-Y2u3qx12F3o2zu2XoEAiEC1HpQOAkciIEAAYjoAFUCxAmLbai8erC4CTE7waN00uhajRsKoHe9WAw03Qnv943RKANapR0LbQlCe33-nRgPgAL6hNw5kBkKdgKCkQh6GhQCgVrSkfeH0cYHAEOgGdCQNgzymwrMV8wwGB0QYMBhiDgRAAHoQL3Y5D0IXg2BA5QQMwfQ4BAp8XzfJt0BA21eDoVAymgVlf1QiBX1MDC6FwaYIGbLMyAFdBkRKVQ4GoucfFCABmQgAEZuK3bN11zVB1B6JjlWgGAKDQLA8CIMgQHXIA
### (Only applicable for extension issues) IDE Information
_No response_
Contributor guide
Assessment
This issue has not been assessed yet.