diff options
Diffstat (limited to 'crates/ra_hir_ty/src/lower.rs')
-rw-r--r-- | crates/ra_hir_ty/src/lower.rs | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/crates/ra_hir_ty/src/lower.rs b/crates/ra_hir_ty/src/lower.rs index 21e7baf8b..cc1ac8e3e 100644 --- a/crates/ra_hir_ty/src/lower.rs +++ b/crates/ra_hir_ty/src/lower.rs | |||
@@ -362,13 +362,23 @@ impl Ty { | |||
362 | }, | 362 | }, |
363 | Some(TypeNs::GenericParam(param_id)) => { | 363 | Some(TypeNs::GenericParam(param_id)) => { |
364 | let predicates = ctx.db.generic_predicates_for_param(param_id); | 364 | let predicates = ctx.db.generic_predicates_for_param(param_id); |
365 | predicates | 365 | let mut traits_: Vec<_> = predicates |
366 | .iter() | 366 | .iter() |
367 | .filter_map(|pred| match &pred.value { | 367 | .filter_map(|pred| match &pred.value { |
368 | GenericPredicate::Implemented(tr) => Some(tr.trait_), | 368 | GenericPredicate::Implemented(tr) => Some(tr.trait_), |
369 | _ => None, | 369 | _ => None, |
370 | }) | 370 | }) |
371 | .collect() | 371 | .collect(); |
372 | // Handle `Self::Type` referring to own associated type in trait definitions | ||
373 | if let GenericDefId::TraitId(trait_id) = param_id.parent { | ||
374 | let generics = generics(ctx.db.upcast(), trait_id.into()); | ||
375 | if generics.params.types[param_id.local_id].provenance | ||
376 | == TypeParamProvenance::TraitSelf | ||
377 | { | ||
378 | traits_.push(trait_id); | ||
379 | } | ||
380 | } | ||
381 | traits_ | ||
372 | } | 382 | } |
373 | _ => return Ty::Unknown, | 383 | _ => return Ty::Unknown, |
374 | }; | 384 | }; |