diff options
Diffstat (limited to 'crates/ra_hir/src/generics.rs')
-rw-r--r-- | crates/ra_hir/src/generics.rs | 49 |
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)] |
48 | pub enum GenericDef { | 48 | pub 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 | } |
60 | impl_froms!(GenericDef: Function, Struct, Union, Enum, Trait, TypeAlias, ImplBlock, EnumVariant); | 58 | impl_froms!(GenericDef: Function, AdtDef, Trait, TypeAlias, ImplBlock, EnumVariant); |
59 | |||
60 | impl From<Struct> for GenericDef { | ||
61 | fn from(it: Struct) -> GenericDef { | ||
62 | GenericDef::AdtDef(AdtDef::Struct(it)) | ||
63 | } | ||
64 | } | ||
65 | |||
66 | impl From<Enum> for GenericDef { | ||
67 | fn from(it: Enum) -> GenericDef { | ||
68 | GenericDef::AdtDef(AdtDef::Enum(it)) | ||
69 | } | ||
70 | } | ||
71 | |||
72 | impl From<Union> for GenericDef { | ||
73 | fn from(it: Union) -> GenericDef { | ||
74 | GenericDef::AdtDef(AdtDef::Union(it)) | ||
75 | } | ||
76 | } | ||
61 | 77 | ||
62 | impl GenericParams { | 78 | impl 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 | ||
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 { | 220 | pub 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 | } |