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 0a698988c..735cdecb9 100644
--- a/crates/ra_hir/src/ty/infer.rs
+++ b/crates/ra_hir/src/ty/infer.rs
@@ -789,11 +789,12 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
789 Expr::Call { callee, args } => { 789 Expr::Call { callee, args } => {
790 let callee_ty = self.infer_expr(*callee, &Expectation::none()); 790 let callee_ty = self.infer_expr(*callee, &Expectation::none());
791 let (param_tys, ret_ty) = match &callee_ty { 791 let (param_tys, ret_ty) = match &callee_ty {
792 Ty::FnPtr(sig) => (sig.input.clone(), sig.output.clone()), 792 Ty::FnPtr(sig) => (sig.params().to_vec(), sig.ret().clone()),
793 Ty::FnDef { substs, sig, .. } => { 793 Ty::FnDef { substs, def, .. } => {
794 let ret_ty = sig.output.clone().subst(&substs); 794 let sig = self.db.callable_item_signature(*def);
795 let ret_ty = sig.ret().clone().subst(&substs);
795 let param_tys = 796 let param_tys =
796 sig.input.iter().map(|ty| ty.clone().subst(&substs)).collect(); 797 sig.params().iter().map(|ty| ty.clone().subst(&substs)).collect();
797 (param_tys, ret_ty) 798 (param_tys, ret_ty)
798 } 799 }
799 _ => { 800 _ => {
@@ -827,19 +828,21 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
827 let method_ty = self.insert_type_vars(method_ty); 828 let method_ty = self.insert_type_vars(method_ty);
828 let (expected_receiver_ty, param_tys, ret_ty) = match &method_ty { 829 let (expected_receiver_ty, param_tys, ret_ty) = match &method_ty {
829 Ty::FnPtr(sig) => { 830 Ty::FnPtr(sig) => {
830 if !sig.input.is_empty() { 831 if !sig.params().is_empty() {
831 (sig.input[0].clone(), sig.input[1..].to_vec(), sig.output.clone()) 832 (sig.params()[0].clone(), sig.params()[1..].to_vec(), sig.ret().clone())
832 } else { 833 } else {
833 (Ty::Unknown, Vec::new(), sig.output.clone()) 834 (Ty::Unknown, Vec::new(), sig.ret().clone())
834 } 835 }
835 } 836 }
836 Ty::FnDef { substs, sig, .. } => { 837 Ty::FnDef { substs, def, .. } => {
837 let ret_ty = sig.output.clone().subst(&substs); 838 let sig = self.db.callable_item_signature(*def);
838 839 let ret_ty = sig.ret().clone().subst(&substs);
839 if !sig.input.is_empty() { 840
840 let mut arg_iter = sig.input.iter().map(|ty| ty.clone().subst(&substs)); 841 if !sig.params().is_empty() {
841 let receiver_ty = arg_iter.next().unwrap(); 842 let mut params_iter =
842 (receiver_ty, arg_iter.collect(), ret_ty) 843 sig.params().iter().map(|ty| ty.clone().subst(&substs));
844 let receiver_ty = params_iter.next().unwrap();
845 (receiver_ty, params_iter.collect(), ret_ty)
843 } else { 846 } else {
844 (Ty::Unknown, Vec::new(), ret_ty) 847 (Ty::Unknown, Vec::new(), ret_ty)
845 } 848 }