diff options
author | Florian Diebold <[email protected]> | 2019-06-29 18:14:52 +0100 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-07-08 20:20:17 +0100 |
commit | b1b12072eddaf989fb08ed7a2e39ec2dbbb83dde (patch) | |
tree | 63bb052a39df80dcd0771a18a7a475df3e6a5fe1 /crates/ra_hir/src/ty/infer.rs | |
parent | 638100dc8bea69cc4093d15f1641ed39a8d27a43 (diff) |
Start handling environment in trait resolution
I.e. if we are inside a function with some where clauses, we assume these where
clauses hold.
Diffstat (limited to 'crates/ra_hir/src/ty/infer.rs')
-rw-r--r-- | crates/ra_hir/src/ty/infer.rs | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index 84edd3d46..f8839ebd2 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs | |||
@@ -27,10 +27,10 @@ use ra_prof::profile; | |||
27 | use test_utils::tested_by; | 27 | use test_utils::tested_by; |
28 | 28 | ||
29 | use super::{ | 29 | use super::{ |
30 | autoderef, method_resolution, op, primitive, | 30 | autoderef, lower, method_resolution, op, primitive, |
31 | traits::{Guidance, Obligation, ProjectionPredicate, Solution}, | 31 | traits::{Guidance, Obligation, ProjectionPredicate, Solution}, |
32 | ApplicationTy, CallableDef, InEnvironment, ProjectionTy, Substs, TraitRef, Ty, TypableDef, | 32 | ApplicationTy, CallableDef, Environment, InEnvironment, ProjectionTy, Substs, TraitRef, Ty, |
33 | TypeCtor, | 33 | TypableDef, TypeCtor, |
34 | }; | 34 | }; |
35 | use crate::{ | 35 | use crate::{ |
36 | adt::VariantDef, | 36 | adt::VariantDef, |
@@ -166,6 +166,7 @@ struct InferenceContext<'a, D: HirDatabase> { | |||
166 | body: Arc<Body>, | 166 | body: Arc<Body>, |
167 | resolver: Resolver, | 167 | resolver: Resolver, |
168 | var_unification_table: InPlaceUnificationTable<TypeVarId>, | 168 | var_unification_table: InPlaceUnificationTable<TypeVarId>, |
169 | trait_env: Arc<Environment>, | ||
169 | obligations: Vec<Obligation>, | 170 | obligations: Vec<Obligation>, |
170 | method_resolutions: FxHashMap<ExprId, Function>, | 171 | method_resolutions: FxHashMap<ExprId, Function>, |
171 | field_resolutions: FxHashMap<ExprId, StructField>, | 172 | field_resolutions: FxHashMap<ExprId, StructField>, |
@@ -189,6 +190,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
189 | var_unification_table: InPlaceUnificationTable::new(), | 190 | var_unification_table: InPlaceUnificationTable::new(), |
190 | obligations: Vec::default(), | 191 | obligations: Vec::default(), |
191 | return_ty: Ty::Unknown, // set in collect_fn_signature | 192 | return_ty: Ty::Unknown, // set in collect_fn_signature |
193 | trait_env: lower::trait_env(db, &resolver), | ||
192 | db, | 194 | db, |
193 | body, | 195 | body, |
194 | resolver, | 196 | resolver, |
@@ -331,8 +333,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
331 | for obligation in obligations { | 333 | for obligation in obligations { |
332 | match &obligation { | 334 | match &obligation { |
333 | Obligation::Trait(tr) => { | 335 | Obligation::Trait(tr) => { |
334 | let env = Arc::new(super::Environment); // FIXME add environment | 336 | let in_env = InEnvironment::new(self.trait_env.clone(), tr.clone()); |
335 | let in_env = InEnvironment::new(env, tr.clone()); | ||
336 | let canonicalized = self.canonicalizer().canonicalize_trait_ref(in_env); | 337 | let canonicalized = self.canonicalizer().canonicalize_trait_ref(in_env); |
337 | let solution = self | 338 | let solution = self |
338 | .db | 339 | .db |