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.rs43
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
35use crate::{ 35use 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())