aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/generics.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-04-14 10:15:11 +0100
committerFlorian Diebold <[email protected]>2019-04-14 10:28:53 +0100
commit4497e1d3eae0a72ee1e52be6ab547c67d31279c6 (patch)
tree88191878e2d35edd261829830012e5df003258ad /crates/ra_hir/src/generics.rs
parent7650a44640a373e28f9eecc4623256ce6b9bbaa0 (diff)
Add Container enum to handle both kinds of container (impl/trait)
Diffstat (limited to 'crates/ra_hir/src/generics.rs')
-rw-r--r--crates/ra_hir/src/generics.rs20
1 files changed, 13 insertions, 7 deletions
diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs
index 51c846e91..f92b146ef 100644
--- a/crates/ra_hir/src/generics.rs
+++ b/crates/ra_hir/src/generics.rs
@@ -9,7 +9,7 @@ use ra_syntax::ast::{self, NameOwner, TypeParamsOwner};
9 9
10use crate::{ 10use crate::{
11 db::DefDatabase, 11 db::DefDatabase,
12 Name, AsName, Function, Struct, Enum, Trait, TypeAlias, ImplBlock 12 Name, AsName, Function, Struct, Enum, Trait, TypeAlias, ImplBlock, Container
13}; 13};
14 14
15/// Data about a generic parameter (to a function, struct, impl, ...). 15/// Data about a generic parameter (to a function, struct, impl, ...).
@@ -27,6 +27,7 @@ pub struct GenericParams {
27 pub(crate) params: Vec<GenericParam>, 27 pub(crate) params: Vec<GenericParam>,
28} 28}
29 29
30// FIXME: consts can have type parameters from their parents (i.e. associated consts of traits)
30#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] 31#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
31pub enum GenericDef { 32pub enum GenericDef {
32 Function(Function), 33 Function(Function),
@@ -45,12 +46,8 @@ impl GenericParams {
45 ) -> Arc<GenericParams> { 46 ) -> Arc<GenericParams> {
46 let mut generics = GenericParams::default(); 47 let mut generics = GenericParams::default();
47 let parent = match def { 48 let parent = match def {
48 // FIXME abstract over containers (trait/impl) 49 GenericDef::Function(it) => it.container(db).map(GenericDef::from),
49 GenericDef::Function(it) => it 50 GenericDef::TypeAlias(it) => it.container(db).map(GenericDef::from),
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),
54 GenericDef::Struct(_) | GenericDef::Enum(_) | GenericDef::Trait(_) => None, 51 GenericDef::Struct(_) | GenericDef::Enum(_) | GenericDef::Trait(_) => None,
55 GenericDef::ImplBlock(_) => None, 52 GenericDef::ImplBlock(_) => None,
56 }; 53 };
@@ -112,3 +109,12 @@ impl GenericParams {
112 vec 109 vec
113 } 110 }
114} 111}
112
113impl From<Container> for GenericDef {
114 fn from(c: Container) -> Self {
115 match c {
116 Container::Trait(trait_) => trait_.into(),
117 Container::ImplBlock(impl_block) => impl_block.into(),
118 }
119 }
120}