diff options
Diffstat (limited to 'crates/ra_hir_ty/src/infer/path.rs')
-rw-r--r-- | crates/ra_hir_ty/src/infer/path.rs | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/crates/ra_hir_ty/src/infer/path.rs b/crates/ra_hir_ty/src/infer/path.rs index 2c1d4831d..132f3d6f2 100644 --- a/crates/ra_hir_ty/src/infer/path.rs +++ b/crates/ra_hir_ty/src/infer/path.rs | |||
@@ -11,7 +11,7 @@ use hir_expand::name::Name; | |||
11 | 11 | ||
12 | use crate::{db::HirDatabase, method_resolution, Substs, Ty, TypeWalk, ValueTyDefId}; | 12 | use crate::{db::HirDatabase, method_resolution, Substs, Ty, TypeWalk, ValueTyDefId}; |
13 | 13 | ||
14 | use super::{ExprOrPatId, InferenceContext, TraitEnvironment, TraitRef}; | 14 | use super::{ExprOrPatId, InferenceContext, TraitRef}; |
15 | 15 | ||
16 | impl<'a, D: HirDatabase> InferenceContext<'a, D> { | 16 | impl<'a, D: HirDatabase> InferenceContext<'a, D> { |
17 | pub(super) fn infer_path( | 17 | pub(super) fn infer_path( |
@@ -39,7 +39,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
39 | } | 39 | } |
40 | let ty = self.make_ty(type_ref); | 40 | let ty = self.make_ty(type_ref); |
41 | let remaining_segments_for_ty = path.segments().take(path.segments().len() - 1); | 41 | let remaining_segments_for_ty = path.segments().take(path.segments().len() - 1); |
42 | let ty = Ty::from_type_relative_path(self.db, resolver, ty, remaining_segments_for_ty); | 42 | let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &resolver }; |
43 | let ty = Ty::from_type_relative_path(&ctx, ty, remaining_segments_for_ty); | ||
43 | self.resolve_ty_assoc_item( | 44 | self.resolve_ty_assoc_item( |
44 | ty, | 45 | ty, |
45 | &path.segments().last().expect("path had at least one segment").name, | 46 | &path.segments().last().expect("path had at least one segment").name, |
@@ -73,7 +74,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
73 | if let Some(self_subst) = self_subst { | 74 | if let Some(self_subst) = self_subst { |
74 | ty = ty.subst(&self_subst); | 75 | ty = ty.subst(&self_subst); |
75 | } | 76 | } |
76 | let substs = Ty::substs_from_path(self.db, &self.resolver, path, typable); | 77 | let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &self.resolver }; |
78 | let substs = Ty::substs_from_path(&ctx, path, typable); | ||
77 | let ty = ty.subst(&substs); | 79 | let ty = ty.subst(&substs); |
78 | Some(ty) | 80 | Some(ty) |
79 | } | 81 | } |
@@ -98,13 +100,9 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
98 | (TypeNs::TraitId(trait_), true) => { | 100 | (TypeNs::TraitId(trait_), true) => { |
99 | let segment = | 101 | let segment = |
100 | remaining_segments.last().expect("there should be at least one segment here"); | 102 | remaining_segments.last().expect("there should be at least one segment here"); |
101 | let trait_ref = TraitRef::from_resolved_path( | 103 | let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &self.resolver }; |
102 | self.db, | 104 | let trait_ref = |
103 | &self.resolver, | 105 | TraitRef::from_resolved_path(&ctx, trait_.into(), resolved_segment, None); |
104 | trait_.into(), | ||
105 | resolved_segment, | ||
106 | None, | ||
107 | ); | ||
108 | self.resolve_trait_assoc_item(trait_ref, segment, id) | 106 | self.resolve_trait_assoc_item(trait_ref, segment, id) |
109 | } | 107 | } |
110 | (def, _) => { | 108 | (def, _) => { |
@@ -114,9 +112,9 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
114 | // as Iterator>::Item::default`) | 112 | // as Iterator>::Item::default`) |
115 | let remaining_segments_for_ty = | 113 | let remaining_segments_for_ty = |
116 | remaining_segments.take(remaining_segments.len() - 1); | 114 | remaining_segments.take(remaining_segments.len() - 1); |
115 | let ctx = crate::lower::TyLoweringContext { db: self.db, resolver: &self.resolver }; | ||
117 | let ty = Ty::from_partly_resolved_hir_path( | 116 | let ty = Ty::from_partly_resolved_hir_path( |
118 | self.db, | 117 | &ctx, |
119 | &self.resolver, | ||
120 | def, | 118 | def, |
121 | resolved_segment, | 119 | resolved_segment, |
122 | remaining_segments_for_ty, | 120 | remaining_segments_for_ty, |
@@ -193,14 +191,13 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
193 | } | 191 | } |
194 | 192 | ||
195 | let canonical_ty = self.canonicalizer().canonicalize_ty(ty.clone()); | 193 | let canonical_ty = self.canonicalizer().canonicalize_ty(ty.clone()); |
196 | let env = TraitEnvironment::lower(self.db, &self.resolver); | ||
197 | let krate = self.resolver.krate()?; | 194 | let krate = self.resolver.krate()?; |
198 | let traits_in_scope = self.resolver.traits_in_scope(self.db); | 195 | let traits_in_scope = self.resolver.traits_in_scope(self.db); |
199 | 196 | ||
200 | method_resolution::iterate_method_candidates( | 197 | method_resolution::iterate_method_candidates( |
201 | &canonical_ty.value, | 198 | &canonical_ty.value, |
202 | self.db, | 199 | self.db, |
203 | env, | 200 | self.trait_env.clone(), |
204 | krate, | 201 | krate, |
205 | &traits_in_scope, | 202 | &traits_in_scope, |
206 | Some(name), | 203 | Some(name), |