diff options
author | Marcus Klaas de Vries <[email protected]> | 2019-01-26 11:06:41 +0000 |
---|---|---|
committer | Marcus Klaas de Vries <[email protected]> | 2019-01-27 16:59:21 +0000 |
commit | 089b1c57c1774eb1aacec53828ce2d2648adff2d (patch) | |
tree | ba098a1ef9cfc82271a9abcc0eb022b40739a3d9 /crates/ra_hir/src/ty.rs | |
parent | 04748a0f16624a1893c1da28a35ca3e220c81fce (diff) |
Address some issues flagged in review
Diffstat (limited to 'crates/ra_hir/src/ty.rs')
-rw-r--r-- | crates/ra_hir/src/ty.rs | 43 |
1 files changed, 18 insertions, 25 deletions
diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs index 43181ffc9..3cf3eaded 100644 --- a/crates/ra_hir/src/ty.rs +++ b/crates/ra_hir/src/ty.rs | |||
@@ -34,7 +34,7 @@ use test_utils::tested_by; | |||
34 | 34 | ||
35 | use crate::{ | 35 | use crate::{ |
36 | Module, Function, Struct, StructField, Enum, EnumVariant, Path, Name, ImplBlock, | 36 | Module, Function, Struct, StructField, Enum, EnumVariant, Path, Name, ImplBlock, |
37 | FnSignature, FnScopes, ModuleDef, AdtDef, | 37 | FnScopes, ModuleDef, AdtDef, |
38 | db::HirDatabase, | 38 | db::HirDatabase, |
39 | type_ref::{TypeRef, Mutability}, | 39 | type_ref::{TypeRef, Mutability}, |
40 | name::KnownName, | 40 | name::KnownName, |
@@ -1164,13 +1164,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1164 | let ty = self.insert_type_vars(ty.apply_substs(substs)); | 1164 | let ty = self.insert_type_vars(ty.apply_substs(substs)); |
1165 | (ty, Some(var.into())) | 1165 | (ty, Some(var.into())) |
1166 | } | 1166 | } |
1167 | TypableDef::Function(func) => { | 1167 | TypableDef::Function(_) | TypableDef::Enum(_) => (Ty::Unknown, None), |
1168 | let ty = type_for_fn(self.db, func); | ||
1169 | let ty = self.insert_type_vars(ty.apply_substs(substs)); | ||
1170 | // FIXME: is this right? | ||
1171 | (ty, None) | ||
1172 | } | ||
1173 | TypableDef::Enum(_) => (Ty::Unknown, None), | ||
1174 | } | 1168 | } |
1175 | } | 1169 | } |
1176 | 1170 | ||
@@ -1363,15 +1357,14 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1363 | Ty::FnPtr(sig) => (sig.input.clone(), sig.output.clone()), | 1357 | Ty::FnPtr(sig) => (sig.input.clone(), sig.output.clone()), |
1364 | Ty::FnDef { def, substs, .. } => { | 1358 | Ty::FnDef { def, substs, .. } => { |
1365 | let fn_sig = def.signature(self.db); | 1359 | let fn_sig = def.signature(self.db); |
1360 | let generic_params = def.generic_params(self.db); | ||
1366 | let ret_ty = self | 1361 | let ret_ty = self |
1367 | .make_ty(fn_sig.ret_type(), fn_sig.generics()) | 1362 | .make_ty(fn_sig.ret_type(), &generic_params) |
1368 | .subst(&substs); | 1363 | .subst(&substs); |
1369 | let param_tys = fn_sig | 1364 | let param_tys = fn_sig |
1370 | .args() | 1365 | .params() |
1371 | .iter() | 1366 | .iter() |
1372 | .map(|type_ref| { | 1367 | .map(|type_ref| self.make_ty(type_ref, &generic_params).subst(&substs)) |
1373 | self.make_ty(type_ref, fn_sig.generics()).subst(&substs) | ||
1374 | }) | ||
1375 | .collect(); | 1368 | .collect(); |
1376 | (param_tys, ret_ty) | 1369 | (param_tys, ret_ty) |
1377 | } | 1370 | } |
@@ -1416,13 +1409,14 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1416 | } | 1409 | } |
1417 | Ty::FnDef { def, substs, .. } => { | 1410 | Ty::FnDef { def, substs, .. } => { |
1418 | let fn_sig = def.signature(self.db); | 1411 | let fn_sig = def.signature(self.db); |
1412 | let generic_params = def.generic_params(self.db); | ||
1419 | let ret_ty = self | 1413 | let ret_ty = self |
1420 | .make_ty(fn_sig.ret_type(), fn_sig.generics()) | 1414 | .make_ty(fn_sig.ret_type(), &generic_params) |
1421 | .subst(&substs); | 1415 | .subst(&substs); |
1422 | 1416 | ||
1423 | if fn_sig.args().len() > 0 { | 1417 | if fn_sig.params().len() > 0 { |
1424 | let mut arg_iter = fn_sig.args().iter().map(|type_ref| { | 1418 | let mut arg_iter = fn_sig.params().iter().map(|type_ref| { |
1425 | self.make_ty(type_ref, fn_sig.generics()).subst(&substs) | 1419 | self.make_ty(type_ref, &generic_params).subst(&substs) |
1426 | }); | 1420 | }); |
1427 | let receiver_ty = arg_iter.next().unwrap(); | 1421 | let receiver_ty = arg_iter.next().unwrap(); |
1428 | (receiver_ty, arg_iter.collect(), ret_ty) | 1422 | (receiver_ty, arg_iter.collect(), ret_ty) |
@@ -1660,15 +1654,16 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1660 | ty | 1654 | ty |
1661 | } | 1655 | } |
1662 | 1656 | ||
1663 | fn collect_fn_signature(&mut self, signature: &FnSignature) { | 1657 | fn collect_fn_signature(&mut self, func: Function) { |
1664 | let body = Arc::clone(&self.body); // avoid borrow checker problem | 1658 | let body = Arc::clone(&self.body); // avoid borrow checker problem |
1665 | let generics = signature.generics(); | 1659 | let signature = func.signature(self.db); |
1666 | for (type_ref, pat) in signature.args().iter().zip(body.params()) { | 1660 | let generics = func.generic_params(self.db); |
1667 | let ty = self.make_ty(type_ref, generics); | 1661 | for (type_ref, pat) in signature.params().iter().zip(body.params()) { |
1662 | let ty = self.make_ty(type_ref, &generics); | ||
1668 | 1663 | ||
1669 | self.infer_pat(*pat, &ty); | 1664 | self.infer_pat(*pat, &ty); |
1670 | } | 1665 | } |
1671 | self.return_ty = self.make_ty(signature.ret_type(), generics); | 1666 | self.return_ty = self.make_ty(signature.ret_type(), &generics); |
1672 | } | 1667 | } |
1673 | 1668 | ||
1674 | fn infer_body(&mut self) { | 1669 | fn infer_body(&mut self) { |
@@ -1687,9 +1682,7 @@ pub fn infer(db: &impl HirDatabase, func: Function) -> Arc<InferenceResult> { | |||
1687 | let impl_block = func.impl_block(db); | 1682 | let impl_block = func.impl_block(db); |
1688 | let mut ctx = InferenceContext::new(db, body, scopes, module, impl_block); | 1683 | let mut ctx = InferenceContext::new(db, body, scopes, module, impl_block); |
1689 | 1684 | ||
1690 | let signature = func.signature(db); | 1685 | ctx.collect_fn_signature(func); |
1691 | ctx.collect_fn_signature(&signature); | ||
1692 | |||
1693 | ctx.infer_body(); | 1686 | ctx.infer_body(); |
1694 | 1687 | ||
1695 | Arc::new(ctx.resolve_all()) | 1688 | Arc::new(ctx.resolve_all()) |