diff --git a/crates/ty_python_semantic/resources/mdtest/type_properties/is_disjoint_from.md b/crates/ty_python_semantic/resources/mdtest/type_properties/is_disjoint_from.md index 2671887d954104..bc9d2b9c27d8ad 100644 --- a/crates/ty_python_semantic/resources/mdtest/type_properties/is_disjoint_from.md +++ b/crates/ty_python_semantic/resources/mdtest/type_properties/is_disjoint_from.md @@ -375,6 +375,29 @@ class UsesMeta2(metaclass=Meta2): ... static_assert(is_disjoint_from(type[UsesMeta1], type[UsesMeta2])) ``` +### `property` + +```py +from ty_extensions import is_disjoint_from, static_assert, TypeOf +from typing import final + +class C: + @property + def prop(self) -> int: + return 1 + +reveal_type(C.prop) # revealed: property + +@final +class D: + pass + +static_assert(not is_disjoint_from(int, TypeOf[C.prop])) +static_assert(not is_disjoint_from(TypeOf[C.prop], int)) +static_assert(is_disjoint_from(TypeOf[C.prop], D)) +static_assert(is_disjoint_from(D, TypeOf[C.prop])) +``` + ## Callables No two callable types are disjoint because there exists a non-empty callable type diff --git a/crates/ty_python_semantic/src/types.rs b/crates/ty_python_semantic/src/types.rs index 9dc4b4cc6d3669..fdbd76539d1b5e 100644 --- a/crates/ty_python_semantic/src/types.rs +++ b/crates/ty_python_semantic/src/types.rs @@ -2101,9 +2101,11 @@ impl<'db> Type<'db> { instance.is_disjoint_from(db, KnownClass::Tuple.to_instance(db)) } - (Type::PropertyInstance(_), _) | (_, Type::PropertyInstance(_)) => KnownClass::Property - .to_instance(db) - .is_disjoint_from(db, other), + (Type::PropertyInstance(_), other) | (other, Type::PropertyInstance(_)) => { + KnownClass::Property + .to_instance(db) + .is_disjoint_from(db, other) + } (Type::BoundSuper(_), Type::BoundSuper(_)) => !self.is_equivalent_to(db, other), (Type::BoundSuper(_), other) | (other, Type::BoundSuper(_)) => KnownClass::Super