aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/generics.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/generics.rs')
-rw-r--r--crates/ra_hir/src/generics.rs10
1 files changed, 7 insertions, 3 deletions
diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs
index 4d82fe25f..51c846e91 100644
--- a/crates/ra_hir/src/generics.rs
+++ b/crates/ra_hir/src/generics.rs
@@ -45,12 +45,16 @@ impl GenericParams {
45 ) -> Arc<GenericParams> { 45 ) -> Arc<GenericParams> {
46 let mut generics = GenericParams::default(); 46 let mut generics = GenericParams::default();
47 let parent = match def { 47 let parent = match def {
48 GenericDef::Function(it) => it.impl_block(db), 48 // FIXME abstract over containers (trait/impl)
49 GenericDef::TypeAlias(it) => it.impl_block(db), 49 GenericDef::Function(it) => it
50 .impl_block(db)
51 .map(GenericDef::from)
52 .or_else(|| it.parent_trait(db).map(GenericDef::from)),
53 GenericDef::TypeAlias(it) => it.impl_block(db).map(GenericDef::from),
50 GenericDef::Struct(_) | GenericDef::Enum(_) | GenericDef::Trait(_) => None, 54 GenericDef::Struct(_) | GenericDef::Enum(_) | GenericDef::Trait(_) => None,
51 GenericDef::ImplBlock(_) => None, 55 GenericDef::ImplBlock(_) => None,
52 }; 56 };
53 generics.parent_params = parent.map(|p| p.generic_params(db)); 57 generics.parent_params = parent.map(|p| db.generic_params(p));
54 let start = generics.parent_params.as_ref().map(|p| p.params.len()).unwrap_or(0) as u32; 58 let start = generics.parent_params.as_ref().map(|p| p.params.len()).unwrap_or(0) as u32;
55 match def { 59 match def {
56 GenericDef::Function(it) => generics.fill(&*it.source(db).1, start), 60 GenericDef::Function(it) => generics.fill(&*it.source(db).1, start),