diff options
author | Marcus Klaas de Vries <[email protected]> | 2019-01-26 18:25:57 +0000 |
---|---|---|
committer | Marcus Klaas de Vries <[email protected]> | 2019-01-27 16:59:21 +0000 |
commit | f6eb44cd9e2a27d2004386c71fb6c72f79ba83b3 (patch) | |
tree | 7d8b00f84f2ccf53983f7a40f9c93e2a6820fafd /crates/ra_hir/src/ty.rs | |
parent | 0da1e8b2f8709cbdb20912664878121d979a5213 (diff) |
Use type information from the turbofish
Diffstat (limited to 'crates/ra_hir/src/ty.rs')
-rw-r--r-- | crates/ra_hir/src/ty.rs | 34 |
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 { |