diff options
Diffstat (limited to 'src/tools/rust-analyzer/crates/hir-ty/src/infer/expr.rs')
| -rw-r--r-- | src/tools/rust-analyzer/crates/hir-ty/src/infer/expr.rs | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/src/tools/rust-analyzer/crates/hir-ty/src/infer/expr.rs b/src/tools/rust-analyzer/crates/hir-ty/src/infer/expr.rs index db631c8517c..842f7bdafe7 100644 --- a/src/tools/rust-analyzer/crates/hir-ty/src/infer/expr.rs +++ b/src/tools/rust-analyzer/crates/hir-ty/src/infer/expr.rs @@ -39,9 +39,9 @@ use crate::{ static_lifetime, to_chalk_trait_id, traits::FnTrait, utils::{generics, Generics}, - Adjust, Adjustment, AdtId, AutoBorrow, Binders, CallableDefId, FnPointer, FnSig, FnSubst, - Interner, Rawness, Scalar, Substitution, TraitEnvironment, TraitRef, Ty, TyBuilder, TyExt, - TyKind, + Adjust, Adjustment, AdtId, AutoBorrow, Binders, CallableDefId, FnAbi, FnPointer, FnSig, + FnSubst, Interner, Rawness, Scalar, Substitution, TraitEnvironment, TraitRef, Ty, TyBuilder, + TyExt, TyKind, }; use super::{ @@ -224,7 +224,11 @@ impl InferenceContext<'_> { let sig_ty = TyKind::Function(FnPointer { num_binders: 0, - sig: FnSig { abi: (), safety: chalk_ir::Safety::Safe, variadic: false }, + sig: FnSig { + abi: FnAbi::RustCall, + safety: chalk_ir::Safety::Safe, + variadic: false, + }, substitution: FnSubst( Substitution::from_iter(Interner, sig_tys.iter().cloned()) .shifted_in(Interner), @@ -233,7 +237,7 @@ impl InferenceContext<'_> { .intern(Interner); let (id, ty, resume_yield_tys) = match closure_kind { - ClosureKind::Generator(_) => { + ClosureKind::Coroutine(_) => { // FIXME: report error when there are more than 1 parameter. let resume_ty = match sig_tys.first() { // When `sig_tys.len() == 1` the first type is the return type, not the @@ -243,16 +247,16 @@ impl InferenceContext<'_> { }; let yield_ty = self.table.new_type_var(); - let subst = TyBuilder::subst_for_generator(self.db, self.owner) + let subst = TyBuilder::subst_for_coroutine(self.db, self.owner) .push(resume_ty.clone()) .push(yield_ty.clone()) .push(ret_ty.clone()) .build(); - let generator_id = self.db.intern_generator((self.owner, tgt_expr)).into(); - let generator_ty = TyKind::Generator(generator_id, subst).intern(Interner); + let coroutine_id = self.db.intern_coroutine((self.owner, tgt_expr)).into(); + let coroutine_ty = TyKind::Coroutine(coroutine_id, subst).intern(Interner); - (None, generator_ty, Some((resume_ty, yield_ty))) + (None, coroutine_ty, Some((resume_ty, yield_ty))) } ClosureKind::Closure | ClosureKind::Async => { let closure_id = self.db.intern_closure((self.owner, tgt_expr)).into(); @@ -276,7 +280,7 @@ impl InferenceContext<'_> { // Now go through the argument patterns for (arg_pat, arg_ty) in args.iter().zip(&sig_tys) { - self.infer_top_pat(*arg_pat, &arg_ty); + self.infer_top_pat(*arg_pat, arg_ty); } // FIXME: lift these out into a struct @@ -435,7 +439,7 @@ impl InferenceContext<'_> { ty } &Expr::Continue { label } => { - if let None = find_continuable(&mut self.breakables, label) { + if find_continuable(&mut self.breakables, label).is_none() { self.push_diagnostic(InferenceDiagnostic::BreakOutsideOfLoop { expr: tgt_expr, is_break: false, @@ -503,7 +507,7 @@ impl InferenceContext<'_> { } resume_ty } else { - // FIXME: report error (yield expr in non-generator) + // FIXME: report error (yield expr in non-coroutine) self.result.standard_types.unknown.clone() } } @@ -942,7 +946,7 @@ impl InferenceContext<'_> { derefed_callee: &Ty, adjustments: &mut Vec<Adjustment>, callee_ty: &Ty, - params: &Vec<Ty>, + params: &[Ty], tgt_expr: ExprId, ) { match fn_x { @@ -1081,8 +1085,7 @@ impl InferenceContext<'_> { let inner_exp = expected .to_option(table) .as_ref() - .map(|e| e.as_adt()) - .flatten() + .and_then(|e| e.as_adt()) .filter(|(e_adt, _)| e_adt == &box_id) .map(|(_, subts)| { let g = subts.at(Interner, 0); @@ -1245,7 +1248,7 @@ impl InferenceContext<'_> { .build(); self.write_method_resolution(tgt_expr, func, subst.clone()); - let method_ty = self.db.value_ty(func.into()).substitute(Interner, &subst); + let method_ty = self.db.value_ty(func.into()).unwrap().substitute(Interner, &subst); self.register_obligations_for_call(&method_ty); self.infer_expr_coerce(rhs, &Expectation::has_type(rhs_ty.clone())); @@ -1320,7 +1323,7 @@ impl InferenceContext<'_> { .unwrap_or_else(|| this.table.new_type_var()); let ty = if let Some(expr) = initializer { - let ty = if contains_explicit_ref_binding(&this.body, *pat) { + let ty = if contains_explicit_ref_binding(this.body, *pat) { this.infer_expr(*expr, &Expectation::has_type(decl_ty.clone())) } else { this.infer_expr_coerce( @@ -1541,7 +1544,7 @@ impl InferenceContext<'_> { self.check_method_call( tgt_expr, &[], - self.db.value_ty(func.into()), + self.db.value_ty(func.into()).unwrap(), substs, ty, expected, @@ -1586,7 +1589,7 @@ impl InferenceContext<'_> { item: func.into(), }) } - (ty, self.db.value_ty(func.into()), substs) + (ty, self.db.value_ty(func.into()).unwrap(), substs) } None => { let field_with_same_name_exists = match self.lookup_field(&receiver_ty, method_name) @@ -1716,7 +1719,7 @@ impl InferenceContext<'_> { // that we have more information about the types of arguments when we // type-check the functions. This isn't really the right way to do this. for check_closures in [false, true] { - let mut skip_indices = skip_indices.into_iter().copied().fuse().peekable(); + let mut skip_indices = skip_indices.iter().copied().fuse().peekable(); let param_iter = param_tys.iter().cloned().chain(repeat(self.err_ty())); let expected_iter = expected_inputs .iter() |
