Skip to content

Commit f854a29

Browse files
committed
Make EnumVariant a GenericDef and simplify some code
1 parent 065d398 commit f854a29

File tree

4 files changed

+21
-14
lines changed

4 files changed

+21
-14
lines changed

crates/ra_hir/src/generics.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use crate::{
1111
db::{AstDatabase, DefDatabase, HirDatabase},
1212
path::Path,
1313
type_ref::TypeRef,
14-
AdtDef, AsName, Container, Enum, Function, HasSource, ImplBlock, Name, Struct, Trait,
15-
TypeAlias, Union,
14+
AdtDef, AsName, Container, Enum, EnumVariant, Function, HasSource, ImplBlock, Name, Struct,
15+
Trait, TypeAlias, Union,
1616
};
1717

1818
/// Data about a generic parameter (to a function, struct, impl, ...).
@@ -50,8 +50,11 @@ pub enum GenericDef {
5050
Trait(Trait),
5151
TypeAlias(TypeAlias),
5252
ImplBlock(ImplBlock),
53+
// enum variants cannot have generics themselves, but their parent enums
54+
// can, and this makes some code easier to write
55+
EnumVariant(EnumVariant),
5356
}
54-
impl_froms!(GenericDef: Function, Struct, Union, Enum, Trait, TypeAlias, ImplBlock);
57+
impl_froms!(GenericDef: Function, Struct, Union, Enum, Trait, TypeAlias, ImplBlock, EnumVariant);
5558

5659
impl GenericParams {
5760
pub(crate) fn generic_params_query(
@@ -62,6 +65,7 @@ impl GenericParams {
6265
let parent = match def {
6366
GenericDef::Function(it) => it.container(db).map(GenericDef::from),
6467
GenericDef::TypeAlias(it) => it.container(db).map(GenericDef::from),
68+
GenericDef::EnumVariant(it) => Some(it.parent_enum(db).into()),
6569
GenericDef::Struct(_)
6670
| GenericDef::Union(_)
6771
| GenericDef::Enum(_)
@@ -86,6 +90,7 @@ impl GenericParams {
8690
}
8791
GenericDef::TypeAlias(it) => generics.fill(&*it.source(db).ast, start),
8892
GenericDef::ImplBlock(it) => generics.fill(&*it.source(db).ast, start),
93+
GenericDef::EnumVariant(_) => {}
8994
}
9095

9196
Arc::new(generics)
@@ -184,6 +189,7 @@ impl GenericDef {
184189
GenericDef::Trait(inner) => inner.resolver(db),
185190
GenericDef::TypeAlias(inner) => inner.resolver(db),
186191
GenericDef::ImplBlock(inner) => inner.resolver(db),
192+
GenericDef::EnumVariant(inner) => inner.parent_enum(db).resolver(db),
187193
}
188194
}
189195
}

crates/ra_hir/src/ty/infer.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -849,12 +849,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
849849
fn register_obligations_for_call(&mut self, callable_ty: &Ty) {
850850
if let Ty::Apply(a_ty) = callable_ty {
851851
if let TypeCtor::FnDef(def) = a_ty.ctor {
852-
let generic_predicates = self.db.generic_predicates(match def {
853-
// TODO add helper function
854-
CallableDef::Function(f) => f.into(),
855-
CallableDef::Struct(s) => s.into(),
856-
CallableDef::EnumVariant(_e) => unimplemented!(),
857-
});
852+
let generic_predicates = self.db.generic_predicates(def.into());
858853
for predicate in generic_predicates.iter() {
859854
let predicate = predicate.clone().subst(&a_ty.parameters);
860855
if let Some(obligation) = Obligation::from_predicate(predicate) {

crates/ra_hir/src/ty/lower.rs

+10
Original file line numberDiff line numberDiff line change
@@ -509,3 +509,13 @@ pub enum CallableDef {
509509
EnumVariant(EnumVariant),
510510
}
511511
impl_froms!(CallableDef: Function, Struct, EnumVariant);
512+
513+
impl From<CallableDef> for GenericDef {
514+
fn from(def: CallableDef) -> GenericDef {
515+
match def {
516+
CallableDef::Function(f) => f.into(),
517+
CallableDef::Struct(s) => s.into(),
518+
CallableDef::EnumVariant(e) => e.into(),
519+
}
520+
}
521+
}

crates/ra_hir/src/ty/traits/chalk.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -428,11 +428,7 @@ pub(crate) fn struct_datum_query(
428428
CallableDef::Struct(s) => s.module(db).krate(db),
429429
CallableDef::EnumVariant(v) => v.parent_enum(db).module(db).krate(db),
430430
} != Some(krate);
431-
let generic_def: GenericDef = match callable {
432-
CallableDef::Function(f) => f.into(),
433-
CallableDef::Struct(s) => s.into(),
434-
CallableDef::EnumVariant(v) => v.parent_enum(db).into(),
435-
};
431+
let generic_def: GenericDef = callable.into();
436432
let generic_params = generic_def.generic_params(db);
437433
let bound_vars = Substs::bound_vars(&generic_params);
438434
let where_clauses = convert_where_clauses(db, generic_def, &bound_vars);

0 commit comments

Comments
 (0)