[ty] Add a Todo-type branch for type[P] where P is a protocol class (#19947)

This commit is contained in:
Alex Waygood 2025-08-18 21:38:19 +01:00 committed by GitHub
parent 24f6d2dc13
commit e6dcdd29f2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 87 additions and 16 deletions

View file

@ -849,6 +849,18 @@ impl<'db> Type<'db> {
}
}
pub(crate) const fn into_dynamic(self) -> Option<DynamicType> {
match self {
Type::Dynamic(dynamic_type) => Some(dynamic_type),
_ => None,
}
}
pub(crate) const fn expect_dynamic(self) -> DynamicType {
self.into_dynamic()
.expect("Expected a Type::Dynamic variant")
}
#[track_caller]
pub(crate) fn expect_class_literal(self) -> ClassLiteral<'db> {
self.into_class_literal()

View file

@ -10198,6 +10198,11 @@ impl<'db> TypeInferenceBuilder<'db, '_> {
Type::ClassLiteral(class_literal) => {
if class_literal.is_known(self.db(), KnownClass::Any) {
SubclassOfType::subclass_of_any()
} else if class_literal.is_protocol(self.db()) {
SubclassOfType::from(
self.db(),
todo_type!("type[T] for protocols").expect_dynamic(),
)
} else {
SubclassOfType::from(
self.db(),

View file

@ -285,6 +285,12 @@ impl<'db> From<ClassType<'db>> for SubclassOfInner<'db> {
}
}
impl From<DynamicType> for SubclassOfInner<'_> {
fn from(value: DynamicType) -> Self {
SubclassOfInner::Dynamic(value)
}
}
impl<'db> From<SubclassOfInner<'db>> for Type<'db> {
fn from(value: SubclassOfInner<'db>) -> Self {
match value {