Skip to content

Commit 8d1edc4

Browse files
authored
Merge pull request #22329 from ChayimFriedman2/intern-ref
Encode the name instead of index in `EnumVariantId`
2 parents 7c28934 + 470a37f commit 8d1edc4

35 files changed

Lines changed: 156 additions & 164 deletions

crates/base-db/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ macro_rules! impl_intern_key {
4949
#[salsa_macros::interned(no_lifetime, revisions = usize::MAX)]
5050
#[derive(PartialOrd, Ord)]
5151
pub struct $id {
52+
#[returns(ref)]
5253
pub loc: $loc,
5354
}
5455

crates/hir-def/src/db.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ use hir_expand::{
77
use triomphe::Arc;
88

99
use crate::{
10-
AssocItemId, AttrDefId, Macro2Loc, MacroExpander, MacroId, MacroRulesLoc, MacroRulesLocFlags,
11-
TraitId,
10+
AssocItemId, AttrDefId, MacroExpander, MacroId, MacroRulesLocFlags, TraitId,
1211
attrs::AttrFlags,
1312
item_tree::{ItemTree, file_item_tree},
1413
nameres::crate_def_map,
@@ -81,7 +80,7 @@ fn macro_def(db: &dyn DefDatabase, id: MacroId) -> MacroDefId {
8180

8281
match id {
8382
MacroId::Macro2Id(it) => {
84-
let loc: Macro2Loc = it.lookup(db);
83+
let loc = it.lookup(db);
8584

8685
MacroDefId {
8786
krate: loc.container.krate(db),
@@ -92,7 +91,7 @@ fn macro_def(db: &dyn DefDatabase, id: MacroId) -> MacroDefId {
9291
}
9392
}
9493
MacroId::MacroRulesId(it) => {
95-
let loc: MacroRulesLoc = it.lookup(db);
94+
let loc = it.lookup(db);
9695

9796
MacroDefId {
9897
krate: loc.container.krate(db),

crates/hir-def/src/find_path.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,7 @@ fn find_path_inner(ctx: &FindPathCtx<'_>, item: ItemInNs, max_len: usize) -> Opt
142142
// - if the item is an enum variant, refer to it via the enum
143143
let loc = variant.lookup(ctx.db);
144144
if let Some(mut path) = find_path_inner(ctx, ItemInNs::Types(loc.parent.into()), max_len) {
145-
path.push_segment(
146-
loc.parent.enum_variants(ctx.db).variants[loc.index as usize].1.clone(),
147-
);
145+
path.push_segment(loc.name.clone());
148146
return Some(path);
149147
}
150148
// If this doesn't work, it seems we have no way of referring to the

crates/hir-def/src/lang_item.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> Option<Box<LangIt
7474
}
7575
ModuleDefId::AdtId(AdtId::EnumId(e)) => {
7676
lang_items.collect_lang_item(db, e);
77-
e.enum_variants(db).variants.iter().for_each(|&(id, _, _)| {
77+
e.enum_variants(db).variants.values().for_each(|&(id, _)| {
7878
lang_items.collect_lang_item(db, id);
7979
});
8080
}

crates/hir-def/src/lib.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ impl EnumId {
298298
pub fn enum_variants_with_diagnostics(
299299
self,
300300
db: &dyn DefDatabase,
301-
) -> &(EnumVariants, Option<ThinVec<InactiveEnumVariantCode>>) {
301+
) -> &(EnumVariants, ThinVec<InactiveEnumVariantCode>) {
302302
EnumVariants::of(db, self)
303303
}
304304
}
@@ -367,20 +367,35 @@ impl ExternBlockId {
367367
}
368368
}
369369

370-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
370+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
371371
pub struct EnumVariantLoc {
372372
pub id: AstId<ast::Variant>,
373373
pub parent: EnumId,
374-
pub index: u32,
374+
pub name: Name,
375375
}
376376
impl_intern!(EnumVariantId, EnumVariantLoc);
377377
impl_loc!(EnumVariantLoc, id: Variant, parent: EnumId);
378378

379+
impl EnumVariantLoc {
380+
pub fn index(&self, db: &dyn DefDatabase) -> usize {
381+
self.parent
382+
.enum_variants(db)
383+
.variants
384+
.get_full(&self.name)
385+
.expect("parent enum should include this variant")
386+
.0
387+
}
388+
}
389+
379390
impl EnumVariantId {
380391
pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields {
381392
VariantFields::of(db, self.into())
382393
}
383394

395+
pub fn index(self, db: &dyn DefDatabase) -> usize {
396+
self.loc(db).index(db)
397+
}
398+
384399
pub fn fields_with_source_map(
385400
self,
386401
db: &dyn DefDatabase,

crates/hir-def/src/nameres.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ pub(crate) fn crate_local_def_map(db: &dyn DefDatabase, crate_id: Crate) -> DefM
427427

428428
#[salsa_macros::tracked(returns(ref))]
429429
pub fn block_def_map(db: &dyn DefDatabase, block_id: BlockId) -> DefMap {
430-
let BlockLoc { ast_id, module } = block_id.lookup(db);
430+
let BlockLoc { ast_id, module } = *block_id.lookup(db);
431431

432432
let visibility = Visibility::Module(module, VisibilityExplicitness::Implicit);
433433
let module_data =

crates/hir-def/src/nameres/assoc.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ impl TraitItems {
5050
db: &dyn DefDatabase,
5151
tr: TraitId,
5252
) -> (TraitItems, DefDiagnostics) {
53-
let ItemLoc { container: module_id, id: ast_id } = tr.lookup(db);
53+
let ItemLoc { container: module_id, id: ast_id } = *tr.lookup(db);
5454
let ast_id_map = db.ast_id_map(ast_id.file_id);
5555
let source = ast_id.with_value(ast_id_map.get(ast_id.value)).to_node(db);
5656
if source.eq_token().is_some() {
@@ -115,7 +115,7 @@ impl ImplItems {
115115
#[salsa::tracked(returns(ref))]
116116
pub fn of(db: &dyn DefDatabase, id: ImplId) -> (ImplItems, DefDiagnostics) {
117117
let _p = tracing::info_span!("impl_items_with_diagnostics_query").entered();
118-
let ItemLoc { container: module_id, id: ast_id } = id.lookup(db);
118+
let ItemLoc { container: module_id, id: ast_id } = *id.lookup(db);
119119

120120
let collector =
121121
AssocItemCollector::new(db, module_id, ItemContainerId::ImplId(id), ast_id.file_id);

crates/hir-def/src/nameres/collector.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1027,7 +1027,7 @@ impl<'db> DefCollector<'db> {
10271027
.enum_variants(self.db)
10281028
.variants
10291029
.iter()
1030-
.map(|&(variant, ref name, _)| {
1030+
.map(|(name, &(variant, _))| {
10311031
let res = PerNs::both(variant.into(), variant.into(), vis, None);
10321032
(Some(name.clone()), res)
10331033
})

crates/hir-def/src/nameres/path_resolution.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -519,12 +519,8 @@ impl DefMap {
519519
// enum variant
520520
cov_mark::hit!(can_import_enum_variant);
521521

522-
let res = e
523-
.enum_variants(db)
524-
.variants
525-
.iter()
526-
.find(|(_, name, _)| name == segment)
527-
.map(|&(variant, _, shape)| match shape {
522+
let res = e.enum_variants(db).variants.get(segment).map(|&(variant, shape)| {
523+
match shape {
528524
FieldsShape::Record => {
529525
PerNs::types(variant.into(), Visibility::Public, None)
530526
}
@@ -534,7 +530,8 @@ impl DefMap {
534530
Visibility::Public,
535531
None,
536532
),
537-
});
533+
}
534+
});
538535
// FIXME: Need to filter visibility here and below? Not sure.
539536
return match res {
540537
Some(res) => {

crates/hir-def/src/signatures.rs

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Item signature IR definitions
22
3-
use std::{cell::LazyCell, ops::Not as _};
3+
use std::cell::LazyCell;
44

55
use bitflags::bitflags;
66
use cfg::{CfgExpr, CfgOptions};
@@ -19,8 +19,9 @@ use thin_vec::ThinVec;
1919
use triomphe::Arc;
2020

2121
use crate::{
22-
ConstId, EnumId, EnumVariantId, EnumVariantLoc, ExternBlockId, FunctionId, HasModule, ImplId,
23-
ItemContainerId, ModuleId, StaticId, StructId, TraitId, TypeAliasId, UnionId, VariantId,
22+
ConstId, EnumId, EnumVariantId, EnumVariantLoc, ExternBlockId, FunctionId, FxIndexMap,
23+
HasModule, ImplId, ItemContainerId, ModuleId, StaticId, StructId, TraitId, TypeAliasId,
24+
UnionId, VariantId,
2425
attrs::AttrFlags,
2526
db::DefDatabase,
2627
expr_store::{
@@ -1055,7 +1056,7 @@ pub struct InactiveEnumVariantCode {
10551056

10561057
#[derive(Debug, Clone, PartialEq, Eq)]
10571058
pub struct EnumVariants {
1058-
pub variants: Box<[(EnumVariantId, Name, FieldsShape)]>,
1059+
pub variants: FxIndexMap<Name, (EnumVariantId, FieldsShape)>,
10591060
}
10601061

10611062
#[salsa::tracked]
@@ -1064,30 +1065,31 @@ impl EnumVariants {
10641065
pub(crate) fn of(
10651066
db: &dyn DefDatabase,
10661067
e: EnumId,
1067-
) -> (EnumVariants, Option<ThinVec<InactiveEnumVariantCode>>) {
1068+
) -> (EnumVariants, ThinVec<InactiveEnumVariantCode>) {
10681069
let loc = e.lookup(db);
10691070
let source = loc.source(db);
10701071
let ast_id_map = db.ast_id_map(source.file_id);
10711072

10721073
let mut diagnostics = ThinVec::new();
10731074
let cfg_options = loc.container.krate(db).cfg_options(db);
1074-
let mut index = 0;
10751075
let Some(variants) = source.value.variant_list() else {
1076-
return (EnumVariants { variants: Box::default() }, None);
1076+
return (EnumVariants { variants: FxIndexMap::default() }, ThinVec::new());
10771077
};
1078-
let variants = variants
1078+
let mut variants = variants
10791079
.variants()
10801080
.filter_map(|variant| {
10811081
let ast_id = ast_id_map.ast_id(&variant);
10821082
match AttrFlags::is_cfg_enabled_for(&variant, cfg_options) {
10831083
Ok(()) => {
1084-
let enum_variant =
1085-
EnumVariantLoc { id: source.with_value(ast_id), parent: e, index }
1086-
.intern(db);
1087-
index += 1;
10881084
let name = as_name_opt(variant.name());
1085+
let enum_variant = EnumVariantLoc {
1086+
id: source.with_value(ast_id),
1087+
parent: e,
1088+
name: name.clone(),
1089+
}
1090+
.intern(db);
10891091
let shape = adt_shape(variant.kind());
1090-
Some((enum_variant, name, shape))
1092+
Some((name, (enum_variant, shape)))
10911093
}
10921094
Err(cfg) => {
10931095
diagnostics.push(InactiveEnumVariantCode {
@@ -1099,34 +1101,38 @@ impl EnumVariants {
10991101
}
11001102
}
11011103
})
1102-
.collect();
1104+
.collect::<FxIndexMap<_, _>>();
1105+
variants.shrink_to_fit();
1106+
diagnostics.shrink_to_fit();
11031107

1104-
(EnumVariants { variants }, diagnostics.is_empty().not().then_some(diagnostics))
1108+
(EnumVariants { variants }, diagnostics)
11051109
}
11061110
}
11071111

11081112
impl EnumVariants {
11091113
pub fn variant(&self, name: &Name) -> Option<EnumVariantId> {
1110-
self.variants.iter().find_map(|(v, n, _)| if n == name { Some(*v) } else { None })
1114+
self.variants.get(name).map(|&(id, _)| id)
11111115
}
11121116

11131117
pub fn variant_name_by_id(&self, variant_id: EnumVariantId) -> Option<Name> {
11141118
self.variants
11151119
.iter()
1116-
.find_map(|(id, name, _)| if *id == variant_id { Some(name.clone()) } else { None })
1120+
.find_map(|(name, (id, _))| if *id == variant_id { Some(name.clone()) } else { None })
11171121
}
11181122

11191123
// [Adopted from rustc](https://github.com/rust-lang/rust/blob/bd53aa3bf7a24a70d763182303bd75e5fc51a9af/compiler/rustc_middle/src/ty/adt.rs#L446-L448)
11201124
pub fn is_payload_free(&self, db: &dyn DefDatabase) -> bool {
1121-
self.variants.iter().all(|&(v, _, _)| {
1125+
self.variants.values().all(|&(v, shape)| {
11221126
// The condition check order is slightly modified from rustc
11231127
// to improve performance by early returning with relatively fast checks
1124-
let variant = v.fields(db);
1125-
if !variant.fields().is_empty() {
1126-
return false;
1127-
}
1128+
11281129
// The outer if condition is whether this variant has const ctor or not
1129-
if !matches!(variant.shape, FieldsShape::Unit) {
1130+
if !matches!(shape, FieldsShape::Unit) {
1131+
let variant = v.fields(db);
1132+
if !variant.fields().is_empty() {
1133+
return false;
1134+
}
1135+
11301136
let body = Body::of(db, v.into());
11311137
// A variant with explicit discriminant
11321138
if !matches!(body[body.root_expr()], crate::hir::Expr::Missing) {

0 commit comments

Comments
 (0)