mirror of https://github.com/astral-sh/ruff
[red-knot] Ensure a gradual type can always be assigned to itself (#15675)
This commit is contained in:
parent
3235cd8019
commit
b4877f1661
|
|
@ -263,15 +263,12 @@ static_assert(not is_assignable_to(int, Not[int]))
|
||||||
static_assert(not is_assignable_to(int, Not[Literal[1]]))
|
static_assert(not is_assignable_to(int, Not[Literal[1]]))
|
||||||
|
|
||||||
static_assert(not is_assignable_to(Intersection[Any, Parent], Unrelated))
|
static_assert(not is_assignable_to(Intersection[Any, Parent], Unrelated))
|
||||||
|
static_assert(is_assignable_to(Intersection[Unrelated, Any], Intersection[Unrelated, Any]))
|
||||||
|
static_assert(is_assignable_to(Intersection[Unrelated, Any], Intersection[Unrelated, Not[Any]]))
|
||||||
|
|
||||||
# TODO: The following assertions should not fail (see https://github.com/astral-sh/ruff/issues/14899)
|
# TODO: The following assertions should not fail (see https://github.com/astral-sh/ruff/issues/14899)
|
||||||
# error: [static-assert-error]
|
# error: [static-assert-error]
|
||||||
static_assert(is_assignable_to(Intersection[Any, int], int))
|
static_assert(is_assignable_to(Intersection[Any, int], int))
|
||||||
|
|
||||||
# error: [static-assert-error]
|
|
||||||
static_assert(is_assignable_to(Intersection[Unrelated, Any], Intersection[Unrelated, Any]))
|
|
||||||
# error: [static-assert-error]
|
|
||||||
static_assert(is_assignable_to(Intersection[Unrelated, Any], Intersection[Unrelated, Not[Any]]))
|
|
||||||
# error: [static-assert-error]
|
# error: [static-assert-error]
|
||||||
static_assert(is_assignable_to(Intersection[Unrelated, Any], Not[tuple[Unrelated, Any]]))
|
static_assert(is_assignable_to(Intersection[Unrelated, Any], Not[tuple[Unrelated, Any]]))
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -1008,7 +1008,7 @@ impl<'db> Type<'db> {
|
||||||
///
|
///
|
||||||
/// [assignable to]: https://typing.readthedocs.io/en/latest/spec/concepts.html#the-assignable-to-or-consistent-subtyping-relation
|
/// [assignable to]: https://typing.readthedocs.io/en/latest/spec/concepts.html#the-assignable-to-or-consistent-subtyping-relation
|
||||||
pub(crate) fn is_assignable_to(self, db: &'db dyn Db, target: Type<'db>) -> bool {
|
pub(crate) fn is_assignable_to(self, db: &'db dyn Db, target: Type<'db>) -> bool {
|
||||||
if self.is_equivalent_to(db, target) {
|
if self.is_gradual_equivalent_to(db, target) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
match (self, target) {
|
match (self, target) {
|
||||||
|
|
|
||||||
|
|
@ -461,6 +461,12 @@ mod stable {
|
||||||
forall types s, t.
|
forall types s, t.
|
||||||
s.is_fully_static(db) && s.is_gradual_equivalent_to(db, t) => s.is_equivalent_to(db, t)
|
s.is_fully_static(db) && s.is_gradual_equivalent_to(db, t) => s.is_equivalent_to(db, t)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// `T` can be assigned to itself.
|
||||||
|
type_property_test!(
|
||||||
|
assignable_to_is_reflexive, db,
|
||||||
|
forall types t. t.is_assignable_to(db, t)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This module contains property tests that currently lead to many false positives.
|
/// This module contains property tests that currently lead to many false positives.
|
||||||
|
|
@ -475,13 +481,6 @@ mod flaky {
|
||||||
|
|
||||||
use super::{intersection, union};
|
use super::{intersection, union};
|
||||||
|
|
||||||
// Currently fails due to https://github.com/astral-sh/ruff/issues/14899
|
|
||||||
// `T` can be assigned to itself.
|
|
||||||
type_property_test!(
|
|
||||||
assignable_to_is_reflexive, db,
|
|
||||||
forall types t. t.is_assignable_to(db, t)
|
|
||||||
);
|
|
||||||
|
|
||||||
// Negating `T` twice is equivalent to `T`.
|
// Negating `T` twice is equivalent to `T`.
|
||||||
type_property_test!(
|
type_property_test!(
|
||||||
double_negation_is_identity, db,
|
double_negation_is_identity, db,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue