diff options
author | Florian Diebold <[email protected]> | 2019-06-29 16:40:00 +0100 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-07-08 20:20:17 +0100 |
commit | 638100dc8bea69cc4093d15f1641ed39a8d27a43 (patch) | |
tree | bb7cf46f4095e9e427f7d4277f28693a3bd671a6 /crates/ra_hir/src/ty/method_resolution.rs | |
parent | 32100022010ecfefd1ea06caa71d1a508d2eb75d (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.rs | 10 |
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; | |||
7 | use arrayvec::ArrayVec; | 7 | use arrayvec::ArrayVec; |
8 | use rustc_hash::FxHashMap; | 8 | use rustc_hash::FxHashMap; |
9 | 9 | ||
10 | use super::{autoderef, Canonical, TraitRef}; | 10 | use super::{autoderef, Canonical, Environment, InEnvironment, TraitRef}; |
11 | use crate::{ | 11 | use 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. |
280 | fn canonical_trait_ref( | 281 | fn 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 | } |