diff options
Diffstat (limited to 'crates/ra_hir/src/generics.rs')
-rw-r--r-- | crates/ra_hir/src/generics.rs | 10 |
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), |