diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-03-16 17:24:55 +0000 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-03-16 17:24:55 +0000 |
commit | 9a59272f5f3efd502f666c78ce901fff8db0dfba (patch) | |
tree | dc7298ec39809f520362a5c1fa1dc98ce63900f7 /crates/ra_hir/src/ty/infer.rs | |
parent | 76572e67eabffa959c665f8450dbb12d71848aba (diff) | |
parent | 7faae12311895b20b4dec47825708d15f3aaf034 (diff) |
Merge #981
981: Remove FnSig from FnDef type r=matklad a=flodiebold
It doesn't need to be in there since it's just information from the def. Another
step towards aligning Ty with Chalk's representation.
Co-authored-by: Florian Diebold <[email protected]>
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 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 | } |