[ty] Filter `TypeVar`/`ParamSpec`/`TypeVarTuple` definitions out of the builtins fallback

This commit is contained in:
Alex Waygood 2025-11-05 15:15:52 -05:00
parent cddc0fedc2
commit 476ecbfc6d
1 changed files with 27 additions and 1 deletions

View File

@ -7421,7 +7421,33 @@ impl<'db, 'ast> TypeInferenceBuilder<'db, 'ast> {
if Some(self.scope()) == builtins_module_scope(db) {
Place::Undefined.into()
} else {
builtins_symbol(db, symbol_name)
let possible_fallback = builtins_symbol(db, symbol_name);
let Some(fallback_type) = possible_fallback.ignore_possibly_undefined() else {
return possible_fallback;
};
// Exclude `TypeVar`/`ParamSpec`/`TypeVarTuple` definitions from the
// builtin-scope fallback. These don't exist at runtime. And pragmatically,
// unlike e.g. typeshed's protocols/typeddicts/type aliases, it's never
// actually useful to reuse one of typeshed's typevarlike definitions from
// `builtins.pyi`, even in an `if TYPE_CHECKING` block.
match fallback_type {
Type::NominalInstance(instance)
if matches!(
instance.known_class(db),
Some(
KnownClass::TypeVar
| KnownClass::ParamSpec
| KnownClass::TypeVarTuple
)
) =>
{
Place::Undefined.into()
}
Type::KnownInstance(KnownInstanceType::TypeVar(_)) => {
Place::Undefined.into()
}
_ => possible_fallback,
}
}
})
// Still not found? It might be `reveal_type`...