mirror of https://github.com/astral-sh/ruff
[red-knot] Fix fully static check for callable type (#16803)
## Summary This PR fixes a bug in the check for fully static callable type where we would skip unannotated parameter type. ## Test Plan Add tests using the new `CallableTypeFromFunction` special form.
This commit is contained in:
parent
75a562d313
commit
3ccc8dbbf9
|
|
@ -75,3 +75,27 @@ static_assert(not is_fully_static(Callable))
|
||||||
# error: [invalid-type-form]
|
# error: [invalid-type-form]
|
||||||
static_assert(not is_fully_static(Callable[int, int]))
|
static_assert(not is_fully_static(Callable[int, int]))
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Using function literals, we can check more variations of callable types as it allows us to define
|
||||||
|
parameters without annotations and no return type.
|
||||||
|
|
||||||
|
```py
|
||||||
|
from knot_extensions import CallableTypeFromFunction, is_fully_static, static_assert
|
||||||
|
|
||||||
|
def f00() -> None: ...
|
||||||
|
def f01(a: int, b: str) -> None: ...
|
||||||
|
def f11(): ...
|
||||||
|
def f12(a, b): ...
|
||||||
|
def f13(a, b: int): ...
|
||||||
|
def f14(a, b: int) -> None: ...
|
||||||
|
def f15(a, b) -> None: ...
|
||||||
|
|
||||||
|
static_assert(is_fully_static(CallableTypeFromFunction[f00]))
|
||||||
|
static_assert(is_fully_static(CallableTypeFromFunction[f01]))
|
||||||
|
|
||||||
|
static_assert(not is_fully_static(CallableTypeFromFunction[f11]))
|
||||||
|
static_assert(not is_fully_static(CallableTypeFromFunction[f12]))
|
||||||
|
static_assert(not is_fully_static(CallableTypeFromFunction[f13]))
|
||||||
|
static_assert(not is_fully_static(CallableTypeFromFunction[f14]))
|
||||||
|
static_assert(not is_fully_static(CallableTypeFromFunction[f15]))
|
||||||
|
```
|
||||||
|
|
|
||||||
|
|
@ -4579,7 +4579,7 @@ impl<'db> GeneralCallableType<'db> {
|
||||||
if signature.parameters().iter().any(|parameter| {
|
if signature.parameters().iter().any(|parameter| {
|
||||||
parameter
|
parameter
|
||||||
.annotated_type()
|
.annotated_type()
|
||||||
.is_some_and(|annotated_type| !annotated_type.is_fully_static(db))
|
.is_none_or(|annotated_type| !annotated_type.is_fully_static(db))
|
||||||
}) {
|
}) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue