Skip to content

Commit a0bb832

Browse files
authored
Merge pull request #20007 from Veykril/push-opqzsnwzwyvn
Idiomatic salsa use for enum variants query
2 parents d41b574 + 0d5fde2 commit a0bb832

33 files changed

+81
-77
lines changed

src/tools/rust-analyzer/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,9 @@ pulldown-cmark-to-cmark = "10.0.4"
134134
pulldown-cmark = { version = "0.9.6", default-features = false }
135135
rayon = "1.10.0"
136136
rowan = "=0.15.15"
137-
salsa = { version = "0.22.0", default-features = false, features = ["rayon","salsa_unstable"] }
137+
# Ideally we'd not enable the macros feature but unfortunately the `tracked` attribute does not work
138+
# on impls without it
139+
salsa = { version = "0.22.0", default-features = true, features = ["rayon","salsa_unstable", "macros"] }
138140
salsa-macros = "0.22.0"
139141
semver = "1.0.26"
140142
serde = { version = "1.0.219" }

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

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use hir_expand::{
88
use intern::{Symbol, sym};
99
use la_arena::ArenaMap;
1010
use syntax::{AstPtr, ast};
11-
use thin_vec::ThinVec;
1211
use triomphe::Arc;
1312

1413
use crate::{
@@ -32,9 +31,9 @@ use crate::{
3231
diagnostics::DefDiagnostics,
3332
},
3433
signatures::{
35-
ConstSignature, EnumSignature, EnumVariants, FunctionSignature, ImplSignature,
36-
InactiveEnumVariantCode, StaticSignature, StructSignature, TraitAliasSignature,
37-
TraitSignature, TypeAliasSignature, UnionSignature, VariantFields,
34+
ConstSignature, EnumSignature, FunctionSignature, ImplSignature, StaticSignature,
35+
StructSignature, TraitAliasSignature, TraitSignature, TypeAliasSignature, UnionSignature,
36+
VariantFields,
3837
},
3938
tt,
4039
visibility::{self, Visibility},
@@ -121,19 +120,6 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
121120
id: VariantId,
122121
) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>);
123122

