Skip to content

Commit bad1c63

Browse files
authored
Merge pull request #20008 from Veykril/push-rsnkrwyplmwr
More idiomatic salsa use
2 parents a0bb832 + 8c9c8ad commit bad1c63

File tree

18 files changed

+120
-137
lines changed

18 files changed

+120
-137
lines changed

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

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@ use hir_expand::{
55
EditionedFileId, HirFileId, InFile, Lookup, MacroCallId, MacroDefId, MacroDefKind,
66
db::ExpandDatabase,
77
};
8-
use intern::{Symbol, sym};
8+
use intern::sym;
99
use la_arena::ArenaMap;
1010
use syntax::{AstPtr, ast};
1111
use triomphe::Arc;
1212

1313
use crate::{
14-
AttrDefId, ConstId, ConstLoc, DefWithBodyId, EnumId, EnumLoc, EnumVariantId, EnumVariantLoc,
15-
ExternBlockId, ExternBlockLoc, ExternCrateId, ExternCrateLoc, FunctionId, FunctionLoc,
16-
GenericDefId, ImplId, ImplLoc, LocalFieldId, Macro2Id, Macro2Loc, MacroExpander, MacroId,
17-
MacroRulesId, MacroRulesLoc, MacroRulesLocFlags, ProcMacroId, ProcMacroLoc, StaticId,
14+
AssocItemId, AttrDefId, ConstId, ConstLoc, DefWithBodyId, EnumId, EnumLoc, EnumVariantId,
15+
EnumVariantLoc, ExternBlockId, ExternBlockLoc, ExternCrateId, ExternCrateLoc, FunctionId,
16+
FunctionLoc, GenericDefId, ImplId, ImplLoc, LocalFieldId, Macro2Id, Macro2Loc, MacroExpander,
17+
MacroId, MacroRulesId, MacroRulesLoc, MacroRulesLocFlags, ProcMacroId, ProcMacroLoc, StaticId,
1818
StaticLoc, StructId, StructLoc, TraitAliasId, TraitAliasLoc, TraitId, TraitLoc, TypeAliasId,
1919
TypeAliasLoc, UnionId, UnionLoc, UseId, UseLoc, VariantId,
2020
attr::{Attrs, AttrsWithOwner},
@@ -25,11 +25,7 @@ use crate::{
2525
import_map::ImportMap,
2626
item_tree::{ItemTree, file_item_tree_query},
2727
lang_item::{self, LangItem},
28-
nameres::{
29-
assoc::{ImplItems, TraitItems},
30-
crate_def_map,
31-
diagnostics::DefDiagnostics,
32-
},
28+
nameres::{assoc::TraitItems, crate_def_map, diagnostics::DefDiagnostics},
3329
signatures::{
3430
ConstSignature, EnumSignature, FunctionSignature, ImplSignature, StaticSignature,
3531
StructSignature, TraitAliasSignature, TraitSignature, TypeAliasSignature, UnionSignature,
@@ -120,13 +116,6 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
120116
id: VariantId,
121117
) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>);
122118

123-
#[salsa::transparent]
124-
#[salsa::invoke(ImplItems::impl_items_query)]
125-
fn impl_items(&self, e: ImplId) -> Arc<ImplItems>;
126-
127-
#[salsa::invoke(ImplItems::impl_items_with_diagnostics_query)]
128-
fn impl_items_with_diagnostics(&self, e: ImplId) -> (Arc<ImplItems>, DefDiagnostics);
129-
130119
#[salsa::transparent]
131120
#[salsa::invoke(TraitItems::trait_items_query)]
132121
fn trait_items(&self, e: TraitId) -> Arc<TraitItems>;
@@ -249,9 +238,6 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
249238
e: TypeAliasId,
250239
) -> (Arc<TypeAliasSignature>, Arc<ExpressionStoreSourceMap>);
251240

252-
#[salsa::invoke(crate::signatures::extern_block_abi_query)]
253-
fn extern_block_abi(&self, extern_block: ExternBlockId) -> Option<Symbol>;
254-
255241
// endregion:data
256242

