aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/method_resolution.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-06-29 16:40:00 +0100
committerFlorian Diebold <[email protected]>2019-07-08 20:20:17 +0100
commit638100dc8bea69cc4093d15f1641ed39a8d27a43 (patch)
treebb7cf46f4095e9e427f7d4277f28693a3bd671a6 /crates/ra_hir/src/ty/method_resolution.rs
parent32100022010ecfefd1ea06caa71d1a508d2eb75d (diff)
Refactor a bit & introduce Environment struct
Diffstat (limited to 'crates/ra_hir/src/ty/method_resolution.rs')
-rw-r--r--crates/ra_hir/src/ty/method_resolution.rs10
1 files changed, 6 insertions, 4 deletions
diff --git a/crates/ra_hir/src/ty/method_resolution.rs b/crates/ra_hir/src/ty/method_resolution.rs
index 76ace66ea..770e1964e 100644
--- a/crates/ra_hir/src/ty/method_resolution.rs
+++ b/crates/ra_hir/src/ty/method_resolution.rs
@@ -7,7 +7,7 @@ use std::sync::Arc;
7use arrayvec::ArrayVec; 7use arrayvec::ArrayVec;
8use rustc_hash::FxHashMap; 8use rustc_hash::FxHashMap;
9 9
10use super::{autoderef, Canonical, TraitRef}; 10use super::{autoderef, Canonical, Environment, InEnvironment, TraitRef};
11use crate::{ 11use crate::{
12 generics::HasGenericParams, 12 generics::HasGenericParams,
13 impl_block::{ImplBlock, ImplId, ImplItem}, 13 impl_block::{ImplBlock, ImplId, ImplItem},
@@ -209,7 +209,8 @@ fn iterate_trait_method_candidates<T>(
209 let data = m.data(db); 209 let data = m.data(db);
210 if name.map_or(true, |name| data.name() == name) && data.has_self_param() { 210 if name.map_or(true, |name| data.name() == name) && data.has_self_param() {
211 if !known_implemented { 211 if !known_implemented {
212 let trait_ref = canonical_trait_ref(db, t, ty.clone()); 212 let env = Arc::new(super::Environment); // FIXME add environment
213 let trait_ref = canonical_trait_ref(db, env, t, ty.clone());
213 if db.implements(krate, trait_ref).is_none() { 214 if db.implements(krate, trait_ref).is_none() {
214 continue 'traits; 215 continue 'traits;
215 } 216 }
@@ -279,9 +280,10 @@ impl Ty {
279/// for all other parameters, to query Chalk with it. 280/// for all other parameters, to query Chalk with it.
280fn canonical_trait_ref( 281fn canonical_trait_ref(
281 db: &impl HirDatabase, 282 db: &impl HirDatabase,
283 env: Arc<Environment>,
282 trait_: Trait, 284 trait_: Trait,
283 self_ty: Canonical<Ty>, 285 self_ty: Canonical<Ty>,
284) -> Canonical<TraitRef> { 286) -> Canonical<InEnvironment<TraitRef>> {
285 let mut substs = Vec::new(); 287 let mut substs = Vec::new();
286 let generics = trait_.generic_params(db); 288 let generics = trait_.generic_params(db);
287 let num_vars = self_ty.num_vars; 289 let num_vars = self_ty.num_vars;
@@ -296,6 +298,6 @@ fn canonical_trait_ref(
296 ); 298 );
297 Canonical { 299 Canonical {
298 num_vars: substs.len() - 1 + self_ty.num_vars, 300 num_vars: substs.len() - 1 + self_ty.num_vars,
299 value: TraitRef { trait_, substs: substs.into() }, 301 value: InEnvironment::new(env, TraitRef { trait_, substs: substs.into() }),
300 } 302 }
301} 303}