aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/generics.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/generics.rs')
-rw-r--r--crates/ra_hir/src/generics.rs42
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)]
48pub enum GenericDef { 48pub 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}
60impl_froms!(GenericDef: Function, Struct, Union, Enum, Trait, TypeAlias, ImplBlock, EnumVariant); 58impl_froms!(
59 GenericDef: Function,
60 Adt(Struct, Enum, Union),
61 Trait,
62 TypeAlias,
63 ImplBlock,
64 EnumVariant
65);
61 66
62impl GenericParams { 67impl 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
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 { 209pub 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}