Skip to content

Commit f25912c

Browse files
committed
De-arc trait items query
1 parent 70cbf83 commit f25912c

33 files changed

+110
-107
lines changed

crates/hir-def/src/db.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::{
2525
import_map::ImportMap,
2626
item_tree::{ItemTree, file_item_tree_query},
2727
lang_item::{self, LangItem},
28-
nameres::{assoc::TraitItems, crate_def_map, diagnostics::DefDiagnostics},
28+
nameres::crate_def_map,
2929
signatures::{
3030
ConstSignature, EnumSignature, FunctionSignature, ImplSignature, StaticSignature,
3131
StructSignature, TraitAliasSignature, TraitSignature, TypeAliasSignature, UnionSignature,
@@ -119,13 +119,6 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
119119
id: VariantId,
120120
) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>);
121121

122-
#[salsa::transparent]
123-
#[salsa::invoke(TraitItems::trait_items_query)]
124-
fn trait_items(&self, e: TraitId) -> Arc<TraitItems>;
125-
126-
#[salsa::invoke(TraitItems::trait_items_with_diagnostics_query)]
127-
fn trait_items_with_diagnostics(&self, tr: TraitId) -> (Arc<TraitItems>, DefDiagnostics);
128-
129122
#[salsa::tracked]
130123
fn variant_fields(&self, id: VariantId) -> Arc<VariantFields> {
131124
self.variant_fields_with_source_map(id).0

crates/hir-def/src/import_map.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::{
1616
AssocItemId, AttrDefId, Complete, FxIndexMap, ModuleDefId, ModuleId, TraitId,
1717
db::DefDatabase,
1818
item_scope::{ImportOrExternCrate, ItemInNs},
19-
nameres::{DefMap, crate_def_map},
19+
nameres::{DefMap, assoc::TraitItems, crate_def_map},
2020
visibility::Visibility,
2121
};
2222

@@ -221,7 +221,7 @@ impl ImportMap {
221221
trait_import_info: &ImportInfo,
222222
) {
223223
let _p = tracing::info_span!("collect_trait_assoc_items").entered();
224-
for &(ref assoc_item_name, item) in &db.trait_items(tr).items {
224+
for &(ref assoc_item_name, item) in &TraitItems::query(db, tr).items {
225225
let module_def_id = match item {
226226
AssocItemId::FunctionId(f) => ModuleDefId::from(f),
227227
AssocItemId::ConstId(c) => ModuleDefId::from(c),
@@ -482,7 +482,7 @@ mod tests {
482482
use expect_test::{Expect, expect};
483483
use test_fixture::WithFixture;
484484

485-
use crate::{ItemContainerId, Lookup, test_db::TestDB};
485+
use crate::{ItemContainerId, Lookup, nameres::assoc::TraitItems, test_db::TestDB};
486486

487487
use super::*;
488488

@@ -580,7 +580,7 @@ mod tests {
580580

581581
let trait_info = dependency_imports.import_info_for(ItemInNs::Types(trait_id.into()))?;
582582

583-
let trait_items = db.trait_items(trait_id);
583+
let trait_items = TraitItems::query(db, trait_id);
584584
let (assoc_item_name, _) = trait_items
585585
.items
586586
.iter()

crates/hir-def/src/lang_item.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ use triomphe::Arc;
99

1010
use crate::{
1111
AdtId, AssocItemId, AttrDefId, Crate, EnumId, EnumVariantId, FunctionId, ImplId, ModuleDefId,
12-
StaticId, StructId, TraitId, TypeAliasId, UnionId, db::DefDatabase, expr_store::path::Path,
13-
nameres::crate_def_map,
12+
StaticId, StructId, TraitId, TypeAliasId, UnionId,
13+
db::DefDatabase,
14+
expr_store::path::Path,
15+
nameres::{assoc::TraitItems, crate_def_map},
1416
};
1517

1618
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
@@ -113,14 +115,16 @@ pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> Option<Box<LangIt
113115
match def {
114116
ModuleDefId::TraitId(trait_) => {
115117
lang_items.collect_lang_item(db, trait_, LangItemTarget::Trait);
116-
db.trait_items(trait_).items.iter().for_each(|&(_, assoc_id)| match assoc_id {
117-
AssocItemId::FunctionId(f) => {
118-
lang_items.collect_lang_item(db, f, LangItemTarget::Function);
118+
TraitItems::query(db, trait_).items.iter().for_each(|&(_, assoc_id)| {
119+
match assoc_id {
120+
AssocItemId::FunctionId(f) => {
121+
lang_items.collect_lang_item(db, f, LangItemTarget::Function);
122+
}
123+
AssocItemId::TypeAliasId(alias) => {
124+
lang_items.collect_lang_item(db, alias, LangItemTarget::TypeAlias)
125+
}
126+
AssocItemId::ConstId(_) => {}
119127
}
120-
AssocItemId::TypeAliasId(alias) => {
121-
lang_items.collect_lang_item(db, alias, LangItemTarget::TypeAlias)
122-
}
123-
AssocItemId::ConstId(_) => {}
124128
});
125129
}
126130
ModuleDefId::AdtId(AdtId::EnumId(e)) => {

crates/hir-def/src/lib.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ use crate::{
8989
db::DefDatabase,
9090
hir::generics::{LocalLifetimeParamId, LocalTypeOrConstParamId},
9191
nameres::{
92-
LocalDefMap, assoc::ImplItems, block_def_map, crate_def_map, crate_local_def_map,
92+
LocalDefMap,
93+
assoc::{ImplItems, TraitItems},
94+
block_def_map, crate_def_map, crate_local_def_map,
9395
diagnostics::DefDiagnostics,
9496
},
9597
signatures::{EnumVariants, InactiveEnumVariantCode, VariantFields},
@@ -282,6 +284,13 @@ impl_intern!(StaticId, StaticLoc, intern_static, lookup_intern_static);
282284
pub type TraitLoc = ItemLoc<ast::Trait>;
283285
impl_intern!(TraitId, TraitLoc, intern_trait, lookup_intern_trait);
284286

287+
impl TraitId {
288+
#[inline]
289+
pub fn trait_items(self, db: &dyn DefDatabase) -> &TraitItems {
290+
TraitItems::query(db, self)
291+
}
292+
}
293+
285294
pub type TraitAliasLoc = ItemLoc<ast::TraitAlias>;
286295
impl_intern!(TraitAliasId, TraitAliasLoc, intern_trait_alias, lookup_intern_trait_alias);
287296

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,24 +38,26 @@ pub struct TraitItems {
3838
pub macro_calls: ThinVec<(AstId<ast::Item>, MacroCallId)>,
3939
}
4040

41+
#[salsa::tracked]
4142
impl TraitItems {
4243
#[inline]
43-
pub(crate) fn trait_items_query(db: &dyn DefDatabase, tr: TraitId) -> Arc<TraitItems> {
44-
db.trait_items_with_diagnostics(tr).0
44+
pub(crate) fn query(db: &dyn DefDatabase, tr: TraitId) -> &TraitItems {
45+
&Self::query_with_diagnostics(db, tr).0
4546
}
4647

47-
pub(crate) fn trait_items_with_diagnostics_query(
48+
#[salsa::tracked(returns(ref))]
49+
pub fn query_with_diagnostics(
4850
db: &dyn DefDatabase,
4951
tr: TraitId,
50-
) -> (Arc<TraitItems>, DefDiagnostics) {
52+
) -> (TraitItems, DefDiagnostics) {
5153
let ItemLoc { container: module_id, id: ast_id } = tr.lookup(db);
5254

5355
let collector =
5456
AssocItemCollector::new(db, module_id, ItemContainerId::TraitId(tr), ast_id.file_id);
5557
let source = ast_id.with_value(collector.ast_id_map.get(ast_id.value)).to_node(db);
5658
let (items, macro_calls, diagnostics) = collector.collect(source.assoc_item_list());
5759

58-
(Arc::new(TraitItems { macro_calls, items }), DefDiagnostics::new(diagnostics))
60+
(TraitItems { macro_calls, items }, DefDiagnostics::new(diagnostics))
5961
}
6062

6163
pub fn associated_types(&self) -> impl Iterator<Item = TypeAliasId> + '_ {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ use crate::{
4141
macro_call_as_call_id,
4242
nameres::{
4343
BuiltinShadowMode, DefMap, LocalDefMap, MacroSubNs, ModuleData, ModuleOrigin, ResolveMode,
44+
assoc::TraitItems,
4445
attr_resolution::{attr_macro_as_call_id, derive_macro_as_call_id},
4546
crate_def_map,
4647
diagnostics::DefDiagnostic,
@@ -1020,8 +1021,7 @@ impl<'db> DefCollector<'db> {
10201021
let resolutions = if true {
10211022
vec![]
10221023
} else {
1023-
self.db
1024-
.trait_items(it)
1024+
TraitItems::query(self.db, it)
10251025
.items
10261026
.iter()
10271027
.map(|&(ref name, variant)| {

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ use crate::{
2424
item_scope::{BUILTIN_SCOPE, ImportOrExternCrate},
2525
item_tree::FieldsShape,
2626
nameres::{
27-
BlockInfo, BuiltinShadowMode, DefMap, LocalDefMap, MacroSubNs, crate_def_map,
28-
sub_namespace_match,
27+
BlockInfo, BuiltinShadowMode, DefMap, LocalDefMap, MacroSubNs, assoc::TraitItems,
28+
crate_def_map, sub_namespace_match,
2929
},
3030
per_ns::PerNs,
3131
visibility::{RawVisibility, Visibility},
@@ -584,8 +584,11 @@ impl DefMap {
584584
// now resulting in a cycle.
585585
// To properly implement this, trait item collection needs to be done in def map
586586
// collection...
587-
let item =
588-
if true { None } else { db.trait_items(t).assoc_item_by_name(segment) };
587+
let item = if true {
588+
None
589+
} else {
590+
TraitItems::query(db, t).assoc_item_by_name(segment)
591+
};
589592
return match item {
590593
Some(item) => ResolvePathResult::new(
591594
match item {

crates/hir-ty/src/autoderef.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ pub(crate) fn deref_by_trait(
208208
};
209209
let trait_id = trait_id()?;
210210
let target =
211-
db.trait_items(trait_id).associated_type_by_name(&Name::new_symbol_root(sym::Target))?;
211+
trait_id.trait_items(db).associated_type_by_name(&Name::new_symbol_root(sym::Target))?;
212212

213213
let projection = {
214214
let b = TyBuilder::subst_for_def(db, trait_id, None);

crates/hir-ty/src/chalk_db.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -315,9 +315,8 @@ impl chalk_solve::RustIrDatabase<Interner> for ChalkContext<'_> {
315315
crate::ImplTraitId::AsyncBlockTypeImplTrait(..) => {
316316
if let Some((future_trait, future_output)) =
317317
LangItem::Future.resolve_trait(self.db, self.krate).and_then(|trait_| {
318-
let alias = self
319-
.db
320-
.trait_items(trait_)
318+
let alias = trait_
319+
.trait_items(self.db)
321320
.associated_type_by_name(&Name::new_symbol_root(sym::Output))?;
322321
Some((trait_, alias))
323322
})
@@ -711,7 +710,7 @@ pub(crate) fn trait_datum_query(
711710
};
712711
let where_clauses = convert_where_clauses(db, trait_.into(), &bound_vars);
713712
let associated_ty_ids =
714-
db.trait_items(trait_).associated_types().map(to_assoc_type_id).collect();
713+
trait_.trait_items(db).associated_types().map(to_assoc_type_id).collect();
715714
let trait_datum_bound = rust_ir::TraitDatumBound { where_clauses };
716715
let well_known = db.lang_attr(trait_.into()).and_then(well_known_trait_from_lang_item);
717716
let trait_datum = TraitDatum {
@@ -879,7 +878,7 @@ fn impl_def_datum(db: &dyn HirDatabase, krate: Crate, impl_id: hir_def::ImplId)
879878
let polarity = if negative { rust_ir::Polarity::Negative } else { rust_ir::Polarity::Positive };
880879

881880
let impl_datum_bound = rust_ir::ImplDatumBound { trait_ref, where_clauses };
882-
let trait_data = db.trait_items(trait_);
881+
let trait_data = trait_.trait_items(db);
883882
let associated_ty_value_ids = impl_id
884883
.impl_items(db)
885884
.items
@@ -931,8 +930,9 @@ fn type_alias_associated_ty_value(
931930
.into_value_and_skipped_binders()
932931
.0; // we don't return any assoc ty values if the impl'd trait can't be resolved
933932

934-
let assoc_ty = db
935-
.trait_items(trait_ref.hir_trait_id())
933+
let assoc_ty = trait_ref
934+
.hir_trait_id()
935+
.trait_items(db)
936936
.associated_type_by_name(&type_alias_data.name)
937937
.expect("assoc ty value should not exist"); // validated when building the impl data as well
938938
let (ty, binders) = db.ty(type_alias.into()).into_value_and_skipped_binders();

crates/hir-ty/src/diagnostics/expr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ impl FilterMapNextChecker {
494494
Some(next_function_id),
495495
match next_function_id.lookup(db).container {
496496
ItemContainerId::TraitId(iterator_trait_id) => {
497-
let iterator_trait_items = &db.trait_items(iterator_trait_id).items;
497+
let iterator_trait_items = &iterator_trait_id.trait_items(db).items;
498498
iterator_trait_items.iter().find_map(|(name, it)| match it {
499499
&AssocItemId::FunctionId(id) if *name == sym::filter_map => Some(id),
500500
_ => None,

crates/hir-ty/src/display.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1394,7 +1394,7 @@ impl HirDisplay for Ty {
13941394
let future_trait =
13951395
LangItem::Future.resolve_trait(db, body.module(db).krate());
13961396
let output = future_trait.and_then(|t| {
1397-
db.trait_items(t)
1397+
t.trait_items(db)
13981398
.associated_type_by_name(&Name::new_symbol_root(sym::Output))
13991399
});
14001400
write!(f, "impl ")?;

crates/hir-ty/src/dyn_compatibility.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ where
101101

102102
// rustc checks for non-lifetime binders here, but we don't support HRTB yet
103103

104-
let trait_data = db.trait_items(trait_);
104+
let trait_data = trait_.trait_items(db);
105105
for (_, assoc_item) in &trait_data.items {
106106
dyn_compatibility_violation_for_assoc_item(db, trait_, *assoc_item, cb)?;
107107
}
@@ -164,7 +164,7 @@ fn predicates_reference_self(db: &dyn HirDatabase, trait_: TraitId) -> bool {
164164

165165
// Same as the above, `predicates_reference_self`
166166
fn bounds_reference_self(db: &dyn HirDatabase, trait_: TraitId) -> bool {
167-
let trait_data = db.trait_items(trait_);
167+
let trait_data = trait_.trait_items(db);
168168
trait_data
169169
.items
170170
.iter()

crates/hir-ty/src/infer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1813,7 +1813,7 @@ impl<'db> InferenceContext<'db> {
18131813
}
18141814

18151815
fn resolve_output_on(&self, trait_: TraitId) -> Option<TypeAliasId> {
1816-
self.db.trait_items(trait_).associated_type_by_name(&Name::new_symbol_root(sym::Output))
1816+
trait_.trait_items(self.db).associated_type_by_name(&Name::new_symbol_root(sym::Output))
18171817
}
18181818

18191819
fn resolve_lang_trait(&self, lang: LangItem) -> Option<TraitId> {

crates/hir-ty/src/infer/closure.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,9 +1210,8 @@ impl InferenceContext<'_> {
12101210
if let Some(deref_trait) =
12111211
self.resolve_lang_item(LangItem::DerefMut).and_then(|it| it.as_trait())
12121212
{
1213-
if let Some(deref_fn) = self
1214-
.db
1215-
.trait_items(deref_trait)
1213+
if let Some(deref_fn) = deref_trait
1214+
.trait_items(self.db)
12161215
.method_by_name(&Name::new_symbol_root(sym::deref_mut))
12171216
{
12181217
break 'b deref_fn == f;

crates/hir-ty/src/infer/expr.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -654,9 +654,8 @@ impl InferenceContext<'_> {
654654
match op {
655655
UnaryOp::Deref => {
656656
if let Some(deref_trait) = self.resolve_lang_trait(LangItem::Deref) {
657-
if let Some(deref_fn) = self
658-
.db
659-
.trait_items(deref_trait)
657+
if let Some(deref_fn) = deref_trait
658+
.trait_items(self.db)
660659
.method_by_name(&Name::new_symbol_root(sym::deref))
661660
{
662661
// FIXME: this is wrong in multiple ways, subst is empty, and we emit it even for builtin deref (note that
@@ -813,9 +812,8 @@ impl InferenceContext<'_> {
813812
self.table.new_lifetime_var(),
814813
));
815814
self.write_expr_adj(*base, adj.into_boxed_slice());
816-
if let Some(func) = self
817-
.db
818-
.trait_items(index_trait)
815+
if let Some(func) = index_trait
816+
.trait_items(self.db)
819817
.method_by_name(&Name::new_symbol_root(sym::index))
820818
{
821819
let subst = TyBuilder::subst_for_def(self.db, index_trait, None);
@@ -1148,7 +1146,7 @@ impl InferenceContext<'_> {
11481146
let Some(trait_) = fn_x.get_id(self.db, self.table.trait_env.krate) else {
11491147
return;
11501148
};
1151-
let trait_data = self.db.trait_items(trait_);
1149+
let trait_data = trait_.trait_items(self.db);
11521150
if let Some(func) = trait_data.method_by_name(&fn_x.method_name()) {
11531151
let subst = TyBuilder::subst_for_def(self.db, trait_, None)
11541152
.push(callee_ty.clone())
@@ -1316,7 +1314,7 @@ impl InferenceContext<'_> {
13161314

13171315
let trait_func = lang_items_for_bin_op(op).and_then(|(name, lang_item)| {
13181316
let trait_id = self.resolve_lang_item(lang_item)?.as_trait()?;
1319-
let func = self.db.trait_items(trait_id).method_by_name(&name)?;
1317+
let func = trait_id.trait_items(self.db).method_by_name(&name)?;
13201318
Some((trait_id, func))
13211319
});
13221320
let (trait_, func) = match trait_func {

crates/hir-ty/src/infer/mutability.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,8 @@ impl InferenceContext<'_> {
129129
if let Some(index_trait) =
130130
LangItem::IndexMut.resolve_trait(self.db, self.table.trait_env.krate)
131131
{
132-
if let Some(index_fn) = self
133-
.db
134-
.trait_items(index_trait)
132+
if let Some(index_fn) = index_trait
133+
.trait_items(self.db)
135134
.method_by_name(&Name::new_symbol_root(sym::index_mut))
136135
{
137136
*f = index_fn;
@@ -194,9 +193,8 @@ impl InferenceContext<'_> {
194193
});
195194
if is_mut_ptr {
196195
mutability = Mutability::Not;
197-
} else if let Some(deref_fn) = self
198-
.db
199-
.trait_items(deref_trait)
196+
} else if let Some(deref_fn) = deref_trait
197+
.trait_items(self.db)
200198
.method_by_name(&Name::new_symbol_root(sym::deref_mut))
201199
{
202200
*f = deref_fn;

crates/hir-ty/src/infer/path.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ impl InferenceContext<'_> {
278278
) -> Option<(ValueNs, Substitution)> {
279279
let trait_ = trait_ref.hir_trait_id();
280280
let item =
281-
self.db.trait_items(trait_).items.iter().map(|(_name, id)| *id).find_map(|item| {
281+
trait_.trait_items(self.db).items.iter().map(|(_name, id)| *id).find_map(|item| {
282282
match item {
283283
AssocItemId::FunctionId(func) => {
284284
if segment.name == &self.db.function_signature(func).name {

crates/hir-ty/src/infer/unify.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ impl<'a> InferenceTable<'a> {
859859
] {
860860
let krate = self.trait_env.krate;
861861
let fn_trait = fn_trait_name.get_id(self.db, krate)?;
862-
let trait_data = self.db.trait_items(fn_trait);
862+
let trait_data = fn_trait.trait_items(self.db);
863863
let output_assoc_type =
864864
trait_data.associated_type_by_name(&Name::new_symbol_root(output_assoc_name))?;
865865

crates/hir-ty/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -891,8 +891,8 @@ pub fn callable_sig_from_fn_trait(
891891
) -> Option<(FnTrait, CallableSig)> {
892892
let krate = trait_env.krate;
893893
let fn_once_trait = FnTrait::FnOnce.get_id(db, krate)?;
894-
let output_assoc_type = db
895-
.trait_items(fn_once_trait)
894+
let output_assoc_type = fn_once_trait
895+
.trait_items(db)
896896
.associated_type_by_name(&Name::new_symbol_root(sym::Output))?;
897897

898898
let mut table = InferenceTable::new(db, trait_env.clone());

0 commit comments

Comments
 (0)