diff options
Diffstat (limited to 'crates/ra_hir/src/generics.rs')
-rw-r--r-- | crates/ra_hir/src/generics.rs | 42 |
1 files changed, 16 insertions, 26 deletions
diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs index c76df0698..77fb76bfc 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs | |||
@@ -12,8 +12,8 @@ use crate::{ | |||
12 | name::SELF_TYPE, | 12 | name::SELF_TYPE, |
13 | path::Path, | 13 | path::Path, |
14 | type_ref::{TypeBound, TypeRef}, | 14 | type_ref::{TypeBound, TypeRef}, |
15 | AdtDef, AsName, Container, Enum, EnumVariant, Function, HasSource, ImplBlock, Name, Struct, | 15 | Adt, AsName, Container, Enum, EnumVariant, Function, HasSource, ImplBlock, Name, Struct, Trait, |
16 | Trait, TypeAlias, Union, | 16 | TypeAlias, Union, |
17 | }; | 17 | }; |
18 | 18 | ||
19 | /// Data about a generic parameter (to a function, struct, impl, ...). | 19 | /// Data about a generic parameter (to a function, struct, impl, ...). |
@@ -47,9 +47,7 @@ pub struct WherePredicate { | |||
47 | #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] | 47 | #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] |
48 | pub enum GenericDef { | 48 | pub enum GenericDef { |
49 | Function(Function), | 49 | Function(Function), |
50 | Struct(Struct), | 50 | Adt(Adt), |
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,14 @@ 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 | } |
60 | impl_froms!(GenericDef: Function, Struct, Union, Enum, Trait, TypeAlias, ImplBlock, EnumVariant); | 58 | impl_froms!( |
59 | GenericDef: Function, | ||
60 | Adt(Struct, Enum, Union), | ||
61 | Trait, | ||
62 | TypeAlias, | ||
63 | ImplBlock, | ||
64 | EnumVariant | ||
65 | ); | ||
61 | 66 | ||
62 | impl GenericParams { | 67 | impl GenericParams { |
63 | pub(crate) fn generic_params_query( | 68 | pub(crate) fn generic_params_query( |
@@ -69,10 +74,7 @@ impl GenericParams { | |||
69 | GenericDef::Function(it) => it.container(db).map(GenericDef::from), | 74 | GenericDef::Function(it) => it.container(db).map(GenericDef::from), |
70 | GenericDef::TypeAlias(it) => it.container(db).map(GenericDef::from), | 75 | GenericDef::TypeAlias(it) => it.container(db).map(GenericDef::from), |
71 | GenericDef::EnumVariant(it) => Some(it.parent_enum(db).into()), | 76 | GenericDef::EnumVariant(it) => Some(it.parent_enum(db).into()), |
72 | GenericDef::Struct(_) | 77 | GenericDef::Adt(_) | GenericDef::Trait(_) => None, |
73 | | GenericDef::Union(_) | ||
74 | | GenericDef::Enum(_) | ||
75 | | GenericDef::Trait(_) => None, | ||
76 | GenericDef::ImplBlock(_) => None, | 78 | GenericDef::ImplBlock(_) => None, |
77 | }; | 79 | }; |
78 | generics.parent_params = parent.map(|p| db.generic_params(p)); | 80 | generics.parent_params = parent.map(|p| db.generic_params(p)); |
@@ -80,9 +82,9 @@ impl GenericParams { | |||
80 | // FIXME: add `: Sized` bound for everything except for `Self` in traits | 82 | // FIXME: add `: Sized` bound for everything except for `Self` in traits |
81 | match def { | 83 | match def { |
82 | GenericDef::Function(it) => generics.fill(&it.source(db).ast, start), | 84 | GenericDef::Function(it) => generics.fill(&it.source(db).ast, start), |
83 | GenericDef::Struct(it) => generics.fill(&it.source(db).ast, start), | 85 | GenericDef::Adt(Adt::Struct(it)) => generics.fill(&it.source(db).ast, start), |
84 | GenericDef::Union(it) => generics.fill(&it.source(db).ast, start), | 86 | GenericDef::Adt(Adt::Union(it)) => generics.fill(&it.source(db).ast, start), |
85 | GenericDef::Enum(it) => generics.fill(&it.source(db).ast, start), | 87 | GenericDef::Adt(Adt::Enum(it)) => generics.fill(&it.source(db).ast, start), |
86 | GenericDef::Trait(it) => { | 88 | GenericDef::Trait(it) => { |
87 | // traits get the Self type as an implicit first type parameter | 89 | // traits get the Self type as an implicit first type parameter |
88 | generics.params.push(GenericParam { idx: start, name: SELF_TYPE, default: None }); | 90 | generics.params.push(GenericParam { idx: start, name: SELF_TYPE, default: None }); |
@@ -186,9 +188,7 @@ impl GenericDef { | |||
186 | pub(crate) fn resolver(&self, db: &impl HirDatabase) -> crate::Resolver { | 188 | pub(crate) fn resolver(&self, db: &impl HirDatabase) -> crate::Resolver { |
187 | match self { | 189 | match self { |
188 | GenericDef::Function(inner) => inner.resolver(db), | 190 | GenericDef::Function(inner) => inner.resolver(db), |
189 | GenericDef::Struct(inner) => inner.resolver(db), | 191 | GenericDef::Adt(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), | 192 | GenericDef::Trait(inner) => inner.resolver(db), |
193 | GenericDef::TypeAlias(inner) => inner.resolver(db), | 193 | GenericDef::TypeAlias(inner) => inner.resolver(db), |
194 | GenericDef::ImplBlock(inner) => inner.resolver(db), | 194 | GenericDef::ImplBlock(inner) => inner.resolver(db), |
@@ -206,16 +206,6 @@ impl From<Container> for GenericDef { | |||
206 | } | 206 | } |
207 | } | 207 | } |
208 | 208 | ||
209 | impl 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 | |||
219 | pub trait HasGenericParams: Copy { | 209 | pub trait HasGenericParams: Copy { |
220 | fn generic_params(self, db: &impl DefDatabase) -> Arc<GenericParams>; | 210 | fn generic_params(self, db: &impl DefDatabase) -> Arc<GenericParams>; |
221 | } | 211 | } |