aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/infer
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-12-03 13:59:29 +0000
committerFlorian Diebold <[email protected]>2019-12-03 14:01:23 +0000
commite4add45951511f9afe348bf6066a724deb0d3ccf (patch)
tree0a357e2d3333a06e37f5cb8d6613733c1c0c78ac /crates/ra_hir_ty/src/infer
parentba4f7fa02f746e5bb3efdaa06c2b35beaa4e3440 (diff)
Fix #2467
The stand-alone `unify` requires that the type doesn't contain any type variables. So we can't share the code here for now (without more refactoring)...
Diffstat (limited to 'crates/ra_hir_ty/src/infer')
-rw-r--r--crates/ra_hir_ty/src/infer/path.rs13
-rw-r--r--crates/ra_hir_ty/src/infer/unify.rs4
2 files changed, 14 insertions, 3 deletions
diff --git a/crates/ra_hir_ty/src/infer/path.rs b/crates/ra_hir_ty/src/infer/path.rs
index b0024c6e1..37db005ea 100644
--- a/crates/ra_hir_ty/src/infer/path.rs
+++ b/crates/ra_hir_ty/src/infer/path.rs
@@ -1,5 +1,7 @@
1//! Path expression resolution. 1//! Path expression resolution.
2 2
3use std::iter;
4
3use hir_def::{ 5use hir_def::{
4 path::{Path, PathKind, PathSegment}, 6 path::{Path, PathKind, PathSegment},
5 resolver::{ResolveValueResult, Resolver, TypeNs, ValueNs}, 7 resolver::{ResolveValueResult, Resolver, TypeNs, ValueNs},
@@ -207,7 +209,16 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
207 }; 209 };
208 let substs = match container { 210 let substs = match container {
209 ContainerId::ImplId(impl_id) => { 211 ContainerId::ImplId(impl_id) => {
210 method_resolution::inherent_impl_substs(self.db, impl_id, &ty) 212 let impl_substs = Substs::build_for_def(self.db, impl_id)
213 .fill(iter::repeat_with(|| self.table.new_type_var()))
214 .build();
215 let impl_self_ty = self.db.impl_self_ty(impl_id).subst(&impl_substs);
216 let substs = Substs::build_for_def(self.db, item)
217 .use_parent_substs(&impl_substs)
218 .fill_with_params()
219 .build();
220 self.unify(&impl_self_ty, &ty);
221 Some(substs)
211 } 222 }
212 ContainerId::TraitId(trait_) => { 223 ContainerId::TraitId(trait_) => {
213 // we're picking this method 224 // we're picking this method
diff --git a/crates/ra_hir_ty/src/infer/unify.rs b/crates/ra_hir_ty/src/infer/unify.rs
index 8ed2a6090..fe05642ae 100644
--- a/crates/ra_hir_ty/src/infer/unify.rs
+++ b/crates/ra_hir_ty/src/infer/unify.rs
@@ -167,12 +167,12 @@ impl<T> Canonicalized<T> {
167 } 167 }
168} 168}
169 169
170pub fn unify(ty1: Canonical<&Ty>, ty2: &Ty) -> Option<Substs> { 170pub fn unify(ty1: &Canonical<Ty>, ty2: &Canonical<Ty>) -> Option<Substs> {
171 let mut table = InferenceTable::new(); 171 let mut table = InferenceTable::new();
172 let vars = 172 let vars =
173 Substs::builder(ty1.num_vars).fill(std::iter::repeat_with(|| table.new_type_var())).build(); 173 Substs::builder(ty1.num_vars).fill(std::iter::repeat_with(|| table.new_type_var())).build();
174 let ty_with_vars = ty1.value.clone().subst_bound_vars(&vars); 174 let ty_with_vars = ty1.value.clone().subst_bound_vars(&vars);
175 if !table.unify(&ty_with_vars, ty2) { 175 if !table.unify(&ty_with_vars, &ty2.value) {
176 return None; 176 return None;
177 } 177 }
178 Some( 178 Some(