Skip to content

Commit a15423a

Browse files
committed
[red-knot] Fixup a few edge cases regarding type[Any]
1 parent 6e11086 commit a15423a

File tree

1 file changed

+28
-10
lines changed
  • crates/red_knot_python_semantic/src

1 file changed

+28
-10
lines changed

crates/red_knot_python_semantic/src/types.rs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -654,14 +654,20 @@ impl<'db> Type<'db> {
654654
},
655655
)
656656
}
657-
(Type::ClassLiteral(self_class), Type::SubclassOf(target_class)) => {
658-
self_class.class.is_subclass_of_base(db, target_class.base)
659-
}
657+
(
658+
Type::ClassLiteral(ClassLiteralType { class: self_class }),
659+
Type::SubclassOf(SubclassOfType {
660+
base: ClassBase::Class(target_class),
661+
}),
662+
) => self_class.is_subclass_of(db, target_class),
660663
(
661664
Type::Instance(InstanceType { class: self_class }),
662-
Type::SubclassOf(target_class),
663-
) if self_class.is_known(db, KnownClass::Type) => {
664-
self_class.is_subclass_of_base(db, target_class.base)
665+
Type::SubclassOf(SubclassOfType {
666+
base: ClassBase::Class(target_class),
667+
}),
668+
) => {
669+
self_class.is_known(db, KnownClass::Type)
670+
&& target_class.is_known(db, KnownClass::Type)
665671
}
666672
(
667673
Type::SubclassOf(SubclassOfType {
@@ -928,10 +934,18 @@ impl<'db> Type<'db> {
928934
| Type::ClassLiteral(..)),
929935
) => left != right,
930936

931-
(Type::SubclassOf(type_class), Type::ClassLiteral(class_literal))
932-
| (Type::ClassLiteral(class_literal), Type::SubclassOf(type_class)) => {
933-
!class_literal.class.is_subclass_of_base(db, type_class.base)
934-
}
937+
(
938+
Type::SubclassOf(SubclassOfType {
939+
base: ClassBase::Class(class_a),
940+
}),
941+
Type::ClassLiteral(ClassLiteralType { class: class_b }),
942+
)
943+
| (
944+
Type::ClassLiteral(ClassLiteralType { class: class_b }),
945+
Type::SubclassOf(SubclassOfType {
946+
base: ClassBase::Class(class_a),
947+
}),
948+
) => !class_b.is_subclass_of(db, class_a),
935949
(Type::SubclassOf(_), Type::SubclassOf(_)) => false,
936950
(Type::SubclassOf(_), Type::Instance(_)) | (Type::Instance(_), Type::SubclassOf(_)) => {
937951
false
@@ -3146,6 +3160,7 @@ pub(crate) mod tests {
31463160
#[test_case(Ty::BuiltinInstance("type"), Ty::SubclassOfAny)]
31473161
#[test_case(Ty::BuiltinInstance("type"), Ty::SubclassOfBuiltinClass("object"))]
31483162
#[test_case(Ty::BuiltinInstance("type"), Ty::BuiltinInstance("type"))]
3163+
#[test_case(Ty::BuiltinClassLiteral("str"), Ty::SubclassOfAny)]
31493164
fn is_assignable_to(from: Ty, to: Ty) {
31503165
let db = setup_db();
31513166
assert!(from.into_type(&db).is_assignable_to(&db, to.into_type(&db)));
@@ -3242,6 +3257,8 @@ pub(crate) mod tests {
32423257
#[test_case(Ty::BuiltinClassLiteral("int"), Ty::BuiltinClassLiteral("object"))]
32433258
#[test_case(Ty::BuiltinInstance("int"), Ty::BuiltinClassLiteral("int"))]
32443259
#[test_case(Ty::TypingInstance("_SpecialForm"), Ty::TypingLiteral)]
3260+
#[test_case(Ty::BuiltinInstance("type"), Ty::SubclassOfBuiltinClass("str"))]
3261+
#[test_case(Ty::BuiltinClassLiteral("str"), Ty::SubclassOfAny)]
32453262
fn is_not_subtype_of(from: Ty, to: Ty) {
32463263
let db = setup_db();
32473264
assert!(!from.into_type(&db).is_subtype_of(&db, to.into_type(&db)));
@@ -3401,6 +3418,7 @@ pub(crate) mod tests {
34013418
#[test_case(Ty::Intersection{pos: vec![Ty::BuiltinInstance("int"), Ty::IntLiteral(2)], neg: vec![]}, Ty::IntLiteral(2))]
34023419
#[test_case(Ty::Tuple(vec![Ty::IntLiteral(1), Ty::IntLiteral(2)]), Ty::Tuple(vec![Ty::IntLiteral(1), Ty::BuiltinInstance("int")]))]
34033420
#[test_case(Ty::BuiltinClassLiteral("str"), Ty::BuiltinInstance("type"))]
3421+
#[test_case(Ty::BuiltinClassLiteral("str"), Ty::SubclassOfAny)]
34043422
fn is_not_disjoint_from(a: Ty, b: Ty) {
34053423
let db = setup_db();
34063424
let a = a.into_type(&db);

0 commit comments

Comments
 (0)