Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/infer/closure.rs')
-rw-r--r--crates/hir-ty/src/infer/closure.rs64
1 files changed, 10 insertions, 54 deletions
diff --git a/crates/hir-ty/src/infer/closure.rs b/crates/hir-ty/src/infer/closure.rs
index 10d514ee12..2207bc37e8 100644
--- a/crates/hir-ty/src/infer/closure.rs
+++ b/crates/hir-ty/src/infer/closure.rs
@@ -23,14 +23,13 @@ use crate::{
infer::{BreakableKind, Diverges, coerce::CoerceMany},
next_solver::{
AliasTy, Binder, ClauseKind, DbInterner, ErrorGuaranteed, FnSig, GenericArgs, PolyFnSig,
- PolyProjectionPredicate, Predicate, PredicateKind, SolverDefId, Ty, TyKind, Tys,
+ PolyProjectionPredicate, Predicate, PredicateKind, SolverDefId, Ty, TyKind,
abi::Safety,
infer::{
BoundRegionConversionTime, InferOk, InferResult,
traits::{ObligationCause, PredicateObligations},
},
},
- traits::FnTrait,
};
use super::{Expectation, InferenceContext};
@@ -78,40 +77,14 @@ impl<'db> InferenceContext<'_, 'db> {
let parent_args = GenericArgs::identity_for_item(interner, self.generic_def.into());
- // FIXME: Do this when we infer closures correctly:
- // let tupled_upvars_ty = self.table.next_ty_var();
- let tupled_upvars_ty = self.types.types.unit;
+ let tupled_upvars_ty = self.table.next_ty_var();
- let mut current_closure_id = None;
// FIXME: We could probably actually just unify this further --
// instead of having a `FnSig` and a `Option<CoroutineTypes>`,
// we can have a `ClosureSignature { Coroutine { .. }, Closure { .. } }`,
// similar to how `ty::GenSig` is a distinct data structure.
let (closure_ty, resume_yield_tys) = match closure_kind {
ClosureKind::Closure => {
- let closure_id =
- InternedClosureId::new(self.db, InternedClosure(self.owner, closure_expr));
- current_closure_id = Some(closure_id);
- self.deferred_closures.entry(closure_id).or_default();
- self.add_current_closure_dependency(closure_id);
-
- match expected_kind {
- Some(kind) => {
- self.result.closure_info.insert(
- closure_id,
- (
- Vec::new(),
- match kind {
- rustc_type_ir::ClosureKind::Fn => FnTrait::Fn,
- rustc_type_ir::ClosureKind::FnMut => FnTrait::FnMut,
- rustc_type_ir::ClosureKind::FnOnce => FnTrait::FnOnce,
- },
- ),
- );
- }
- None => {}
- };
-
// Tuple up the arguments and insert the resulting function type into
// the `closures` table.
let sig = bound_sig.map_bound(|sig| {
@@ -130,9 +103,7 @@ impl<'db> InferenceContext<'_, 'db> {
Some(kind) => Ty::from_closure_kind(interner, kind),
// Create a type variable (for now) to represent the closure kind.
// It will be unified during the upvar inference phase (`upvar.rs`)
- // FIXME: This too should be the next line:
- // None => self.table.next_ty_var(),
- None => self.types.types.i8,
+ None => self.table.next_ty_var(),
};
let closure_args = ClosureArgs::new(
@@ -145,6 +116,9 @@ impl<'db> InferenceContext<'_, 'db> {
},
);
+ let closure_id =
+ InternedClosureId::new(self.db, InternedClosure(self.owner, closure_expr));
+
(Ty::new_closure(interner, closure_id.into(), closure_args.args), None)
}
ClosureKind::Coroutine(_) | ClosureKind::AsyncBlock { .. } => {
@@ -202,25 +176,11 @@ impl<'db> InferenceContext<'_, 'db> {
// Create a type variable (for now) to represent the closure kind.
// It will be unified during the upvar inference phase (`upvar.rs`)
- // FIXME: Here again the next line should be active.
- // None => self.table.next_ty_var(),
- None => self.types.types.i8,
+ None => self.table.next_ty_var(),
};
- // FIXME: Another line that should be enabled.
- // let coroutine_captures_by_ref_ty = self.table.next_ty_var();
- let coroutine_captures_by_ref_ty = Ty::new_fn_ptr(
- interner,
- Binder::bind_with_vars(
- FnSig {
- inputs_and_output: Tys::new_from_slice(&[self.types.types.unit]),
- c_variadic: false,
- safety: Safety::Safe,
- abi: FnAbi::Rust,
- },
- self.types.coroutine_captures_by_ref_bound_var_kinds,
- ),
- );
+ let coroutine_captures_by_ref_ty = self.table.next_ty_var();
+
let closure_args = CoroutineClosureArgs::new(
interner,
CoroutineClosureArgsParts {
@@ -254,9 +214,7 @@ impl<'db> InferenceContext<'_, 'db> {
// Create a type variable (for now) to represent the closure kind.
// It will be unified during the upvar inference phase (`upvar.rs`)
- // FIXME: And here again.
- // None => self.table.next_ty_var(),
- None => self.types.types.i16,
+ None => self.table.next_ty_var(),
};
let coroutine_upvars_ty = self.table.next_ty_var();
@@ -310,7 +268,6 @@ impl<'db> InferenceContext<'_, 'db> {
// FIXME: lift these out into a struct
let prev_diverges = mem::replace(&mut self.diverges, Diverges::Maybe);
- let prev_closure = mem::replace(&mut self.current_closure, current_closure_id);
let prev_ret_ty = mem::replace(&mut self.return_ty, liberated_sig.output());
let prev_ret_coercion =
self.return_coercion.replace(CoerceMany::new(liberated_sig.output()));
@@ -323,7 +280,6 @@ impl<'db> InferenceContext<'_, 'db> {
self.diverges = prev_diverges;
self.return_ty = prev_ret_ty;
self.return_coercion = prev_ret_coercion;
- self.current_closure = prev_closure;
self.resume_yield_tys = prev_resume_yield_tys;
closure_ty