From d88d67819b3f052422ad3f024e44ad73dde1630b Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Sun, 12 Apr 2020 12:29:03 +0200 Subject: Handle `Self::Type` in trait definitions when referring to own associated type It was implemented for other generic parameters for the trait, but not for `Self`. --- crates/ra_hir_ty/src/lower.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir_ty/src/lower.rs') 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 { }, Some(TypeNs::GenericParam(param_id)) => { let predicates = ctx.db.generic_predicates_for_param(param_id); - predicates + let mut traits_: Vec<_> = predicates .iter() .filter_map(|pred| match &pred.value { GenericPredicate::Implemented(tr) => Some(tr.trait_), _ => None, }) - .collect() + .collect(); + // Handle `Self::Type` referring to own associated type in trait definitions + if let GenericDefId::TraitId(trait_id) = param_id.parent { + let generics = generics(ctx.db.upcast(), trait_id.into()); + if generics.params.types[param_id.local_id].provenance + == TypeParamProvenance::TraitSelf + { + traits_.push(trait_id); + } + } + traits_ } _ => return Ty::Unknown, }; -- cgit v1.2.3