aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/method_resolution.rs
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-02-19 19:46:37 +0000
committerGitHub <[email protected]>2020-02-19 19:46:37 +0000
commite00b9ca3c94d8f88cc5aede562365025a59af06b (patch)
treee5c668e033b33a11208bb0e2f3fd8bee51ad0f2b /crates/ra_hir_ty/src/method_resolution.rs
parent889851b52e05f95bf04c6b577a0a63b8e0e523cb (diff)
parent5b05209744ce7dcd15f814482babbfd163553b57 (diff)
Merge #3215
3215: Exclude methods from non-parameter types introduced by generic constraints r=flodiebold a=lnicola Fixes #3184. r? @flodiebold Co-authored-by: LaurenČ›iu Nicola <[email protected]>
Diffstat (limited to 'crates/ra_hir_ty/src/method_resolution.rs')
-rw-r--r--crates/ra_hir_ty/src/method_resolution.rs17
1 files changed, 11 insertions, 6 deletions
diff --git a/crates/ra_hir_ty/src/method_resolution.rs b/crates/ra_hir_ty/src/method_resolution.rs
index 964acdb09..988d83af5 100644
--- a/crates/ra_hir_ty/src/method_resolution.rs
+++ b/crates/ra_hir_ty/src/method_resolution.rs
@@ -377,12 +377,17 @@ fn iterate_trait_method_candidates<T>(
377) -> Option<T> { 377) -> Option<T> {
378 // if ty is `impl Trait` or `dyn Trait`, the trait doesn't need to be in scope 378 // if ty is `impl Trait` or `dyn Trait`, the trait doesn't need to be in scope
379 let inherent_trait = self_ty.value.inherent_trait().into_iter(); 379 let inherent_trait = self_ty.value.inherent_trait().into_iter();
380 // if we have `T: Trait` in the param env, the trait doesn't need to be in scope 380 let env_traits = if let Ty::Placeholder(_) = self_ty.value {
381 let traits_from_env = env 381 // if we have `T: Trait` in the param env, the trait doesn't need to be in scope
382 .trait_predicates_for_self_ty(&self_ty.value) 382 env.trait_predicates_for_self_ty(&self_ty.value)
383 .map(|tr| tr.trait_) 383 .map(|tr| tr.trait_)
384 .flat_map(|t| all_super_traits(db, t)); 384 .flat_map(|t| all_super_traits(db, t))
385 let traits = inherent_trait.chain(traits_from_env).chain(traits_in_scope.iter().copied()); 385 .collect()
386 } else {
387 Vec::new()
388 };
389 let traits =
390 inherent_trait.chain(env_traits.into_iter()).chain(traits_in_scope.iter().copied());
386 'traits: for t in traits { 391 'traits: for t in traits {
387 let data = db.trait_data(t); 392 let data = db.trait_data(t);
388 393