[ty] Allow classes to inherit from type[Any] or type[Unknown] (#18060)

This commit is contained in:
Alex Waygood 2025-05-12 20:30:21 -04:00 committed by GitHub
parent 41fa082414
commit 7e9b0df18a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 68 additions and 48 deletions

View file

@ -543,13 +543,6 @@ impl<'db> Type<'db> {
Self::Dynamic(DynamicType::Unknown)
}
pub(crate) fn into_dynamic(self) -> Option<DynamicType> {
match self {
Type::Dynamic(dynamic_type) => Some(dynamic_type),
_ => None,
}
}
pub fn object(db: &'db dyn Db) -> Self {
KnownClass::Object.to_instance(db)
}

View file

@ -107,16 +107,20 @@ impl<'db> ClassBase<'db> {
{
Self::try_from_type(db, todo_type!("GenericAlias instance"))
}
Type::SubclassOf(subclass_of) => subclass_of
.subclass_of()
.into_dynamic()
.map(ClassBase::Dynamic),
Type::Intersection(inter) => {
let dynamic_element = inter
let valid_element = inter
.positive(db)
.iter()
.find_map(|elem| elem.into_dynamic())?;
.find_map(|elem| ClassBase::try_from_type(db, *elem))?;
if ty.is_disjoint_from(db, KnownClass::Type.to_instance(db)) {
None
} else {
Some(ClassBase::Dynamic(dynamic_element))
Some(valid_element)
}
}
Type::Union(_) => None, // TODO -- forces consideration of multiple possible MROs?
@ -137,7 +141,6 @@ impl<'db> ClassBase<'db> {
| Type::LiteralString
| Type::Tuple(_)
| Type::ModuleLiteral(_)
| Type::SubclassOf(_)
| Type::TypeVar(_)
| Type::BoundSuper(_)
| Type::ProtocolInstance(_)

View file

@ -138,6 +138,13 @@ impl<'db> SubclassOfInner<'db> {
}
}
pub(crate) const fn into_dynamic(self) -> Option<DynamicType> {
match self {
Self::Class(_) => None,
Self::Dynamic(dynamic) => Some(dynamic),
}
}
pub(crate) fn try_from_type(db: &'db dyn Db, ty: Type<'db>) -> Option<Self> {
match ty {
Type::Dynamic(dynamic) => Some(Self::Dynamic(dynamic)),