Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit eace303

Browse files
committed
Enum variants are not generic def ids
1 parent 91f0eec commit eace303

File tree

22 files changed

+188
-178
lines changed

22 files changed

+188
-178
lines changed

src/tools/rust-analyzer/crates/hir-def/src/generics.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -582,13 +582,11 @@ impl GenericParams {
582582
GenericDefId::TraitAliasId(id) => id_to_generics(db, id, enabled_params),
583583
GenericDefId::TypeAliasId(id) => id_to_generics(db, id, enabled_params),
584584
GenericDefId::ImplId(id) => id_to_generics(db, id, enabled_params),
585-
GenericDefId::EnumVariantId(_) | GenericDefId::ConstId(_) => {
586-
Interned::new(GenericParams {
587-
type_or_consts: Default::default(),
588-
lifetimes: Default::default(),
589-
where_predicates: Default::default(),
590-
})
591-
}
585+
GenericDefId::ConstId(_) => Interned::new(GenericParams {
586+
type_or_consts: Default::default(),
587+
lifetimes: Default::default(),
588+
where_predicates: Default::default(),
589+
}),
592590
}
593591
}
594592

src/tools/rust-analyzer/crates/hir-def/src/lib.rs

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ pub enum TypeOwnerId {
689689
}
690690

691691
impl TypeOwnerId {
692-
fn as_generic_def_id(self) -> Option<GenericDefId> {
692+
fn as_generic_def_id(self, db: &dyn DefDatabase) -> Option<GenericDefId> {
693693
Some(match self {
694694
TypeOwnerId::FunctionId(it) => GenericDefId::FunctionId(it),
695695
TypeOwnerId::ConstId(it) => GenericDefId::ConstId(it),
@@ -698,7 +698,9 @@ impl TypeOwnerId {
698698
TypeOwnerId::TraitAliasId(it) => GenericDefId::TraitAliasId(it),
699699
TypeOwnerId::TypeAliasId(it) => GenericDefId::TypeAliasId(it),
700700
TypeOwnerId::ImplId(it) => GenericDefId::ImplId(it),
701-
TypeOwnerId::EnumVariantId(it) => GenericDefId::EnumVariantId(it),
701+
TypeOwnerId::EnumVariantId(it) => {
702+
GenericDefId::AdtId(AdtId::EnumId(it.lookup(db).parent))
703+
}
702704
TypeOwnerId::InTypeConstId(_) | TypeOwnerId::StaticId(_) => return None,
703705
})
704706
}
@@ -740,7 +742,6 @@ impl From<GenericDefId> for TypeOwnerId {
740742
GenericDefId::TraitAliasId(it) => it.into(),
741743
GenericDefId::TypeAliasId(it) => it.into(),
742744
GenericDefId::ImplId(it) => it.into(),
743-
GenericDefId::EnumVariantId(it) => it.into(),
744745
GenericDefId::ConstId(it) => it.into(),
745746
}
746747
}
@@ -849,8 +850,8 @@ impl GeneralConstId {
849850
pub fn generic_def(self, db: &dyn DefDatabase) -> Option<GenericDefId> {
850851
match self {
851852
GeneralConstId::ConstId(it) => Some(it.into()),
852-
GeneralConstId::ConstBlockId(it) => it.lookup(db).parent.as_generic_def_id(),
853-
GeneralConstId::InTypeConstId(it) => it.lookup(db).owner.as_generic_def_id(),
853+
GeneralConstId::ConstBlockId(it) => it.lookup(db).parent.as_generic_def_id(db),
854+
GeneralConstId::InTypeConstId(it) => it.lookup(db).owner.as_generic_def_id(db),
854855
}
855856
}
856857

@@ -888,12 +889,12 @@ impl From<EnumVariantId> for DefWithBodyId {
888889
}
889890

890891
impl DefWithBodyId {
891-
pub fn as_generic_def_id(self) -> Option<GenericDefId> {
892+
pub fn as_generic_def_id(self, db: &dyn DefDatabase) -> Option<GenericDefId> {
892893
match self {
893894
DefWithBodyId::FunctionId(f) => Some(f.into()),
894895
DefWithBodyId::StaticId(_) => None,
895896
DefWithBodyId::ConstId(c) => Some(c.into()),
896-
DefWithBodyId::VariantId(c) => Some(c.into()),
897+
DefWithBodyId::VariantId(c) => Some(c.lookup(db).parent.into()),
897898
// FIXME: stable rust doesn't allow generics in constants, but we should
898899
// use `TypeOwnerId::as_generic_def_id` when it does.
899900
DefWithBodyId::InTypeConstId(_) => None,
@@ -921,10 +922,6 @@ pub enum GenericDefId {
921922
TraitAliasId(TraitAliasId),
922923
TypeAliasId(TypeAliasId),
923924
ImplId(ImplId),
924-
// enum variants cannot have generics themselves, but their parent enums
925-
// can, and this makes some code easier to write
926-
// FIXME: Try to remove this as that will reduce the amount of query slots generated per enum?
927-
EnumVariantId(EnumVariantId),
928925
// consts can have type parameters from their parents (i.e. associated consts of traits)
929926
ConstId(ConstId),
930927
}
@@ -935,7 +932,6 @@ impl_from!(
935932
TraitAliasId,
936933
TypeAliasId,
937934
ImplId,
938-
EnumVariantId,
939935
ConstId
940936
for GenericDefId
941937
);
@@ -967,7 +963,6 @@ impl GenericDefId {
967963
GenericDefId::TraitAliasId(it) => file_id_and_params_of_item_loc(db, it),
968964
GenericDefId::ImplId(it) => file_id_and_params_of_item_loc(db, it),
969965
GenericDefId::ConstId(it) => (it.lookup(db).id.file_id(), None),
970-
GenericDefId::EnumVariantId(it) => (it.lookup(db).id.file_id(), None),
971966
}
972967
}
973968

@@ -994,6 +989,46 @@ impl From<AssocItemId> for GenericDefId {
994989
}
995990
}
996991

992+
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
993+
pub enum CallableDefId {
994+
FunctionId(FunctionId),
995+
StructId(StructId),
996+
EnumVariantId(EnumVariantId),
997+
}
998+
999+
impl InternValueTrivial for CallableDefId {}
1000+
1001+
impl_from!(FunctionId, StructId, EnumVariantId for CallableDefId);
1002+
impl From<CallableDefId> for ModuleDefId {
1003+
fn from(def: CallableDefId) -> ModuleDefId {
1004+
match def {
1005+
CallableDefId::FunctionId(f) => ModuleDefId::FunctionId(f),
1006+
CallableDefId::StructId(s) => ModuleDefId::AdtId(AdtId::StructId(s)),
1007+
CallableDefId::EnumVariantId(e) => ModuleDefId::EnumVariantId(e),
1008+
}
1009+
}
1010+
}
1011+
1012+
impl CallableDefId {
1013+
pub fn krate(self, db: &dyn DefDatabase) -> CrateId {
1014+
match self {
1015+
CallableDefId::FunctionId(f) => f.krate(db),
1016+
CallableDefId::StructId(s) => s.krate(db),
1017+
CallableDefId::EnumVariantId(e) => e.krate(db),
1018+
}
1019+
}
1020+
}
1021+
1022+
impl GenericDefId {
1023+
pub fn from(db: &dyn DefDatabase, def: CallableDefId) -> GenericDefId {
1024+
match def {
1025+
CallableDefId::FunctionId(f) => f.into(),
1026+
CallableDefId::StructId(s) => s.into(),
1027+
CallableDefId::EnumVariantId(e) => e.lookup(db).parent.into(),
1028+
}
1029+
}
1030+
}
1031+
9971032
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
9981033
pub enum AttrDefId {
9991034
ModuleId(ModuleId),
@@ -1310,7 +1345,6 @@ impl HasModule for GenericDefId {
13101345
GenericDefId::TraitAliasId(it) => it.module(db),
13111346
GenericDefId::TypeAliasId(it) => it.module(db),
13121347
GenericDefId::ImplId(it) => it.module(db),
1313-
GenericDefId::EnumVariantId(it) => it.module(db),
13141348
GenericDefId::ConstId(it) => it.module(db),
13151349
}
13161350
}

src/tools/rust-analyzer/crates/hir-def/src/resolver.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1164,7 +1164,6 @@ impl HasResolver for GenericDefId {
11641164
GenericDefId::TraitAliasId(inner) => inner.resolver(db),
11651165
GenericDefId::TypeAliasId(inner) => inner.resolver(db),
11661166
GenericDefId::ImplId(inner) => inner.resolver(db),
1167-
GenericDefId::EnumVariantId(inner) => inner.resolver(db),
11681167
GenericDefId::ConstId(inner) => inner.resolver(db),
11691168
}
11701169
}

src/tools/rust-analyzer/crates/hir-ty/src/builder.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,9 @@ impl TyBuilder<()> {
252252
/// This method prepopulates the builder with placeholder substitution of `parent`, so you
253253
/// should only push exactly 3 `GenericArg`s before building.
254254
pub fn subst_for_coroutine(db: &dyn HirDatabase, parent: DefWithBodyId) -> TyBuilder<()> {
255-
let parent_subst =
256-
parent.as_generic_def_id().map(|p| generics(db.upcast(), p).placeholder_subst(db));
255+
let parent_subst = parent
256+
.as_generic_def_id(db.upcast())
257+
.map(|p| generics(db.upcast(), p).placeholder_subst(db));
257258
// These represent resume type, yield type, and return type of coroutine.
258259
let params = std::iter::repeat(ParamKind::Type).take(3).collect();
259260
TyBuilder::new((), params, parent_subst)
@@ -266,7 +267,7 @@ impl TyBuilder<()> {
266267
) -> Substitution {
267268
let sig_ty = sig_ty.cast(Interner);
268269
let self_subst = iter::once(&sig_ty);
269-
let Some(parent) = parent.as_generic_def_id() else {
270+
let Some(parent) = parent.as_generic_def_id(db.upcast()) else {
270271
return Substitution::from_iter(Interner, self_subst);
271272
};
272273
Substitution::from_iter(

src/tools/rust-analyzer/crates/hir-ty/src/chalk_db.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ use hir_def::{
1313
data::adt::StructFlags,
1414
hir::Movability,
1515
lang_item::{LangItem, LangItemTarget},
16-
AssocItemId, BlockId, GenericDefId, HasModule, ItemContainerId, Lookup, TypeAliasId, VariantId,
16+
AssocItemId, BlockId, CallableDefId, GenericDefId, HasModule, ItemContainerId, Lookup,
17+
TypeAliasId, VariantId,
1718
};
1819
use hir_expand::name::name;
1920

@@ -28,9 +29,9 @@ use crate::{
2829
to_assoc_type_id, to_chalk_trait_id,
2930
traits::ChalkContext,
3031
utils::ClosureSubst,
31-
wrap_empty_binders, AliasEq, AliasTy, BoundVar, CallableDefId, DebruijnIndex, FnDefId,
32-
Interner, ProjectionTy, ProjectionTyExt, QuantifiedWhereClause, Substitution, TraitRef,
33-
TraitRefExt, Ty, TyBuilder, TyExt, TyKind, WhereClause,
32+
wrap_empty_binders, AliasEq, AliasTy, BoundVar, DebruijnIndex, FnDefId, Interner, ProjectionTy,
33+
ProjectionTyExt, QuantifiedWhereClause, Substitution, TraitRef, TraitRefExt, Ty, TyBuilder,
34+
TyExt, TyKind, WhereClause,
3435
};
3536

3637
pub(crate) type AssociatedTyDatum = chalk_solve::rust_ir::AssociatedTyDatum<Interner>;
@@ -102,7 +103,7 @@ impl chalk_solve::RustIrDatabase<Interner> for ChalkContext<'_> {
102103
&self,
103104
fn_def_id: chalk_ir::FnDefId<Interner>,
104105
) -> Arc<rust_ir::FnDefDatum<Interner>> {
105-
self.db.fn_def_datum(self.krate, fn_def_id)
106+
self.db.fn_def_datum(fn_def_id)
106107
}
107108

108109
fn impls_for_trait(
@@ -912,16 +913,13 @@ fn type_alias_associated_ty_value(
912913
Arc::new(value)
913914
}
914915

915-
pub(crate) fn fn_def_datum_query(
916-
db: &dyn HirDatabase,
917-
_krate: CrateId,
918-
fn_def_id: FnDefId,
919-
) -> Arc<FnDefDatum> {
916+
pub(crate) fn fn_def_datum_query(db: &dyn HirDatabase, fn_def_id: FnDefId) -> Arc<FnDefDatum> {
920917
let callable_def: CallableDefId = from_chalk(db, fn_def_id);
921-
let generic_params = generics(db.upcast(), callable_def.into());
918+
let generic_def = GenericDefId::from(db.upcast(), callable_def);
919+
let generic_params = generics(db.upcast(), generic_def);
922920
let (sig, binders) = db.callable_item_signature(callable_def).into_value_and_skipped_binders();
923921
let bound_vars = generic_params.bound_vars_subst(db, DebruijnIndex::INNERMOST);
924-
let where_clauses = convert_where_clauses(db, callable_def.into(), &bound_vars);
922+
let where_clauses = convert_where_clauses(db, generic_def, &bound_vars);
925923
let bound = rust_ir::FnDefDatumBound {
926924
// Note: Chalk doesn't actually use this information yet as far as I am aware, but we provide it anyway
927925
inputs_and_output: chalk_ir::Binders::empty(
@@ -948,7 +946,7 @@ pub(crate) fn fn_def_datum_query(
948946

949947
pub(crate) fn fn_def_variance_query(db: &dyn HirDatabase, fn_def_id: FnDefId) -> Variances {
950948
let callable_def: CallableDefId = from_chalk(db, fn_def_id);
951-
let generic_params = generics(db.upcast(), callable_def.into());
949+
let generic_params = generics(db.upcast(), GenericDefId::from(db.upcast(), callable_def));
952950
Variances::from_iter(
953951
Interner,
954952
std::iter::repeat(chalk_ir::Variance::Invariant).take(generic_params.len()),

src/tools/rust-analyzer/crates/hir-ty/src/chalk_ext.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,10 @@ impl TyExt for Ty {
188188
fn as_generic_def(&self, db: &dyn HirDatabase) -> Option<GenericDefId> {
189189
match *self.kind(Interner) {
190190
TyKind::Adt(AdtId(adt), ..) => Some(adt.into()),
191-
TyKind::FnDef(callable, ..) => {
192-
Some(db.lookup_intern_callable_def(callable.into()).into())
193-
}
191+
TyKind::FnDef(callable, ..) => Some(GenericDefId::from(
192+
db.upcast(),
193+
db.lookup_intern_callable_def(callable.into()),
194+
)),
194195
TyKind::AssociatedType(type_alias, ..) => Some(from_assoc_type_id(type_alias).into()),
195196
TyKind::Foreign(type_alias, ..) => Some(from_foreign_def_id(type_alias).into()),
196197
_ => None,

src/tools/rust-analyzer/crates/hir-ty/src/db.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use base_db::{
99
CrateId, Upcast,
1010
};
1111
use hir_def::{
12-
db::DefDatabase, hir::ExprId, layout::TargetDataLayout, AdtId, BlockId, ConstParamId,
13-
DefWithBodyId, EnumVariantId, FunctionId, GeneralConstId, GenericDefId, ImplId,
12+
db::DefDatabase, hir::ExprId, layout::TargetDataLayout, AdtId, BlockId, CallableDefId,
13+
ConstParamId, DefWithBodyId, EnumVariantId, FunctionId, GeneralConstId, GenericDefId, ImplId,
1414
LifetimeParamId, LocalFieldId, StaticId, TypeAliasId, TypeOrConstParamId, VariantId,
1515
};
1616
use la_arena::ArenaMap;
@@ -24,9 +24,8 @@ use crate::{
2424
lower::{GenericDefaults, GenericPredicates},
2525
method_resolution::{InherentImpls, TraitImpls, TyFingerprint},
2626
mir::{BorrowckResult, MirBody, MirLowerError},
27-
Binders, CallableDefId, ClosureId, Const, FnDefId, ImplTraitId, ImplTraits, InferenceResult,
28-
Interner, PolyFnSig, QuantifiedWhereClause, Substitution, TraitEnvironment, TraitRef, Ty,
29-
TyDefId, ValueTyDefId,
27+
Binders, ClosureId, Const, FnDefId, ImplTraitId, ImplTraits, InferenceResult, Interner,
28+
PolyFnSig, Substitution, TraitEnvironment, TraitRef, Ty, TyDefId, ValueTyDefId,
3029
};
3130
use hir_expand::name::Name;
3231

@@ -145,7 +144,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
145144
def: GenericDefId,
146145
param_id: TypeOrConstParamId,
147146
assoc_name: Option<Name>,
148-
) -> Arc<[Binders<QuantifiedWhereClause>]>;
147+
) -> GenericPredicates;
149148

150149
#[salsa::invoke(crate::lower::generic_predicates_query)]
151150
fn generic_predicates(&self, def: GenericDefId) -> GenericPredicates;
@@ -232,7 +231,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
232231
) -> sync::Arc<chalk_db::ImplDatum>;
233232

234233
#[salsa::invoke(chalk_db::fn_def_datum_query)]
235-
fn fn_def_datum(&self, krate: CrateId, fn_def_id: FnDefId) -> sync::Arc<chalk_db::FnDefDatum>;
234+
fn fn_def_datum(&self, fn_def_id: FnDefId) -> sync::Arc<chalk_db::FnDefDatum>;
236235

237236
#[salsa::invoke(chalk_db::fn_def_variance_query)]
238237
fn fn_def_variance(&self, fn_def_id: FnDefId) -> chalk_db::Variances;

src/tools/rust-analyzer/crates/hir-ty/src/display.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ use hir_def::{
2121
path::{Path, PathKind},
2222
type_ref::{TraitBoundModifier, TypeBound, TypeRef},
2323
visibility::Visibility,
24-
HasModule, ImportPathConfig, ItemContainerId, LocalFieldId, Lookup, ModuleDefId, ModuleId,
25-
TraitId,
24+
GenericDefId, HasModule, ImportPathConfig, ItemContainerId, LocalFieldId, Lookup, ModuleDefId,
25+
ModuleId, TraitId,
2626
};
2727
use hir_expand::name::Name;
2828
use intern::{Internable, Interned};
@@ -988,7 +988,8 @@ impl HirDisplay for Ty {
988988
f.end_location_link();
989989

990990
if parameters.len(Interner) > 0 {
991-
let generics = generics(db.upcast(), def.into());
991+
let generic_def_id = GenericDefId::from(db.upcast(), def);
992+
let generics = generics(db.upcast(), generic_def_id);
992993
let (parent_len, self_param, type_, const_, impl_, lifetime) =
993994
generics.provenance_split();
994995
let parameters = parameters.as_slice(Interner);
@@ -1002,8 +1003,9 @@ impl HirDisplay for Ty {
10021003
debug_assert_eq!(parent_params.len(), parent_len);
10031004

10041005
let parent_params =
1005-
generic_args_sans_defaults(f, Some(def.into()), parent_params);
1006-
let fn_params = generic_args_sans_defaults(f, Some(def.into()), fn_params);
1006+
generic_args_sans_defaults(f, Some(generic_def_id), parent_params);
1007+
let fn_params =
1008+
generic_args_sans_defaults(f, Some(generic_def_id), fn_params);
10071009

10081010
write!(f, "<")?;
10091011
hir_fmt_generic_arguments(f, parent_params, None)?;

src/tools/rust-analyzer/crates/hir-ty/src/generics.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,6 @@ fn parent_generic_def(db: &dyn DefDatabase, def: GenericDefId) -> Option<Generic
216216
GenericDefId::FunctionId(it) => it.lookup(db).container,
217217
GenericDefId::TypeAliasId(it) => it.lookup(db).container,
218218
GenericDefId::ConstId(it) => it.lookup(db).container,
219-
GenericDefId::EnumVariantId(it) => return Some(it.lookup(db).parent.into()),
220219
GenericDefId::AdtId(_)
221220
| GenericDefId::TraitId(_)
222221
| GenericDefId::ImplId(_)

src/tools/rust-analyzer/crates/hir-ty/src/infer/expr.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use hir_def::{
1313
},
1414
lang_item::{LangItem, LangItemTarget},
1515
path::{GenericArgs, Path},
16-
BlockId, FieldId, GenericParamId, ItemContainerId, Lookup, TupleFieldId, TupleId,
16+
BlockId, FieldId, GenericDefId, GenericParamId, ItemContainerId, Lookup, TupleFieldId, TupleId,
1717
};
1818
use hir_expand::name::{name, Name};
1919
use stdx::always;
@@ -1895,7 +1895,8 @@ impl InferenceContext<'_> {
18951895
let callable_ty = self.resolve_ty_shallow(callable_ty);
18961896
if let TyKind::FnDef(fn_def, parameters) = callable_ty.kind(Interner) {
18971897
let def: CallableDefId = from_chalk(self.db, *fn_def);
1898-
let generic_predicates = self.db.generic_predicates(def.into());
1898+
let generic_predicates =
1899+
self.db.generic_predicates(GenericDefId::from(self.db.upcast(), def));
18991900
for predicate in generic_predicates.iter() {
19001901
let (predicate, binders) = predicate
19011902
.clone()

0 commit comments

Comments
 (0)