aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/infer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/ty/infer.rs')
-rw-r--r--crates/ra_hir/src/ty/infer.rs31
1 files changed, 17 insertions, 14 deletions
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs
index 268d2c110..c9a5bc7a1 100644
--- a/crates/ra_hir/src/ty/infer.rs
+++ b/crates/ra_hir/src/ty/infer.rs
@@ -724,11 +724,12 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
724 Expr::Call { callee, args } => { 724 Expr::Call { callee, args } => {
725 let callee_ty = self.infer_expr(*callee, &Expectation::none()); 725 let callee_ty = self.infer_expr(*callee, &Expectation::none());
726 let (param_tys, ret_ty) = match &callee_ty { 726 let (param_tys, ret_ty) = match &callee_ty {
727 Ty::FnPtr(sig) => (sig.input.clone(), sig.output.clone()), 727 Ty::FnPtr(sig) => (sig.params().to_vec(), sig.ret().clone()),
728 Ty::FnDef { substs, sig, .. } => { 728 Ty::FnDef { substs, def, .. } => {
729 let ret_ty = sig.output.clone().subst(&substs); 729 let sig = self.db.callable_item_signature(*def);
730 let ret_ty = sig.ret().clone().subst(&substs);
730 let param_tys = 731 let param_tys =
731 sig.input.iter().map(|ty| ty.clone().subst(&substs)).collect(); 732 sig.params().iter().map(|ty| ty.clone().subst(&substs)).collect();
732 (param_tys, ret_ty) 733 (param_tys, ret_ty)
733 } 734 }
734 _ => { 735 _ => {
@@ -762,19 +763,21 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
762 let method_ty = self.insert_type_vars(method_ty); 763 let method_ty = self.insert_type_vars(method_ty);
763 let (expected_receiver_ty, param_tys, ret_ty) = match &method_ty { 764 let (expected_receiver_ty, param_tys, ret_ty) = match &method_ty {
764 Ty::FnPtr(sig) => { 765 Ty::FnPtr(sig) => {
765 if !sig.input.is_empty() { 766 if !sig.params().is_empty() {
766 (sig.input[0].clone(), sig.input[1..].to_vec(), sig.output.clone()) 767 (sig.params()[0].clone(), sig.params()[1..].to_vec(), sig.ret().clone())
767 } else { 768 } else {
768 (Ty::Unknown, Vec::new(), sig.output.clone()) 769 (Ty::Unknown, Vec::new(), sig.ret().clone())
769 } 770 }
770 } 771 }
771 Ty::FnDef { substs, sig, .. } => { 772 Ty::FnDef { substs, def, .. } => {
772 let ret_ty = sig.output.clone().subst(&substs); 773 let sig = self.db.callable_item_signature(*def);
773 774 let ret_ty = sig.ret().clone().subst(&substs);
774 if !sig.input.is_empty() { 775
775 let mut arg_iter = sig.input.iter().map(|ty| ty.clone().subst(&substs)); 776 if !sig.params().is_empty() {
776 let receiver_ty = arg_iter.next().unwrap(); 777 let mut params_iter =
777 (receiver_ty, arg_iter.collect(), ret_ty) 778 sig.params().iter().map(|ty| ty.clone().subst(&substs));
779 let receiver_ty = params_iter.next().unwrap();
780 (receiver_ty, params_iter.collect(), ret_ty)
778 } else { 781 } else {
779 (Ty::Unknown, Vec::new(), ret_ty) 782 (Ty::Unknown, Vec::new(), ret_ty)
780 } 783 }