diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-09-07 16:47:56 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2019-09-07 16:47:56 +0100 |
commit | 4a89a7c9026dc3df4466f7b10c666186830d38f6 (patch) | |
tree | fdf832ba772141368f27d733cd718ee9a599a346 /crates/ra_hir/src/ty/method_resolution.rs | |
parent | a73b424e3bcf3e211f87d5a9b175a89231848c6d (diff) | |
parent | 8fb3cab76c60fbff5ae6f5984ac07b09b42b742c (diff) |
Merge #1786
1786: Various minor trait improvements r=matklad a=flodiebold
- lower bounds on trait definition, i.e. super traits
- use super traits for associated types
- use traits from where clauses and their super traits for method resolution
- lower fn-like paths (i.e. `Fn(X, Y) -> Z`)
- pass the environment to Chalk in the correct way to make elaboration work, i.e. inferring things like `T: Clone` from `T: Copy`. The clauses need to be wrapped in `FromEnv` clauses for that to work, which I didn't do before.
- add some tests for closure inference already
Co-authored-by: Florian Diebold <[email protected]>
Diffstat (limited to 'crates/ra_hir/src/ty/method_resolution.rs')
-rw-r--r-- | crates/ra_hir/src/ty/method_resolution.rs | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/crates/ra_hir/src/ty/method_resolution.rs b/crates/ra_hir/src/ty/method_resolution.rs index 9873a0440..cf787bdaa 100644 --- a/crates/ra_hir/src/ty/method_resolution.rs +++ b/crates/ra_hir/src/ty/method_resolution.rs | |||
@@ -212,7 +212,13 @@ fn iterate_trait_method_candidates<T>( | |||
212 | // FIXME: maybe put the trait_env behind a query (need to figure out good input parameters for that) | 212 | // FIXME: maybe put the trait_env behind a query (need to figure out good input parameters for that) |
213 | let env = lower::trait_env(db, resolver); | 213 | let env = lower::trait_env(db, resolver); |
214 | // if ty is `impl Trait` or `dyn Trait`, the trait doesn't need to be in scope | 214 | // if ty is `impl Trait` or `dyn Trait`, the trait doesn't need to be in scope |
215 | let traits = ty.value.inherent_trait().into_iter().chain(resolver.traits_in_scope(db)); | 215 | let inherent_trait = ty.value.inherent_trait().into_iter(); |
216 | // if we have `T: Trait` in the param env, the trait doesn't need to be in scope | ||
217 | let traits_from_env = env | ||
218 | .trait_predicates_for_self_ty(&ty.value) | ||
219 | .map(|tr| tr.trait_) | ||
220 | .flat_map(|t| t.all_super_traits(db)); | ||
221 | let traits = inherent_trait.chain(traits_from_env).chain(resolver.traits_in_scope(db)); | ||
216 | 'traits: for t in traits { | 222 | 'traits: for t in traits { |
217 | let data = t.trait_data(db); | 223 | let data = t.trait_data(db); |
218 | 224 | ||