Skip to content

Commit 0d5fde2

Browse files
committed
Idiomatic salsa use for enum variants query
1 parent 535b974 commit 0d5fde2

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()))

0 commit comments

Comments
 (0)