diff --git a/crates/ty_python_semantic/resources/mdtest/type_properties/is_assignable_to.md b/crates/ty_python_semantic/resources/mdtest/type_properties/is_assignable_to.md index afc28ac58710c5..4f3772c222b610 100644 --- a/crates/ty_python_semantic/resources/mdtest/type_properties/is_assignable_to.md +++ b/crates/ty_python_semantic/resources/mdtest/type_properties/is_assignable_to.md @@ -97,12 +97,19 @@ turn a subtype of `str`: ```py from ty_extensions import static_assert, is_assignable_to from typing_extensions import Literal, LiteralString +from typing import Sequence, Any static_assert(is_assignable_to(Literal["foo"], Literal["foo"])) static_assert(is_assignable_to(Literal["foo"], LiteralString)) static_assert(is_assignable_to(Literal["foo"], str)) +static_assert(is_assignable_to(Literal["foo"], Sequence)) +static_assert(is_assignable_to(Literal["foo"], Sequence[str])) +static_assert(is_assignable_to(Literal["foo"], Sequence[Any])) static_assert(is_assignable_to(LiteralString, str)) +static_assert(is_assignable_to(LiteralString, Sequence)) +static_assert(is_assignable_to(LiteralString, Sequence[str])) +static_assert(is_assignable_to(LiteralString, Sequence[Any])) static_assert(not is_assignable_to(Literal["foo"], Literal["bar"])) static_assert(not is_assignable_to(str, Literal["foo"])) diff --git a/crates/ty_python_semantic/src/types.rs b/crates/ty_python_semantic/src/types.rs index 4176cb02738042..d36841cb226fcf 100644 --- a/crates/ty_python_semantic/src/types.rs +++ b/crates/ty_python_semantic/src/types.rs @@ -1655,6 +1655,13 @@ impl<'db> Type<'db> { } } + _ if self + .literal_fallback_instance(db) + .is_some_and(|instance| instance.is_assignable_to(db, target)) => + { + true + } + (Type::ClassLiteral(class_literal), Type::Callable(_)) => { if let Some(callable) = class_literal.into_callable(db) { return callable.is_assignable_to(db, target);