diff options
author | Aleksey Kladov <[email protected]> | 2020-01-14 13:20:33 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2020-01-14 13:24:03 +0000 |
commit | 21c5fd8b1b8f9536449325738baea1e48efdefe0 (patch) | |
tree | 36fc95b08d825eb55f6621f9ff6bf86164dae157 /crates/ra_hir_ty/src/method_resolution.rs | |
parent | 7ec62ea5e686dcb6de5d3fcc413f32af9d1c9cb5 (diff) |
Push resolver further up
Diffstat (limited to 'crates/ra_hir_ty/src/method_resolution.rs')
-rw-r--r-- | crates/ra_hir_ty/src/method_resolution.rs | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/crates/ra_hir_ty/src/method_resolution.rs b/crates/ra_hir_ty/src/method_resolution.rs index e43fadf20..5bacbbd7c 100644 --- a/crates/ra_hir_ty/src/method_resolution.rs +++ b/crates/ra_hir_ty/src/method_resolution.rs | |||
@@ -6,8 +6,8 @@ use std::sync::Arc; | |||
6 | 6 | ||
7 | use arrayvec::ArrayVec; | 7 | use arrayvec::ArrayVec; |
8 | use hir_def::{ | 8 | use hir_def::{ |
9 | lang_item::LangItemTarget, resolver::Resolver, type_ref::Mutability, AssocContainerId, | 9 | lang_item::LangItemTarget, type_ref::Mutability, AssocContainerId, AssocItemId, FunctionId, |
10 | AssocItemId, FunctionId, HasModule, ImplId, Lookup, TraitId, | 10 | HasModule, ImplId, Lookup, TraitId, |
11 | }; | 11 | }; |
12 | use hir_expand::name::Name; | 12 | use hir_expand::name::Name; |
13 | use ra_db::CrateId; | 13 | use ra_db::CrateId; |
@@ -144,14 +144,24 @@ impl Ty { | |||
144 | pub(crate) fn lookup_method( | 144 | pub(crate) fn lookup_method( |
145 | ty: &Canonical<Ty>, | 145 | ty: &Canonical<Ty>, |
146 | db: &impl HirDatabase, | 146 | db: &impl HirDatabase, |
147 | env: Arc<TraitEnvironment>, | ||
148 | krate: CrateId, | ||
149 | traits_in_scope: &FxHashSet<TraitId>, | ||
147 | name: &Name, | 150 | name: &Name, |
148 | resolver: &Resolver, | ||
149 | ) -> Option<(Ty, FunctionId)> { | 151 | ) -> Option<(Ty, FunctionId)> { |
150 | iterate_method_candidates(ty, db, resolver, Some(name), LookupMode::MethodCall, |ty, f| match f | 152 | iterate_method_candidates( |
151 | { | 153 | ty, |
152 | AssocItemId::FunctionId(f) => Some((ty.clone(), f)), | 154 | db, |
153 | _ => None, | 155 | env, |
154 | }) | 156 | krate, |
157 | &traits_in_scope, | ||
158 | Some(name), | ||
159 | LookupMode::MethodCall, | ||
160 | |ty, f| match f { | ||
161 | AssocItemId::FunctionId(f) => Some((ty.clone(), f)), | ||
162 | _ => None, | ||
163 | }, | ||
164 | ) | ||
155 | } | 165 | } |
156 | 166 | ||
157 | /// Whether we're looking up a dotted method call (like `v.len()`) or a path | 167 | /// Whether we're looking up a dotted method call (like `v.len()`) or a path |
@@ -172,14 +182,13 @@ pub enum LookupMode { | |||
172 | pub fn iterate_method_candidates<T>( | 182 | pub fn iterate_method_candidates<T>( |
173 | ty: &Canonical<Ty>, | 183 | ty: &Canonical<Ty>, |
174 | db: &impl HirDatabase, | 184 | db: &impl HirDatabase, |
175 | resolver: &Resolver, | 185 | env: Arc<TraitEnvironment>, |
186 | krate: CrateId, | ||
187 | traits_in_scope: &FxHashSet<TraitId>, | ||
176 | name: Option<&Name>, | 188 | name: Option<&Name>, |
177 | mode: LookupMode, | 189 | mode: LookupMode, |
178 | mut callback: impl FnMut(&Ty, AssocItemId) -> Option<T>, | 190 | mut callback: impl FnMut(&Ty, AssocItemId) -> Option<T>, |
179 | ) -> Option<T> { | 191 | ) -> Option<T> { |
180 | let traits_in_scope = resolver.traits_in_scope(db); | ||
181 | let krate = resolver.krate()?; | ||
182 | let env = TraitEnvironment::lower(db, resolver); | ||
183 | match mode { | 192 | match mode { |
184 | LookupMode::MethodCall => { | 193 | LookupMode::MethodCall => { |
185 | // For method calls, rust first does any number of autoderef, and then one | 194 | // For method calls, rust first does any number of autoderef, and then one |
@@ -190,9 +199,7 @@ pub fn iterate_method_candidates<T>( | |||
190 | // Also note that when we've got a receiver like &S, even if the method we | 199 | // Also note that when we've got a receiver like &S, even if the method we |
191 | // find in the end takes &self, we still do the autoderef step (just as | 200 | // find in the end takes &self, we still do the autoderef step (just as |
192 | // rustc does an autoderef and then autoref again). | 201 | // rustc does an autoderef and then autoref again). |
193 | let environment = TraitEnvironment::lower(db, resolver); | 202 | let ty = InEnvironment { value: ty.clone(), environment: env.clone() }; |
194 | let ty = InEnvironment { value: ty.clone(), environment }; | ||
195 | let krate = resolver.krate()?; | ||
196 | 203 | ||
197 | // We have to be careful about the order we're looking at candidates | 204 | // We have to be careful about the order we're looking at candidates |
198 | // in here. Consider the case where we're resolving `x.clone()` | 205 | // in here. Consider the case where we're resolving `x.clone()` |
@@ -214,7 +221,7 @@ pub fn iterate_method_candidates<T>( | |||
214 | db, | 221 | db, |
215 | env.clone(), | 222 | env.clone(), |
216 | krate, | 223 | krate, |
217 | &traits_in_scope, | 224 | traits_in_scope, |
218 | name, | 225 | name, |
219 | &mut callback, | 226 | &mut callback, |
220 | ) { | 227 | ) { |
@@ -230,7 +237,7 @@ pub fn iterate_method_candidates<T>( | |||
230 | db, | 237 | db, |
231 | env, | 238 | env, |
232 | krate, | 239 | krate, |
233 | &traits_in_scope, | 240 | traits_in_scope, |
234 | name, | 241 | name, |
235 | &mut callback, | 242 | &mut callback, |
236 | ) | 243 | ) |