257243
#[salsa::invoke(Body::body_with_source_map_query)]
@@ -312,16 +298,8 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
312298
#[salsa::invoke(visibility::field_visibilities_query)]
313299
fn field_visibilities(&self, var: VariantId) -> Arc<ArenaMap<LocalFieldId, Visibility>>;
314300

315-
// FIXME: unify function_visibility and const_visibility?
316-
317-
#[salsa::invoke(visibility::function_visibility_query)]
318-
fn function_visibility(&self, def: FunctionId) -> Visibility;
319-
320-
#[salsa::invoke(visibility::const_visibility_query)]
321-
fn const_visibility(&self, def: ConstId) -> Visibility;
322-
323-
#[salsa::invoke(visibility::type_alias_visibility_query)]
324-
fn type_alias_visibility(&self, def: TypeAliasId) -> Visibility;
301+
#[salsa::invoke(visibility::assoc_visibility_query)]
302+
fn assoc_visibility(&self, def: AssocItemId) -> Visibility;
325303

326304
// endregion:visibilities
327305

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
@@ -96,7 +96,7 @@ pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> Option<Box<LangIt
9696
for (_, module_data) in crate_def_map.modules() {
9797
for impl_def in module_data.scope.impls() {
9898
lang_items.collect_lang_item(db, impl_def, LangItemTarget::ImplDef);
99-
for &(_, assoc) in db.impl_items(impl_def).items.iter() {
99+
for &(_, assoc) in impl_def.impl_items(db).items.iter() {
100100
match assoc {
101101
AssocItemId::FunctionId(f) => {
102102
lang_items.collect_lang_item(db, f, LangItemTarget::Function)

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

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ pub mod find_path;
4949
pub mod import_map;
5050
pub mod visibility;
5151

52-
use intern::{Interned, sym};
52+
use intern::{Interned, Symbol, sym};
5353
pub use rustc_abi as layout;
5454
use thin_vec::ThinVec;
5555
use triomphe::Arc;
@@ -88,7 +88,10 @@ use crate::{
8888
builtin_type::BuiltinType,
8989
db::DefDatabase,
9090
hir::generics::{LocalLifetimeParamId, LocalTypeOrConstParamId},
91-
nameres::{LocalDefMap, block_def_map, crate_def_map, crate_local_def_map},
91+
nameres::{
92+
LocalDefMap, assoc::ImplItems, block_def_map, crate_def_map, crate_local_def_map,
93+
diagnostics::DefDiagnostics,
94+
},
9295
signatures::{EnumVariants, InactiveEnumVariantCode, VariantFields},
9396
};
9497

@@ -287,6 +290,18 @@ impl_intern!(TypeAliasId, TypeAliasLoc, intern_type_alias, lookup_intern_type_al
287290
type ImplLoc = ItemLoc<ast::Impl>;
288291
impl_intern!(ImplId, ImplLoc, intern_impl, lookup_intern_impl);
289292

293+
impl ImplId {
294+
#[inline]
295+
pub fn impl_items(self, db: &dyn DefDatabase) -> &ImplItems {
296+
&self.impl_items_with_diagnostics(db).0
297+
}
298+
299+
#[inline]
300+
pub fn impl_items_with_diagnostics(self, db: &dyn DefDatabase) -> &(ImplItems, DefDiagnostics) {
301+
ImplItems::of(db, self)
302+
}
303+
}
304+
290305
type UseLoc = ItemLoc<ast::Use>;
291306
impl_intern!(UseId, UseLoc, intern_use, lookup_intern_use);
292307

@@ -296,6 +311,14 @@ impl_intern!(ExternCrateId, ExternCrateLoc, intern_extern_crate, lookup_intern_e
296311
type ExternBlockLoc = ItemLoc<ast::ExternBlock>;
297312
impl_intern!(ExternBlockId, ExternBlockLoc, intern_extern_block, lookup_intern_extern_block);
298313

314+
#[salsa::tracked]
315+
impl ExternBlockId {
316+
#[salsa::tracked]
317+
pub fn abi(self, db: &dyn DefDatabase) -> Option<Symbol> {
318+
signatures::extern_block_abi(db, self)
319+
}
320+
}
321+
299322
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
300323
pub struct EnumVariantLoc {
301324
pub id: AstId<ast::Variant>,
@@ -770,7 +793,7 @@ impl DefWithBodyId {
770793
}
771794
}
772795

773-
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
796+
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, salsa_macros::Supertype)]
774797
pub enum AssocItemId {
775798
FunctionId(FunctionId),
776799
ConstId(ConstId),

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ use std::ops::Deref;
6262

6363
use base_db::Crate;
6464
use hir_expand::{
65-
EditionedFileId, ErasedAstId, HirFileId, InFile, MacroCallId, MacroDefId, mod_path::ModPath,
66-
name::Name, proc_macro::ProcMacroKind,
65+
EditionedFileId, ErasedAstId, HirFileId, InFile, MacroCallId, mod_path::ModPath, name::Name,
66+
proc_macro::ProcMacroKind,
6767
};
6868
use intern::Symbol;
6969
use itertools::Itertools;
@@ -189,7 +189,7 @@ pub struct DefMap {
189189
#[derive(Clone, Debug, PartialEq, Eq)]
190190
struct DefMapCrateData {
191191
/// Side table for resolving derive helpers.
192-
exported_derives: FxHashMap<MacroDefId, Box<[Name]>>,
192+
exported_derives: FxHashMap<MacroId, Box<[Name]>>,
193193
fn_proc_macro_mapping: FxHashMap<FunctionId, ProcMacroId>,
194194

195195
/// Custom attributes registered with `#![register_attr]`.

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

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,10 @@ pub struct ImplItems {
100100
pub macro_calls: ThinVec<(AstId<ast::Item>, MacroCallId)>,
101101
}
102102

103+
#[salsa::tracked]
103104
impl ImplItems {
104-
#[inline]
105-
pub(crate) fn impl_items_query(db: &dyn DefDatabase, id: ImplId) -> Arc<ImplItems> {
106-
db.impl_items_with_diagnostics(id).0
107-
}
108-
109-
pub(crate) fn impl_items_with_diagnostics_query(
110-
db: &dyn DefDatabase,
111-
id: ImplId,
112-
) -> (Arc<ImplItems>, DefDiagnostics) {
105+
#[salsa::tracked(returns(ref))]
106+
pub fn of(db: &dyn DefDatabase, id: ImplId) -> (ImplItems, DefDiagnostics) {
113107
let _p = tracing::info_span!("impl_items_with_diagnostics_query").entered();
114108
let ItemLoc { container: module_id, id: ast_id } = id.lookup(db);
115109

@@ -118,9 +112,11 @@ impl ImplItems {
118112
let source = ast_id.with_value(collector.ast_id_map.get(ast_id.value)).to_node(db);
119113
let (items, macro_calls, diagnostics) = collector.collect(source.assoc_item_list());
120114

121-
(Arc::new(ImplItems { items, macro_calls }), DefDiagnostics::new(diagnostics))
115+
(ImplItems { items, macro_calls }, DefDiagnostics::new(diagnostics))
122116
}
117+
}
123118

119+
impl ImplItems {
124120
pub fn macro_calls(&self) -> impl Iterator<Item = (AstId<ast::Item>, MacroCallId)> + '_ {
125121
self.macro_calls.iter().copied()
126122
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ impl<'db> DefCollector<'db> {
609609
self.define_proc_macro(def.name.clone(), proc_macro_id);
610610
let crate_data = Arc::get_mut(&mut self.def_map.data).unwrap();
611611
if let ProcMacroKind::Derive { helpers } = def.kind {
612-
crate_data.exported_derives.insert(self.db.macro_def(proc_macro_id.into()), helpers);
612+
crate_data.exported_derives.insert(proc_macro_id.into(), helpers);
613613
}
614614
crate_data.fn_proc_macro_mapping.insert(fn_id, proc_macro_id);
615615
}
@@ -1345,7 +1345,7 @@ impl<'db> DefCollector<'db> {
13451345
// Record its helper attributes.
13461346
if def_id.krate != self.def_map.krate {
13471347
let def_map = crate_def_map(self.db, def_id.krate);
1348-
if let Some(helpers) = def_map.data.exported_derives.get(&def_id) {
1348+
if let Some(helpers) = def_map.data.exported_derives.get(&macro_id) {
13491349
self.def_map
13501350
.derive_helpers_in_scope
13511351
.entry(ast_id.ast_id.map(|it| it.upcast()))
@@ -2425,7 +2425,7 @@ impl ModCollector<'_, '_> {
24252425
Arc::get_mut(&mut self.def_collector.def_map.data)
24262426
.unwrap()
24272427
.exported_derives
2428-
.insert(self.def_collector.db.macro_def(macro_id.into()), helpers);
2428+
.insert(macro_id.into(), helpers);
24292429
}
24302430
}
24312431
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,6 @@ pub struct S {}
431431
"parse_shim",
432432
"real_span_map_shim",
433433
"macro_def_shim",
434-
"macro_def_shim",
435434
"file_item_tree_query",
436435
"ast_id_map_shim",
437436
"parse_macro_expansion_shim",

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -965,7 +965,7 @@ impl EnumVariants {
965965
}
966966
}
967967

968-
pub(crate) fn extern_block_abi_query(
968+
pub(crate) fn extern_block_abi(
969969
db: &dyn DefDatabase,
970970
extern_block: ExternBlockId,
971971
) -> Option<Symbol> {

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

Lines changed: 38 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,8 @@ use syntax::ast::{self, HasVisibility};
88
use triomphe::Arc;
99

1010
use crate::{
11-
ConstId, FunctionId, HasModule, ItemContainerId, LocalFieldId, LocalModuleId, ModuleId,
12-
TraitId, TypeAliasId, VariantId,
13-
db::DefDatabase,
14-
nameres::DefMap,
15-
resolver::{HasResolver, Resolver},
16-
src::HasSource,
11+
AssocItemId, HasModule, ItemContainerId, LocalFieldId, LocalModuleId, ModuleId, TraitId,
12+
VariantId, db::DefDatabase, nameres::DefMap, resolver::HasResolver, src::HasSource,
1713
};
1814

1915
pub use crate::item_tree::{RawVisibility, VisibilityExplicitness};
@@ -225,63 +221,56 @@ pub(crate) fn field_visibilities_query(
225221

226222
pub fn visibility_from_ast(
227223
db: &dyn DefDatabase,
228-
resolver: &Resolver<'_>,
224+
has_resolver: impl HasResolver,
229225
ast_vis: InFile<Option<ast::Visibility>>,
230226
) -> Visibility {
231227
let mut span_map = None;
232228
let raw_vis = crate::item_tree::visibility_from_ast(db, ast_vis.value, &mut |range| {
233229
span_map.get_or_insert_with(|| db.span_map(ast_vis.file_id)).span_for_range(range).ctx
234230
});
235-
Visibility::resolve(db, resolver, &raw_vis)
236-
}
237-
238-
fn trait_item_visibility(
239-
db: &dyn DefDatabase,
240-
resolver: &Resolver<'_>,
241-
container: ItemContainerId,
242-
) -> Option<Visibility> {
243-
match container {
244-
ItemContainerId::TraitId(trait_) => Some(trait_visibility(db, resolver, trait_)),
245-
_ => None,
231+
if raw_vis == RawVisibility::Public {
232+
return Visibility::Public;
246233
}
247-
}
248234

249-
/// Resolve visibility of a function.
250-
pub(crate) fn function_visibility_query(db: &dyn DefDatabase, def: FunctionId) -> Visibility {
251-
let loc = def.lookup(db);
252-
let resolver = def.resolver(db);
253-
trait_item_visibility(db, &resolver, loc.container).unwrap_or_else(|| {
254-
let source = loc.source(db);
255-
visibility_from_ast(db, &resolver, source.map(|src| src.visibility()))
256-
})
235+
Visibility::resolve(db, &has_resolver.resolver(db), &raw_vis)
257236
}
258237

259-
/// Resolve visibility of a const.
260-
pub(crate) fn const_visibility_query(db: &dyn DefDatabase, def: ConstId) -> Visibility {
261-
let loc = def.lookup(db);
262-
let resolver = def.resolver(db);
263-
trait_item_visibility(db, &resolver, loc.container).unwrap_or_else(|| {
264-
let source = loc.source(db);
265-
visibility_from_ast(db, &resolver, source.map(|src| src.visibility()))
266-
})
238+
/// Resolve visibility of a type alias.
239+
pub(crate) fn assoc_visibility_query(db: &dyn DefDatabase, def: AssocItemId) -> Visibility {
240+
match def {
241+
AssocItemId::FunctionId(function_id) => {
242+
let loc = function_id.lookup(db);
243+
trait_item_visibility(db, loc.container).unwrap_or_else(|| {
244+
let source = loc.source(db);
245+
visibility_from_ast(db, function_id, source.map(|src| src.visibility()))
246+
})
247+
}
248+
AssocItemId::ConstId(const_id) => {
249+
let loc = const_id.lookup(db);
250+
trait_item_visibility(db, loc.container).unwrap_or_else(|| {
251+
let source = loc.source(db);
252+
visibility_from_ast(db, const_id, source.map(|src| src.visibility()))
253+
})
254+
}
255+
AssocItemId::TypeAliasId(type_alias_id) => {
256+
let loc = type_alias_id.lookup(db);
257+
trait_item_visibility(db, loc.container).unwrap_or_else(|| {
258+
let source = loc.source(db);
259+
visibility_from_ast(db, type_alias_id, source.map(|src| src.visibility()))
260+
})
261+
}
262+
}
267263
}
268264

269-
/// Resolve visibility of a type alias.
270-
pub(crate) fn type_alias_visibility_query(db: &dyn DefDatabase, def: TypeAliasId) -> Visibility {
271-
let loc = def.lookup(db);
272-
let resolver = def.resolver(db);
273-
trait_item_visibility(db, &resolver, loc.container).unwrap_or_else(|| {
274-
let source = loc.source(db);
275-
visibility_from_ast(db, &resolver, source.map(|src| src.visibility()))
276-
})
265+
fn trait_item_visibility(db: &dyn DefDatabase, container: ItemContainerId) -> Option<Visibility> {
266+
match container {
267+
ItemContainerId::TraitId(trait_) => Some(trait_visibility(db, trait_)),
268+
_ => None,
269+
}
277270
}
278271

279-
pub(crate) fn trait_visibility(
280-
db: &dyn DefDatabase,
281-
resolver: &Resolver<'_>,
282-
def: TraitId,
283-
) -> Visibility {
272+
fn trait_visibility(db: &dyn DefDatabase, def: TraitId) -> Visibility {
284273
let loc = def.lookup(db);
285274
let source = loc.source(db);
286-
visibility_from_ast(db, resolver, source.map(|src| src.visibility()))
275+
visibility_from_ast(db, def, source.map(|src| src.visibility()))
287276
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ impl chalk_solve::RustIrDatabase<Interner> for ChalkContext<'_> {
6363
) -> Option<rust_ir::AssociatedTyValueId<Interner>> {
6464
let alias_id = from_assoc_type_id(assoc_type_id);
6565
let trait_sig = self.db.type_alias_signature(alias_id);
66-
self.db.impl_items(hir_def::ImplId::from_chalk(self.db, impl_id)).items.iter().find_map(
66+
hir_def::ImplId::from_chalk(self.db, impl_id).impl_items(self.db).items.iter().find_map(
6767
|(name, item)| match item {
6868
AssocItemId::TypeAliasId(alias) if &trait_sig.name == name => {
6969
Some(TypeAliasAsValue(*alias).to_chalk(self.db))
@@ -880,8 +880,8 @@ fn impl_def_datum(db: &dyn HirDatabase, krate: Crate, impl_id: hir_def::ImplId)
880880

881881
let impl_datum_bound = rust_ir::ImplDatumBound { trait_ref, where_clauses };
882882
let trait_data = db.trait_items(trait_);
883-
let associated_ty_value_ids = db
884-
.impl_items(impl_id)
883+
let associated_ty_value_ids = impl_id
884+
.impl_items(db)
885885
.items
886886
.iter()
887887
.filter_map(|(_, item)| match item {

0 commit comments

Comments
 (0)