aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/infer
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2019-11-27 09:34:54 +0000
committerGitHub <[email protected]>2019-11-27 09:34:54 +0000
commit84bd7916ffa91081e8938d15c673142498442042 (patch)
tree24e9543a78e13477a85c38f98a58f402d7a40ef9 /crates/ra_hir/src/ty/infer
parent57ad4542b6c7fdfeb3b6abc4cd1a4243495694df (diff)
parent825049bc6247f6d596910cd99f76f891d5435a86 (diff)
Merge #2426
2426: Decouple r=matklad a=matklad Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir/src/ty/infer')
-rw-r--r--crates/ra_hir/src/ty/infer/coerce.rs2
-rw-r--r--crates/ra_hir/src/ty/infer/expr.rs5
-rw-r--r--crates/ra_hir/src/ty/infer/pat.rs10
-rw-r--r--crates/ra_hir/src/ty/infer/path.rs89
-rw-r--r--crates/ra_hir/src/ty/infer/unify.rs12
5 files changed, 68 insertions, 50 deletions
diff --git a/crates/ra_hir/src/ty/infer/coerce.rs b/crates/ra_hir/src/ty/infer/coerce.rs
index cf45ede7c..3fb5d8a83 100644
--- a/crates/ra_hir/src/ty/infer/coerce.rs
+++ b/crates/ra_hir/src/ty/infer/coerce.rs
@@ -7,6 +7,7 @@
7use hir_def::{ 7use hir_def::{
8 lang_item::LangItemTarget, 8 lang_item::LangItemTarget,
9 resolver::{HasResolver, Resolver}, 9 resolver::{HasResolver, Resolver},
10 type_ref::Mutability,
10 AdtId, 11 AdtId,
11}; 12};
12use rustc_hash::FxHashMap; 13use rustc_hash::FxHashMap;
@@ -15,7 +16,6 @@ use test_utils::tested_by;
15use crate::{ 16use crate::{
16 db::HirDatabase, 17 db::HirDatabase,
17 ty::{autoderef, Substs, TraitRef, Ty, TypeCtor, TypeWalk}, 18 ty::{autoderef, Substs, TraitRef, Ty, TypeCtor, TypeWalk},
18 Mutability,
19}; 19};
20 20
21use super::{InEnvironment, InferTy, InferenceContext, TypeVarValue}; 21use super::{InEnvironment, InferTy, InferenceContext, TypeVarValue};
diff --git a/crates/ra_hir/src/ty/infer/expr.rs b/crates/ra_hir/src/ty/infer/expr.rs
index eb221d6bc..57f845dfa 100644
--- a/crates/ra_hir/src/ty/infer/expr.rs
+++ b/crates/ra_hir/src/ty/infer/expr.rs
@@ -5,22 +5,21 @@ use std::sync::Arc;
5 5
6use hir_def::{ 6use hir_def::{
7 builtin_type::Signedness, 7 builtin_type::Signedness,
8 expr::{Array, BinaryOp, Expr, ExprId, Literal, Statement, UnaryOp},
8 generics::GenericParams, 9 generics::GenericParams,
9 path::{GenericArg, GenericArgs}, 10 path::{GenericArg, GenericArgs},
10 resolver::resolver_for_expr, 11 resolver::resolver_for_expr,
11 AdtId, ContainerId, Lookup, StructFieldId, 12 AdtId, ContainerId, Lookup, StructFieldId,
12}; 13};
13use hir_expand::name; 14use hir_expand::name::{self, Name};
14 15
15use crate::{ 16use crate::{
16 db::HirDatabase, 17 db::HirDatabase,
17 expr::{Array, BinaryOp, Expr, ExprId, Literal, Statement, UnaryOp},
18 ty::{ 18 ty::{
19 autoderef, method_resolution, op, traits::InEnvironment, CallableDef, InferTy, IntTy, 19 autoderef, method_resolution, op, traits::InEnvironment, CallableDef, InferTy, IntTy,
20 Mutability, Obligation, ProjectionPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor, 20 Mutability, Obligation, ProjectionPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor,
21 TypeWalk, Uncertain, 21 TypeWalk, Uncertain,
22 }, 22 },
23 Name,
24}; 23};
25 24
26use super::{BindingMode, Expectation, InferenceContext, InferenceDiagnostic, TypeMismatch}; 25use super::{BindingMode, Expectation, InferenceContext, InferenceDiagnostic, TypeMismatch};
diff --git a/crates/ra_hir/src/ty/infer/pat.rs b/crates/ra_hir/src/ty/infer/pat.rs
index 641d61e87..6dbf03eb2 100644
--- a/crates/ra_hir/src/ty/infer/pat.rs
+++ b/crates/ra_hir/src/ty/infer/pat.rs
@@ -3,14 +3,18 @@
3use std::iter::repeat; 3use std::iter::repeat;
4use std::sync::Arc; 4use std::sync::Arc;
5 5
6use hir_def::{
7 expr::{BindingAnnotation, Pat, PatId, RecordFieldPat},
8 path::Path,
9 type_ref::Mutability,
10};
11use hir_expand::name::Name;
6use test_utils::tested_by; 12use test_utils::tested_by;
7 13
8use super::{BindingMode, InferenceContext}; 14use super::{BindingMode, InferenceContext};
9use crate::{ 15use crate::{
10 db::HirDatabase, 16 db::HirDatabase,
11 expr::{BindingAnnotation, Pat, PatId, RecordFieldPat}, 17 ty::{Substs, Ty, TypeCtor, TypeWalk},
12 ty::{Mutability, Substs, Ty, TypeCtor, TypeWalk},
13 Name, Path,
14}; 18};
15 19
16impl<'a, D: HirDatabase> InferenceContext<'a, D> { 20impl<'a, D: HirDatabase> InferenceContext<'a, D> {
diff --git a/crates/ra_hir/src/ty/infer/path.rs b/crates/ra_hir/src/ty/infer/path.rs
index be2067dd4..09ff79728 100644
--- a/crates/ra_hir/src/ty/infer/path.rs
+++ b/crates/ra_hir/src/ty/infer/path.rs
@@ -1,14 +1,15 @@
1//! Path expression resolution. 1//! Path expression resolution.
2 2
3use hir_def::{ 3use hir_def::{
4 path::PathSegment, 4 path::{Path, PathSegment},
5 resolver::{ResolveValueResult, Resolver, TypeNs, ValueNs}, 5 resolver::{HasResolver, ResolveValueResult, Resolver, TypeNs, ValueNs},
6 AssocItemId, ContainerId, Lookup,
6}; 7};
8use hir_expand::name::Name;
7 9
8use crate::{ 10use crate::{
9 db::HirDatabase, 11 db::HirDatabase,
10 ty::{method_resolution, Substs, Ty, TypeWalk, ValueTyDefId}, 12 ty::{method_resolution, Substs, Ty, TypeWalk, ValueTyDefId},
11 AssocItem, Container, Function, Name, Path,
12}; 13};
13 14
14use super::{ExprOrPatId, InferenceContext, TraitRef}; 15use super::{ExprOrPatId, InferenceContext, TraitRef};
@@ -142,31 +143,35 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
142 id: ExprOrPatId, 143 id: ExprOrPatId,
143 ) -> Option<(ValueNs, Option<Substs>)> { 144 ) -> Option<(ValueNs, Option<Substs>)> {
144 let trait_ = trait_ref.trait_; 145 let trait_ = trait_ref.trait_;
145 let item = 146 let item = self
146 self.db.trait_data(trait_).items.iter().map(|(_name, id)| (*id).into()).find_map( 147 .db
147 |item| match item { 148 .trait_data(trait_)
148 AssocItem::Function(func) => { 149 .items
149 if segment.name == func.name(self.db) { 150 .iter()
150 Some(AssocItem::Function(func)) 151 .map(|(_name, id)| (*id).into())
151 } else { 152 .find_map(|item| match item {
152 None 153 AssocItemId::FunctionId(func) => {
153 } 154 if segment.name == self.db.function_data(func).name {
155 Some(AssocItemId::FunctionId(func))
156 } else {
157 None
154 } 158 }
159 }
155 160
156 AssocItem::Const(konst) => { 161 AssocItemId::ConstId(konst) => {
157 if konst.name(self.db).map_or(false, |n| n == segment.name) { 162 if self.db.const_data(konst).name.as_ref().map_or(false, |n| n == &segment.name)
158 Some(AssocItem::Const(konst)) 163 {
159 } else { 164 Some(AssocItemId::ConstId(konst))
160 None 165 } else {
161 } 166 None
162 } 167 }
163 AssocItem::TypeAlias(_) => None, 168 }
164 }, 169 AssocItemId::TypeAliasId(_) => None,
165 )?; 170 })?;
166 let def = match item { 171 let def = match item {
167 AssocItem::Function(f) => ValueNs::FunctionId(f.id), 172 AssocItemId::FunctionId(f) => ValueNs::FunctionId(f),
168 AssocItem::Const(c) => ValueNs::ConstId(c.id), 173 AssocItemId::ConstId(c) => ValueNs::ConstId(c),
169 AssocItem::TypeAlias(_) => unreachable!(), 174 AssocItemId::TypeAliasId(_) => unreachable!(),
170 }; 175 };
171 let substs = Substs::build_for_def(self.db, item) 176 let substs = Substs::build_for_def(self.db, item)
172 .use_parent_substs(&trait_ref.substs) 177 .use_parent_substs(&trait_ref.substs)
@@ -196,16 +201,18 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
196 Some(name), 201 Some(name),
197 method_resolution::LookupMode::Path, 202 method_resolution::LookupMode::Path,
198 move |_ty, item| { 203 move |_ty, item| {
199 let def = match item { 204 let (def, container) = match item {
200 AssocItem::Function(f) => ValueNs::FunctionId(f.id), 205 AssocItemId::FunctionId(f) => {
201 AssocItem::Const(c) => ValueNs::ConstId(c.id), 206 (ValueNs::FunctionId(f), f.lookup(self.db).container)
202 AssocItem::TypeAlias(_) => unreachable!(), 207 }
208 AssocItemId::ConstId(c) => (ValueNs::ConstId(c), c.lookup(self.db).container),
209 AssocItemId::TypeAliasId(_) => unreachable!(),
203 }; 210 };
204 let substs = match item.container(self.db) { 211 let substs = match container {
205 Container::ImplBlock(_) => self.find_self_types(&def, ty.clone()), 212 ContainerId::ImplId(_) => self.find_self_types(&def, ty.clone()),
206 Container::Trait(t) => { 213 ContainerId::TraitId(trait_) => {
207 // we're picking this method 214 // we're picking this method
208 let trait_substs = Substs::build_for_def(self.db, t.id) 215 let trait_substs = Substs::build_for_def(self.db, trait_)
209 .push(ty.clone()) 216 .push(ty.clone())
210 .fill(std::iter::repeat_with(|| self.new_type_var())) 217 .fill(std::iter::repeat_with(|| self.new_type_var()))
211 .build(); 218 .build();
@@ -214,29 +221,35 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
214 .fill_with_params() 221 .fill_with_params()
215 .build(); 222 .build();
216 self.obligations.push(super::Obligation::Trait(TraitRef { 223 self.obligations.push(super::Obligation::Trait(TraitRef {
217 trait_: t.id, 224 trait_,
218 substs: trait_substs, 225 substs: trait_substs,
219 })); 226 }));
220 Some(substs) 227 Some(substs)
221 } 228 }
229 ContainerId::ModuleId(_) => None,
222 }; 230 };
223 231
224 self.write_assoc_resolution(id, item); 232 self.write_assoc_resolution(id, item.into());
225 Some((def, substs)) 233 Some((def, substs))
226 }, 234 },
227 ) 235 )
228 } 236 }
229 237
230 fn find_self_types(&self, def: &ValueNs, actual_def_ty: Ty) -> Option<Substs> { 238 fn find_self_types(&self, def: &ValueNs, actual_def_ty: Ty) -> Option<Substs> {
231 if let ValueNs::FunctionId(func) = def { 239 if let ValueNs::FunctionId(func) = *def {
232 let func = Function::from(*func);
233 // We only do the infer if parent has generic params 240 // We only do the infer if parent has generic params
234 let gen = self.db.generic_params(func.id.into()); 241 let gen = self.db.generic_params(func.into());
235 if gen.count_parent_params() == 0 { 242 if gen.count_parent_params() == 0 {
236 return None; 243 return None;
237 } 244 }
238 245
239 let impl_block = func.impl_block(self.db)?.target_ty(self.db); 246 let impl_id = match func.lookup(self.db).container {
247 ContainerId::ImplId(it) => it,
248 _ => return None,
249 };
250 let resolver = impl_id.resolver(self.db);
251 let impl_data = self.db.impl_data(impl_id);
252 let impl_block = Ty::from_hir(self.db, &resolver, &impl_data.target_type);
240 let impl_block_substs = impl_block.substs()?; 253 let impl_block_substs = impl_block.substs()?;
241 let actual_substs = actual_def_ty.substs()?; 254 let actual_substs = actual_def_ty.substs()?;
242 255
diff --git a/crates/ra_hir/src/ty/infer/unify.rs b/crates/ra_hir/src/ty/infer/unify.rs
index 64d9394cf..e27bb2f82 100644
--- a/crates/ra_hir/src/ty/infer/unify.rs
+++ b/crates/ra_hir/src/ty/infer/unify.rs
@@ -1,12 +1,14 @@
1//! Unification and canonicalization logic. 1//! Unification and canonicalization logic.
2 2
3use super::{InferenceContext, Obligation}; 3use super::{InferenceContext, Obligation};
4use crate::db::HirDatabase; 4use crate::{
5use crate::ty::{ 5 db::HirDatabase,
6 Canonical, InEnvironment, InferTy, ProjectionPredicate, ProjectionTy, Substs, TraitRef, Ty, 6 ty::{
7 TypeWalk, 7 Canonical, InEnvironment, InferTy, ProjectionPredicate, ProjectionTy, Substs, TraitRef, Ty,
8 TypeWalk,
9 },
10 util::make_mut_slice,
8}; 11};
9use crate::util::make_mut_slice;
10 12
11impl<'a, D: HirDatabase> InferenceContext<'a, D> { 13impl<'a, D: HirDatabase> InferenceContext<'a, D> {
12 pub(super) fn canonicalizer<'b>(&'b mut self) -> Canonicalizer<'a, 'b, D> 14 pub(super) fn canonicalizer<'b>(&'b mut self) -> Canonicalizer<'a, 'b, D>