124-
// FIXME: Should we make this transparent? The only unstable thing in `enum_variants_with_diagnostics()`
125-
// is ast ids, and ast ids are pretty stable now.
126-
#[salsa::tracked]
127-
fn enum_variants(&self, id: EnumId) -> Arc<EnumVariants> {
128-
self.enum_variants_with_diagnostics(id).0
129-
}
130-
131-
#[salsa::invoke(EnumVariants::enum_variants_query)]
132-
fn enum_variants_with_diagnostics(
133-
&self,
134-
id: EnumId,
135-
) -> (Arc<EnumVariants>, Option<Arc<ThinVec<InactiveEnumVariantCode>>>);
136-
137123
#[salsa::transparent]
138124
#[salsa::invoke(ImplItems::impl_items_query)]
139125
fn impl_items(&self, e: ImplId) -> Arc<ImplItems>;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ fn find_path_inner(ctx: &FindPathCtx<'_>, item: ItemInNs, max_len: usize) -> Opt
137137
let loc = variant.lookup(ctx.db);
138138
if let Some(mut path) = find_path_inner(ctx, ItemInNs::Types(loc.parent.into()), max_len) {
139139
path.push_segment(
140-
ctx.db.enum_variants(loc.parent).variants[loc.index as usize].1.clone(),
140+
loc.parent.enum_variants(ctx.db).variants[loc.index as usize].1.clone(),
141141
);
142142
return Some(path);
143143
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> Option<Box<LangIt
125125
}
126126
ModuleDefId::AdtId(AdtId::EnumId(e)) => {
127127
lang_items.collect_lang_item(db, e, LangItemTarget::EnumId);
128-
db.enum_variants(e).variants.iter().for_each(|&(id, _, _)| {
128+
e.enum_variants(db).variants.iter().for_each(|&(id, _, _)| {
129129
lang_items.collect_lang_item(db, id, LangItemTarget::EnumVariant);
130130
});
131131
}

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ pub mod visibility;
5151

5252
use intern::{Interned, sym};
5353
pub use rustc_abi as layout;
54+
use thin_vec::ThinVec;
5455
use triomphe::Arc;
5556

5657
pub use crate::signatures::LocalFieldId;
@@ -88,7 +89,7 @@ use crate::{
8889
db::DefDatabase,
8990
hir::generics::{LocalLifetimeParamId, LocalTypeOrConstParamId},
9091
nameres::{LocalDefMap, block_def_map, crate_def_map, crate_local_def_map},
91-
signatures::VariantFields,
92+
signatures::{EnumVariants, InactiveEnumVariantCode, VariantFields},
9293
};
9394

9495
type FxIndexMap<K, V> = indexmap::IndexMap<K, V, rustc_hash::FxBuildHasher>;
@@ -253,6 +254,21 @@ impl_intern!(UnionId, UnionLoc, intern_union, lookup_intern_union);
253254
pub type EnumLoc = ItemLoc<ast::Enum>;
254255
impl_intern!(EnumId, EnumLoc, intern_enum, lookup_intern_enum);
255256

257+
impl EnumId {
258+
#[inline]
259+
pub fn enum_variants(self, db: &dyn DefDatabase) -> &EnumVariants {
260+
&self.enum_variants_with_diagnostics(db).0
261+
}
262+
263+
#[inline]
264+
pub fn enum_variants_with_diagnostics(
265+
self,
266+
db: &dyn DefDatabase,
267+
) -> &(EnumVariants, Option<ThinVec<InactiveEnumVariantCode>>) {
268+
EnumVariants::of(db, self)
269+
}
270+
}
271+
256272
type ConstLoc = AssocItemLoc<ast::Const>;
257273
impl_intern!(ConstId, ConstLoc, intern_const, lookup_intern_const);
258274

src/tools/rust-analyzer/crates/hir-def/src/nameres/collector.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -995,9 +995,8 @@ impl<'db> DefCollector<'db> {
995995
Some(ModuleDefId::AdtId(AdtId::EnumId(e))) => {
996996
cov_mark::hit!(glob_enum);
997997
// glob import from enum => just import all the variants
998-
let resolutions = self
999-
.db
1000-
.enum_variants(e)
998+
let resolutions = e
999+
.enum_variants(self.db)
10011000
.variants
10021001
.iter()
10031002
.map(|&(variant, ref name, _)| {

src/tools/rust-analyzer/crates/hir-def/src/nameres/path_resolution.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -528,8 +528,8 @@ impl DefMap {
528528
// enum variant
529529
cov_mark::hit!(can_import_enum_variant);
530530

531-
let res = db
532-
.enum_variants(e)
531+
let res = e
532+
.enum_variants(db)
533533
.variants
534534
.iter()
535535
.find(|(_, name, _)| name == segment)

src/tools/rust-analyzer/crates/hir-def/src/nameres/tests/incremental.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,7 @@ fn no() {}
172172
"ast_id_map_shim",
173173
"parse_shim",
174174
"real_span_map_shim",
175-
"enum_variants_shim",
176-
"enum_variants_with_diagnostics_shim",
175+
"of_",
177176
]
178177
"#]],
179178
expect![[r#"
@@ -182,7 +181,7 @@ fn no() {}
182181
"ast_id_map_shim",
183182
"file_item_tree_query",
184183
"real_span_map_shim",
185-
"enum_variants_with_diagnostics_shim",
184+
"of_",
186185
]
187186
"#]],
188187
);

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -884,11 +884,13 @@ pub struct EnumVariants {
884884
pub variants: Box<[(EnumVariantId, Name, FieldsShape)]>,
885885
}
886886

887+
#[salsa::tracked]
887888
impl EnumVariants {
888-
pub(crate) fn enum_variants_query(
889+
#[salsa::tracked(returns(ref))]
890+
pub(crate) fn of(
889891
db: &dyn DefDatabase,
890892
e: EnumId,
891-
) -> (Arc<EnumVariants>, Option<Arc<ThinVec<InactiveEnumVariantCode>>>) {
893+
) -> (EnumVariants, Option<ThinVec<InactiveEnumVariantCode>>) {
892894
let loc = e.lookup(db);
893895
let source = loc.source(db);
894896
let ast_id_map = db.ast_id_map(source.file_id);
@@ -898,7 +900,7 @@ impl EnumVariants {
898900
let cfg_options = loc.container.krate.cfg_options(db);
899901
let mut index = 0;
900902
let Some(variants) = source.value.variant_list() else {
901-
return (Arc::new(EnumVariants { variants: Box::default() }), None);
903+
return (EnumVariants { variants: Box::default() }, None);
902904
};
903905
let variants = variants
904906
.variants()
@@ -926,12 +928,11 @@ impl EnumVariants {
926928
})
927929
.collect();
928930

929-
(
930-
Arc::new(EnumVariants { variants }),
931-
diagnostics.is_empty().not().then(|| Arc::new(diagnostics)),
932-
)
931+
(EnumVariants { variants }, diagnostics.is_empty().not().then_some(diagnostics))
933932
}
933+
}
934934

935+
impl EnumVariants {
935936
pub fn variant(&self, name: &Name) -> Option<EnumVariantId> {
936937
self.variants.iter().find_map(|(v, n, _)| if n == name { Some(*v) } else { None })
937938
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -823,8 +823,8 @@ pub(crate) fn adt_datum_query(
823823
(rust_ir::AdtKind::Struct, vec![variant_id_to_fields(id.into())])
824824
}
825825
hir_def::AdtId::EnumId(id) => {
826-
let variants = db
827-
.enum_variants(id)
826+
let variants = id
827+
.enum_variants(db)
828828
.variants
829829
.iter()
830830
.map(|&(variant_id, _, _)| variant_id_to_fields(variant_id.into()))

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ pub(crate) fn const_eval_discriminant_variant(
286286
let value = match prev_idx {
287287
Some(prev_idx) => {
288288
1 + db.const_eval_discriminant(
289-
db.enum_variants(loc.parent).variants[prev_idx as usize].0,
289+
loc.parent.enum_variants(db).variants[prev_idx as usize].0,
290290
)?
291291
}
292292
_ => 0,

src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/decl_check.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ impl<'a> DeclValidator<'a> {
395395

396396
/// Check incorrect names for enum variants.
397397
fn validate_enum_variants(&mut self, enum_id: EnumId) {
398-
let data = self.db.enum_variants(enum_id);
398+
let data = enum_id.enum_variants(self.db);
399399

400400
for (variant_id, _, _) in data.variants.iter() {
401401
self.validate_enum_variant_fields(*variant_id);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ fn missing_match_arms<'p>(
642642
}
643643

644644
let non_empty_enum = match scrut_ty.as_adt() {
645-
Some((AdtId::EnumId(e), _)) => !cx.db.enum_variants(e).variants.is_empty(),
645+
Some((AdtId::EnumId(e), _)) => !e.enum_variants(cx.db).variants.is_empty(),
646646
_ => false,
647647
};
648648
let display_target = DisplayTarget::from_crate(cx.db, krate);

src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/match_check.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ impl HirDisplay for Pat {
328328
write!(
329329
f,
330330
"{}",
331-
f.db.enum_variants(loc.parent).variants[loc.index as usize]
331+
loc.parent.enum_variants(f.db).variants[loc.index as usize]
332332
.1
333333
.display(f.db, f.edition())
334334
)?;

src/tools/rust-analyzer/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ impl EnumVariantContiguousIndex {
5050
}
5151

5252
fn to_enum_variant_id(self, db: &dyn HirDatabase, eid: EnumId) -> EnumVariantId {
53-
db.enum_variants(eid).variants[self.0].0
53+
eid.enum_variants(db).variants[self.0].0
5454
}
5555
}
5656

@@ -458,7 +458,7 @@ impl PatCx for MatchCheckCtx<'_> {
458458
TyKind::Scalar(Scalar::Int(..) | Scalar::Uint(..)) => unhandled(),
459459
TyKind::Array(..) | TyKind::Slice(..) => unhandled(),
460460
&TyKind::Adt(AdtId(adt @ hir_def::AdtId::EnumId(enum_id)), ref subst) => {
461-
let enum_data = cx.db.enum_variants(enum_id);
461+
let enum_data = enum_id.enum_variants(cx.db);
462462
let is_declared_nonexhaustive = cx.is_foreign_non_exhaustive(adt);
463463

464464
if enum_data.variants.is_empty() && !is_declared_nonexhaustive {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,7 @@ fn render_const_scalar(
914914
write!(
915915
f,
916916
"{}",
917-
f.db.enum_variants(loc.parent).variants[loc.index as usize]
917+
loc.parent.enum_variants(f.db).variants[loc.index as usize]
918918
.1
919919
.display(f.db, f.edition())
920920
)?;
@@ -1208,7 +1208,7 @@ impl HirDisplay for Ty {
12081208
write!(
12091209
f,
12101210
"{}",
1211-
db.enum_variants(loc.parent).variants[loc.index as usize]
1211+
loc.parent.enum_variants(db).variants[loc.index as usize]
12121212
.1
12131213
.display(db, f.edition())
12141214
)?

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ pub(crate) fn has_drop_glue(db: &dyn HirDatabase, ty: Ty, env: Arc<TraitEnvironm
6767
}
6868
// Unions cannot have fields with destructors.
6969
AdtId::UnionId(_) => DropGlue::None,
70-
AdtId::EnumId(id) => db
71-
.enum_variants(id)
70+
AdtId::EnumId(id) => id
71+
.enum_variants(db)
7272
.variants
7373
.iter()
7474
.map(|&(variant, _, _)| {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1673,7 +1673,7 @@ impl<'db> InferenceContext<'db> {
16731673
// If we can resolve to an enum variant, it takes priority over associated type
16741674
// of the same name.
16751675
if let Some((AdtId::EnumId(id), _)) = ty.as_adt() {
1676-
let enum_data = self.db.enum_variants(id);
1676+
let enum_data = id.enum_variants(self.db);
16771677
if let Some(variant) = enum_data.variant(current_segment.name) {
16781678
return if remaining_segments.len() == 1 {
16791679
(ty, Some(variant.into()))
@@ -1792,7 +1792,7 @@ impl<'db> InferenceContext<'db> {
17921792
let segment = path.segments().last().unwrap();
17931793
// this could be an enum variant or associated type
17941794
if let Some((AdtId::EnumId(enum_id), _)) = ty.as_adt() {
1795-
let enum_data = self.db.enum_variants(enum_id);
1795+
let enum_data = enum_id.enum_variants(self.db);
17961796
if let Some(variant) = enum_data.variant(segment) {
17971797
return (ty, Some(variant.into()));
17981798
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ impl CastTy {
4343
let (AdtId::EnumId(id), _) = t.as_adt()? else {
4444
return None;
4545
};
46-
let enum_data = table.db.enum_variants(id);
46+
let enum_data = id.enum_variants(table.db);
4747
if enum_data.is_payload_free(table.db) { Some(Self::Int(Int::CEnum)) } else { None }
4848
}
4949
TyKind::Raw(m, ty) => Some(Self::Ptr(ty.clone(), *m)),

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1360,7 +1360,7 @@ impl InferenceContext<'_> {
13601360
if let Some(variant) = self.result.variant_resolution_for_pat(p) {
13611361
let adt = variant.adt_id(self.db);
13621362
let is_multivariant = match adt {
1363-
hir_def::AdtId::EnumId(e) => self.db.enum_variants(e).variants.len() != 1,
1363+
hir_def::AdtId::EnumId(e) => e.enum_variants(self.db).variants.len() != 1,
13641364
_ => false,
13651365
};
13661366
if is_multivariant {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ impl InferenceContext<'_> {
397397
Some((AdtId::EnumId(e), subst)) => (e, subst),
398398
_ => return None,
399399
};
400-
let enum_data = self.db.enum_variants(enum_id);
400+
let enum_data = enum_id.enum_variants(self.db);
401401
let variant = enum_data.variant(name)?;
402402
self.write_variant_resolution(id, variant.into());
403403
Some((ValueNs::EnumVariantId(variant), subst.clone()))

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ impl UninhabitedFrom<'_> {
113113
AdtId::UnionId(_) => CONTINUE_OPAQUELY_INHABITED,
114114
AdtId::StructId(s) => self.visit_variant(s.into(), subst),
115115
AdtId::EnumId(e) => {
116-
let enum_data = self.db.enum_variants(e);
116+
let enum_data = e.enum_variants(self.db);
117117

118118
for &(variant, _, _) in enum_data.variants.iter() {
119119
let variant_inhabitedness = self.visit_variant(variant.into(), subst);

src/tools/rust-analyzer/crates/hir-ty/src/layout/adt.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub fn layout_of_adt_query(
5656
(r, data.repr.unwrap_or_default(), false)
5757
}
5858
AdtId::EnumId(e) => {
59-
let variants = db.enum_variants(e);
59+
let variants = e.enum_variants(db);
6060
let r = variants
6161
.variants
6262
.iter()
@@ -82,7 +82,7 @@ pub fn layout_of_adt_query(
8282
|min, max| repr_discr(dl, &repr, min, max).unwrap_or((Integer::I8, false)),
8383
variants.iter_enumerated().filter_map(|(id, _)| {
8484
let AdtId::EnumId(e) = def else { return None };
85-
let d = db.const_eval_discriminant(db.enum_variants(e).variants[id.0].0).ok()?;
85+
let d = db.const_eval_discriminant(e.enum_variants(db).variants[id.0].0).ok()?;
8686
Some((id, d))
8787
}),
8888
// FIXME: The current code for niche-filling relies on variant indices

src/tools/rust-analyzer/crates/hir-ty/src/mir/eval.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1631,7 +1631,7 @@ impl Evaluator<'_> {
16311631
Variants::Empty => unreachable!(),
16321632
Variants::Single { index } => {
16331633
let r =
1634-
self.const_eval_discriminant(self.db.enum_variants(e).variants[index.0].0)?;
1634+
self.const_eval_discriminant(e.enum_variants(self.db).variants[index.0].0)?;
16351635
Ok(r)
16361636
}
16371637
Variants::Multiple { tag, tag_encoding, variants, .. } => {
@@ -1656,7 +1656,7 @@ impl Evaluator<'_> {
16561656
.unwrap_or(*untagged_variant)
16571657
.0;
16581658
let result =
1659-
self.const_eval_discriminant(self.db.enum_variants(e).variants[idx].0)?;
1659+
self.const_eval_discriminant(e.enum_variants(self.db).variants[idx].0)?;
16601660
Ok(result)
16611661
}
16621662
}
@@ -2775,8 +2775,8 @@ impl Evaluator<'_> {
27752775
let name = format!(
27762776
"{}::{}",
27772777
self.db.enum_signature(loc.parent).name.display(db, edition),
2778-
self.db
2779-
.enum_variants(loc.parent)
2778+
loc.parent
2779+
.enum_variants(self.db)
27802780
.variant_name_by_id(variant)
27812781
.unwrap()
27822782
.display(db, edition),

0 commit comments

Comments
 (0)