aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/ty.rs')
-rw-r--r--crates/ra_hir/src/ty.rs34
1 files changed, 28 insertions, 6 deletions
diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs
index 9332aca9a..00a71a42f 100644
--- a/crates/ra_hir/src/ty.rs
+++ b/crates/ra_hir/src/ty.rs
@@ -1157,6 +1157,32 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
1157 let typable = typable?; 1157 let typable = typable?;
1158 let ty = self.db.type_for_def(typable); 1158 let ty = self.db.type_for_def(typable);
1159 let ty = self.insert_type_vars(ty); 1159 let ty = self.insert_type_vars(ty);
1160
1161 // try to get generic parameters from the path and add them to the
1162 // function type substitutions
1163 if let Ty::FnDef { ref def, .. } = ty {
1164 let last_seg_bindings = path
1165 .segments
1166 .last()
1167 .and_then(|segment| segment.args_and_bindings.as_ref());
1168 if let Some(generic_args) = last_seg_bindings {
1169 let generic_params = def.generic_params(self.db);
1170 if generic_args.args.len() == generic_params.params.len() {
1171 let substs = Ty::substs_from_path(
1172 self.db,
1173 &self.module,
1174 self.impl_block.as_ref(),
1175 &generic_params,
1176 path,
1177 (*def).into(),
1178 );
1179 return Some(ty.apply_substs(substs));
1180 } else {
1181 // ERROR: incorrect number of type params
1182 }
1183 }
1184 }
1185
1160 Some(ty) 1186 Some(ty)
1161 } 1187 }
1162 1188
@@ -1387,9 +1413,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
1387 let callee_ty = self.infer_expr(*callee, &Expectation::none()); 1413 let callee_ty = self.infer_expr(*callee, &Expectation::none());
1388 let (param_tys, ret_ty) = match &callee_ty { 1414 let (param_tys, ret_ty) = match &callee_ty {
1389 Ty::FnPtr(sig) => (sig.input.clone(), sig.output.clone()), 1415 Ty::FnPtr(sig) => (sig.input.clone(), sig.output.clone()),
1390 Ty::FnDef { 1416 Ty::FnDef { substs, sig, .. } => {
1391 def, substs, sig, ..
1392 } => {
1393 let ret_ty = sig.output.clone().subst(&substs); 1417 let ret_ty = sig.output.clone().subst(&substs);
1394 let param_tys = sig 1418 let param_tys = sig
1395 .input 1419 .input
@@ -1437,9 +1461,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
1437 (Ty::Unknown, Vec::new(), sig.output.clone()) 1461 (Ty::Unknown, Vec::new(), sig.output.clone())
1438 } 1462 }
1439 } 1463 }
1440 Ty::FnDef { 1464 Ty::FnDef { substs, sig, .. } => {
1441 def, substs, sig, ..
1442 } => {
1443 let ret_ty = sig.output.clone().subst(&substs); 1465 let ret_ty = sig.output.clone().subst(&substs);
1444 1466
1445 if sig.input.len() > 0 { 1467 if sig.input.len() > 0 {