[ty] Simplify Any | (Any & T) to Any (#20593)

This commit is contained in:
Alex Waygood 2025-09-26 17:00:10 +01:00 committed by GitHub
parent 57e1ff8294
commit e4de179cdd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 20 additions and 1 deletions

View file

@ -133,6 +133,11 @@ class Single(Enum):
VALUE = 1 VALUE = 1
static_assert(is_equivalent_to(P | Q | Single, Literal[Single.VALUE] | Q | P)) static_assert(is_equivalent_to(P | Q | Single, Literal[Single.VALUE] | Q | P))
static_assert(is_equivalent_to(Any, Any | Intersection[Any, str]))
static_assert(is_equivalent_to(Any, Intersection[str, Any] | Any))
static_assert(is_equivalent_to(Any, Any | Intersection[Any, Not[None]]))
static_assert(is_equivalent_to(Any, Intersection[Not[None], Any] | Any))
``` ```
## Tuples ## Tuples

View file

@ -1050,6 +1050,13 @@ impl<'db> Type<'db> {
} }
} }
pub(crate) const fn into_intersection(self) -> Option<IntersectionType<'db>> {
match self {
Type::Intersection(intersection_type) => Some(intersection_type),
_ => None,
}
}
#[cfg(test)] #[cfg(test)]
#[track_caller] #[track_caller]
pub(crate) fn expect_union(self) -> UnionType<'db> { pub(crate) fn expect_union(self) -> UnionType<'db> {

View file

@ -504,9 +504,16 @@ impl<'db> UnionBuilder<'db> {
if should_simplify_full && !matches!(element_type, Type::TypeAlias(_)) { if should_simplify_full && !matches!(element_type, Type::TypeAlias(_)) {
if ty.is_equivalent_to(self.db, element_type) if ty.is_equivalent_to(self.db, element_type)
|| ty.is_subtype_of(self.db, element_type) || ty.is_subtype_of(self.db, element_type)
|| ty.into_intersection().is_some_and(|intersection| {
intersection.positive(self.db).contains(&element_type)
})
{ {
return; return;
} else if element_type.is_subtype_of(self.db, ty) { } else if element_type.is_subtype_of(self.db, ty)
|| element_type
.into_intersection()
.is_some_and(|intersection| intersection.positive(self.db).contains(&ty))
{
to_remove.push(index); to_remove.push(index);
} else if ty_negated.is_subtype_of(self.db, element_type) { } else if ty_negated.is_subtype_of(self.db, element_type) {
// We add `ty` to the union. We just checked that `~ty` is a subtype of an // We add `ty` to the union. We just checked that `~ty` is a subtype of an