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 6c7bbc448..7b5990a47 100644 --- a/crates/ra_hir_ty/src/lower.rs +++ b/crates/ra_hir_ty/src/lower.rs | |||
@@ -360,13 +360,23 @@ impl Ty { | |||
360 | }, | 360 | }, |
361 | Some(TypeNs::GenericParam(param_id)) => { | 361 | Some(TypeNs::GenericParam(param_id)) => { |
362 | let predicates = ctx.db.generic_predicates_for_param(param_id); | 362 | let predicates = ctx.db.generic_predicates_for_param(param_id); |
363 | predicates | 363 | let mut traits_: Vec<_> = predicates |
364 | .iter() | 364 | .iter() |
365 | .filter_map(|pred| match &pred.value { | 365 | .filter_map(|pred| match &pred.value { |
366 | GenericPredicate::Implemented(tr) => Some(tr.trait_), | 366 | GenericPredicate::Implemented(tr) => Some(tr.trait_), |
367 | _ => None, | 367 | _ => None, |
368 | }) | 368 | }) |
369 | .collect() | 369 | .collect(); |
370 | // Handle `Self::Type` referring to own associated type in trait definitions | ||
371 | if let GenericDefId::TraitId(trait_id) = param_id.parent { | ||
372 | let generics = generics(ctx.db.upcast(), trait_id.into()); | ||
373 | if generics.params.types[param_id.local_id].provenance | ||
374 | == TypeParamProvenance::TraitSelf | ||
375 | { | ||
376 | traits_.push(trait_id); | ||
377 | } | ||
378 | } | ||
379 | traits_ | ||
370 | } | 380 | } |
371 | _ => return Ty::Unknown, | 381 | _ => return Ty::Unknown, |
372 | }; | 382 | }; |