aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/method_resolution.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-01-14 13:20:33 +0000
committerAleksey Kladov <[email protected]>2020-01-14 13:24:03 +0000
commit21c5fd8b1b8f9536449325738baea1e48efdefe0 (patch)
tree36fc95b08d825eb55f6621f9ff6bf86164dae157 /crates/ra_hir_ty/src/method_resolution.rs
parent7ec62ea5e686dcb6de5d3fcc413f32af9d1c9cb5 (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.rs41
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
7use arrayvec::ArrayVec; 7use arrayvec::ArrayVec;
8use hir_def::{ 8use 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};
12use hir_expand::name::Name; 12use hir_expand::name::Name;
13use ra_db::CrateId; 13use ra_db::CrateId;
@@ -144,14 +144,24 @@ impl Ty {
144pub(crate) fn lookup_method( 144pub(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 {
172pub fn iterate_method_candidates<T>( 182pub 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 )