aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/generics.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-09-12 22:10:16 +0100
committerAleksey Kladov <[email protected]>2019-09-12 22:10:16 +0100
commit45117c63884366ee82102a782a62a09fefff746b (patch)
treeb66d9ca105e39b96b78bf7f3659d1858577a2c8c /crates/ra_hir/src/generics.rs
parentd8b621cf26b59ff5ae9379b50fc822590b6a3a4e (diff)
make various enums "inherit" from AdtDef
Diffstat (limited to 'crates/ra_hir/src/generics.rs')
-rw-r--r--crates/ra_hir/src/generics.rs49
1 files changed, 25 insertions, 24 deletions
diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs
index c76df0698..0e89941f3 100644
--- a/crates/ra_hir/src/generics.rs
+++ b/crates/ra_hir/src/generics.rs
@@ -47,9 +47,7 @@ pub struct WherePredicate {
47#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] 47#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
48pub enum GenericDef { 48pub enum GenericDef {
49 Function(Function), 49 Function(Function),
50 Struct(Struct), 50 AdtDef(AdtDef),
51 Union(Union),
52 Enum(Enum),
53 Trait(Trait), 51 Trait(Trait),
54 TypeAlias(TypeAlias), 52 TypeAlias(TypeAlias),
55 ImplBlock(ImplBlock), 53 ImplBlock(ImplBlock),
@@ -57,7 +55,25 @@ pub enum GenericDef {
57 // can, and this makes some code easier to write 55 // can, and this makes some code easier to write
58 EnumVariant(EnumVariant), 56 EnumVariant(EnumVariant),
59} 57}
60impl_froms!(GenericDef: Function, Struct, Union, Enum, Trait, TypeAlias, ImplBlock, EnumVariant); 58impl_froms!(GenericDef: Function, AdtDef, Trait, TypeAlias, ImplBlock, EnumVariant);
59
60impl From<Struct> for GenericDef {
61 fn from(it: Struct) -> GenericDef {
62 GenericDef::AdtDef(AdtDef::Struct(it))
63 }
64}
65
66impl From<Enum> for GenericDef {
67 fn from(it: Enum) -> GenericDef {
68 GenericDef::AdtDef(AdtDef::Enum(it))
69 }
70}
71
72impl From<Union> for GenericDef {
73 fn from(it: Union) -> GenericDef {
74 GenericDef::AdtDef(AdtDef::Union(it))
75 }
76}
61 77
62impl GenericParams { 78impl GenericParams {
63 pub(crate) fn generic_params_query( 79 pub(crate) fn generic_params_query(
@@ -69,10 +85,7 @@ impl GenericParams {
69 GenericDef::Function(it) => it.container(db).map(GenericDef::from), 85 GenericDef::Function(it) => it.container(db).map(GenericDef::from),
70 GenericDef::TypeAlias(it) => it.container(db).map(GenericDef::from), 86 GenericDef::TypeAlias(it) => it.container(db).map(GenericDef::from),
71 GenericDef::EnumVariant(it) => Some(it.parent_enum(db).into()), 87 GenericDef::EnumVariant(it) => Some(it.parent_enum(db).into()),
72 GenericDef::Struct(_) 88 GenericDef::AdtDef(_) | GenericDef::Trait(_) => None,
73 | GenericDef::Union(_)
74 | GenericDef::Enum(_)
75 | GenericDef::Trait(_) => None,
76 GenericDef::ImplBlock(_) => None, 89 GenericDef::ImplBlock(_) => None,
77 }; 90 };
78 generics.parent_params = parent.map(|p| db.generic_params(p)); 91 generics.parent_params = parent.map(|p| db.generic_params(p));
@@ -80,9 +93,9 @@ impl GenericParams {
80 // FIXME: add `: Sized` bound for everything except for `Self` in traits 93 // FIXME: add `: Sized` bound for everything except for `Self` in traits
81 match def { 94 match def {
82 GenericDef::Function(it) => generics.fill(&it.source(db).ast, start), 95 GenericDef::Function(it) => generics.fill(&it.source(db).ast, start),
83 GenericDef::Struct(it) => generics.fill(&it.source(db).ast, start), 96 GenericDef::AdtDef(AdtDef::Struct(it)) => generics.fill(&it.source(db).ast, start),
84 GenericDef::Union(it) => generics.fill(&it.source(db).ast, start), 97 GenericDef::AdtDef(AdtDef::Union(it)) => generics.fill(&it.source(db).ast, start),
85 GenericDef::Enum(it) => generics.fill(&it.source(db).ast, start), 98 GenericDef::AdtDef(AdtDef::Enum(it)) => generics.fill(&it.source(db).ast, start),
86 GenericDef::Trait(it) => { 99 GenericDef::Trait(it) => {
87 // traits get the Self type as an implicit first type parameter 100 // traits get the Self type as an implicit first type parameter
88 generics.params.push(GenericParam { idx: start, name: SELF_TYPE, default: None }); 101 generics.params.push(GenericParam { idx: start, name: SELF_TYPE, default: None });
@@ -186,9 +199,7 @@ impl GenericDef {
186 pub(crate) fn resolver(&self, db: &impl HirDatabase) -> crate::Resolver { 199 pub(crate) fn resolver(&self, db: &impl HirDatabase) -> crate::Resolver {
187 match self { 200 match self {
188 GenericDef::Function(inner) => inner.resolver(db), 201 GenericDef::Function(inner) => inner.resolver(db),
189 GenericDef::Struct(inner) => inner.resolver(db), 202 GenericDef::AdtDef(adt) => adt.resolver(db),
190 GenericDef::Union(inner) => inner.resolver(db),
191 GenericDef::Enum(inner) => inner.resolver(db),
192 GenericDef::Trait(inner) => inner.resolver(db), 203 GenericDef::Trait(inner) => inner.resolver(db),
193 GenericDef::TypeAlias(inner) => inner.resolver(db), 204 GenericDef::TypeAlias(inner) => inner.resolver(db),
194 GenericDef::ImplBlock(inner) => inner.resolver(db), 205 GenericDef::ImplBlock(inner) => inner.resolver(db),
@@ -206,16 +217,6 @@ impl From<Container> for GenericDef {
206 } 217 }
207} 218}
208 219
209impl From<crate::adt::AdtDef> for GenericDef {
210 fn from(adt: crate::adt::AdtDef) -> Self {
211 match adt {
212 AdtDef::Struct(s) => s.into(),
213 AdtDef::Union(u) => u.into(),
214 AdtDef::Enum(e) => e.into(),
215 }
216 }
217}
218
219pub trait HasGenericParams: Copy { 220pub trait HasGenericParams: Copy {
220 fn generic_params(self, db: &impl DefDatabase) -> Arc<GenericParams>; 221 fn generic_params(self, db: &impl DefDatabase) -> Arc<GenericParams>;
221} 222}