diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-12-03 14:02:23 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2019-12-03 14:02:23 +0000 |
commit | 15f143f0c33cbd382a2ad7a407d9601cb843d164 (patch) | |
tree | 0a357e2d3333a06e37f5cb8d6613733c1c0c78ac /crates/ra_hir_ty/src/infer | |
parent | ba4f7fa02f746e5bb3efdaa06c2b35beaa4e3440 (diff) | |
parent | e4add45951511f9afe348bf6066a724deb0d3ccf (diff) |
Merge #2468
2468: Fix #2467 r=flodiebold a=flodiebold
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)...
Co-authored-by: Florian Diebold <[email protected]>
Diffstat (limited to 'crates/ra_hir_ty/src/infer')
-rw-r--r-- | crates/ra_hir_ty/src/infer/path.rs | 13 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/infer/unify.rs | 4 |
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 | ||
3 | use std::iter; | ||
4 | |||
3 | use hir_def::{ | 5 | use 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 | ||
170 | pub fn unify(ty1: Canonical<&Ty>, ty2: &Ty) -> Option<Substs> { | 170 | pub 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( |