[red-knot] Fix a few details around Type::call (#13593)

This commit is contained in:
Alex Waygood 2024-10-01 17:49:09 +01:00 committed by GitHub
parent 20d997784d
commit 043fba7a57
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -624,8 +624,7 @@ impl<'db> Type<'db> {
union union
.elements(db) .elements(db)
.iter() .iter()
.map(|elem| elem.call(db, arg_types)) .map(|elem| elem.call(db, arg_types)),
.collect::<Box<[CallOutcome<'db>]>>(),
), ),
// TODO: intersection types // TODO: intersection types
@ -664,7 +663,7 @@ impl<'db> Type<'db> {
if !dunder_iter_method.is_unbound() { if !dunder_iter_method.is_unbound() {
let CallOutcome::Callable { let CallOutcome::Callable {
return_ty: iterator_ty, return_ty: iterator_ty,
} = dunder_iter_method.call(db, &[]) } = dunder_iter_method.call(db, &[self])
else { else {
return IterationOutcome::NotIterable { return IterationOutcome::NotIterable {
not_iterable_ty: self, not_iterable_ty: self,
@ -673,7 +672,7 @@ impl<'db> Type<'db> {
let dunder_next_method = iterator_ty.to_meta_type(db).member(db, "__next__"); let dunder_next_method = iterator_ty.to_meta_type(db).member(db, "__next__");
return dunder_next_method return dunder_next_method
.call(db, &[]) .call(db, &[self])
.return_ty(db) .return_ty(db)
.map(|element_ty| IterationOutcome::Iterable { element_ty }) .map(|element_ty| IterationOutcome::Iterable { element_ty })
.unwrap_or(IterationOutcome::NotIterable { .unwrap_or(IterationOutcome::NotIterable {
@ -690,7 +689,7 @@ impl<'db> Type<'db> {
let dunder_get_item_method = iterable_meta_type.member(db, "__getitem__"); let dunder_get_item_method = iterable_meta_type.member(db, "__getitem__");
dunder_get_item_method dunder_get_item_method
.call(db, &[]) .call(db, &[self, builtins_symbol_ty(db, "int").to_instance(db)])
.return_ty(db) .return_ty(db)
.map(|element_ty| IterationOutcome::Iterable { element_ty }) .map(|element_ty| IterationOutcome::Iterable { element_ty })
.unwrap_or(IterationOutcome::NotIterable { .unwrap_or(IterationOutcome::NotIterable {
@ -840,11 +839,11 @@ impl<'db> CallOutcome<'db> {
/// Create a new `CallOutcome::Union` with given wrapped outcomes. /// Create a new `CallOutcome::Union` with given wrapped outcomes.
fn union( fn union(
called_ty: Type<'db>, called_ty: Type<'db>,
outcomes: impl Into<Box<[CallOutcome<'db>]>>, outcomes: impl IntoIterator<Item = CallOutcome<'db>>,
) -> CallOutcome<'db> { ) -> CallOutcome<'db> {
CallOutcome::Union { CallOutcome::Union {
called_ty, called_ty,
outcomes: outcomes.into(), outcomes: outcomes.into_iter().collect(),
} }
} }