diff options
Diffstat (limited to 'crates/ra_hir/src/ty/infer.rs')
-rw-r--r-- | crates/ra_hir/src/ty/infer.rs | 31 |
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 | } |