mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-25 11:17:13 +00:00
Idiomatic salsa use for impl items query
This commit is contained in:
parent
155ef3de60
commit
4e392f82cb
@ -25,11 +25,7 @@ use crate::{
|
||||
import_map::ImportMap,
|
||||
item_tree::{ItemTree, file_item_tree_query},
|
||||
lang_item::{self, LangItem},
|
||||
nameres::{
|
||||
assoc::{ImplItems, TraitItems},
|
||||
crate_def_map,
|
||||
diagnostics::DefDiagnostics,
|
||||
},
|
||||
nameres::{assoc::TraitItems, crate_def_map, diagnostics::DefDiagnostics},
|
||||
signatures::{
|
||||
ConstSignature, EnumSignature, FunctionSignature, ImplSignature, StaticSignature,
|
||||
StructSignature, TraitAliasSignature, TraitSignature, TypeAliasSignature, UnionSignature,
|
||||
@ -120,13 +116,6 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
|
||||
id: VariantId,
|
||||
) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>);
|
||||
|
||||
#[salsa::transparent]
|
||||
#[salsa::invoke(ImplItems::impl_items_query)]
|
||||
fn impl_items(&self, e: ImplId) -> Arc<ImplItems>;
|
||||
|
||||
#[salsa::invoke(ImplItems::impl_items_with_diagnostics_query)]
|
||||
fn impl_items_with_diagnostics(&self, e: ImplId) -> (Arc<ImplItems>, DefDiagnostics);
|
||||
|
||||
#[salsa::transparent]
|
||||
#[salsa::invoke(TraitItems::trait_items_query)]
|
||||
fn trait_items(&self, e: TraitId) -> Arc<TraitItems>;
|
||||
|
@ -96,7 +96,7 @@ pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> Option<Box<LangIt
|
||||
for (_, module_data) in crate_def_map.modules() {
|
||||
for impl_def in module_data.scope.impls() {
|
||||
lang_items.collect_lang_item(db, impl_def, LangItemTarget::ImplDef);
|
||||
for &(_, assoc) in db.impl_items(impl_def).items.iter() {
|
||||
for &(_, assoc) in impl_def.impl_items(db).items.iter() {
|
||||
match assoc {
|
||||
AssocItemId::FunctionId(f) => {
|
||||
lang_items.collect_lang_item(db, f, LangItemTarget::Function)
|
||||
|
@ -88,7 +88,10 @@ use crate::{
|
||||
builtin_type::BuiltinType,
|
||||
db::DefDatabase,
|
||||
hir::generics::{LocalLifetimeParamId, LocalTypeOrConstParamId},
|
||||
nameres::{LocalDefMap, block_def_map, crate_def_map, crate_local_def_map},
|
||||
nameres::{
|
||||
LocalDefMap, assoc::ImplItems, block_def_map, crate_def_map, crate_local_def_map,
|
||||
diagnostics::DefDiagnostics,
|
||||
},
|
||||
signatures::{EnumVariants, InactiveEnumVariantCode, VariantFields},
|
||||
};
|
||||
|
||||
@ -287,6 +290,18 @@ impl_intern!(TypeAliasId, TypeAliasLoc, intern_type_alias, lookup_intern_type_al
|
||||
type ImplLoc = ItemLoc<ast::Impl>;
|
||||
impl_intern!(ImplId, ImplLoc, intern_impl, lookup_intern_impl);
|
||||
|
||||
impl ImplId {
|
||||
#[inline]
|
||||
pub fn impl_items(self, db: &dyn DefDatabase) -> &ImplItems {
|
||||
&self.impl_items_with_diagnostics(db).0
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn impl_items_with_diagnostics(self, db: &dyn DefDatabase) -> &(ImplItems, DefDiagnostics) {
|
||||
ImplItems::of(db, self)
|
||||
}
|
||||
}
|
||||
|
||||
type UseLoc = ItemLoc<ast::Use>;
|
||||
impl_intern!(UseId, UseLoc, intern_use, lookup_intern_use);
|
||||
|
||||
|
@ -100,16 +100,10 @@ pub struct ImplItems {
|
||||
pub macro_calls: ThinVec<(AstId<ast::Item>, MacroCallId)>,
|
||||
}
|
||||
|
||||
#[salsa::tracked]
|
||||
impl ImplItems {
|
||||
#[inline]
|
||||
pub(crate) fn impl_items_query(db: &dyn DefDatabase, id: ImplId) -> Arc<ImplItems> {
|
||||
db.impl_items_with_diagnostics(id).0
|
||||
}
|
||||
|
||||
pub(crate) fn impl_items_with_diagnostics_query(
|
||||
db: &dyn DefDatabase,
|
||||
id: ImplId,
|
||||
) -> (Arc<ImplItems>, DefDiagnostics) {
|
||||
#[salsa::tracked(returns(ref))]
|
||||
pub fn of(db: &dyn DefDatabase, id: ImplId) -> (ImplItems, DefDiagnostics) {
|
||||
let _p = tracing::info_span!("impl_items_with_diagnostics_query").entered();
|
||||
let ItemLoc { container: module_id, id: ast_id } = id.lookup(db);
|
||||
|
||||
@ -118,9 +112,11 @@ impl ImplItems {
|
||||
let source = ast_id.with_value(collector.ast_id_map.get(ast_id.value)).to_node(db);
|
||||
let (items, macro_calls, diagnostics) = collector.collect(source.assoc_item_list());
|
||||
|
||||
(Arc::new(ImplItems { items, macro_calls }), DefDiagnostics::new(diagnostics))
|
||||
(ImplItems { items, macro_calls }, DefDiagnostics::new(diagnostics))
|
||||
}
|
||||
}
|
||||
|
||||
impl ImplItems {
|
||||
pub fn macro_calls(&self) -> impl Iterator<Item = (AstId<ast::Item>, MacroCallId)> + '_ {
|
||||
self.macro_calls.iter().copied()
|
||||
}
|
||||
|
@ -431,7 +431,6 @@ pub struct S {}
|
||||
"parse_shim",
|
||||
"real_span_map_shim",
|
||||
"macro_def_shim",
|
||||
"macro_def_shim",
|
||||
"file_item_tree_query",
|
||||
"ast_id_map_shim",
|
||||
"parse_macro_expansion_shim",
|
||||
|
@ -63,7 +63,7 @@ impl chalk_solve::RustIrDatabase<Interner> for ChalkContext<'_> {
|
||||
) -> Option<rust_ir::AssociatedTyValueId<Interner>> {
|
||||
let alias_id = from_assoc_type_id(assoc_type_id);
|
||||
let trait_sig = self.db.type_alias_signature(alias_id);
|
||||
self.db.impl_items(hir_def::ImplId::from_chalk(self.db, impl_id)).items.iter().find_map(
|
||||
hir_def::ImplId::from_chalk(self.db, impl_id).impl_items(self.db).items.iter().find_map(
|
||||
|(name, item)| match item {
|
||||
AssocItemId::TypeAliasId(alias) if &trait_sig.name == name => {
|
||||
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)
|
||||
|
||||
let impl_datum_bound = rust_ir::ImplDatumBound { trait_ref, where_clauses };
|
||||
let trait_data = db.trait_items(trait_);
|
||||
let associated_ty_value_ids = db
|
||||
.impl_items(impl_id)
|
||||
let associated_ty_value_ids = impl_id
|
||||
.impl_items(db)
|
||||
.items
|
||||
.iter()
|
||||
.filter_map(|(_, item)| match item {
|
||||
|
@ -790,7 +790,7 @@ fn find_matching_impl(
|
||||
mut impls: impl Iterator<Item = ImplId>,
|
||||
mut table: InferenceTable<'_>,
|
||||
actual_trait_ref: TraitRef,
|
||||
) -> Option<(Arc<ImplItems>, Substitution)> {
|
||||
) -> Option<(&ImplItems, Substitution)> {
|
||||
let db = table.db;
|
||||
impls.find_map(|impl_| {
|
||||
table.run_in_snapshot(|table| {
|
||||
@ -811,7 +811,7 @@ fn find_matching_impl(
|
||||
let goal = crate::Goal::all(Interner, wcs);
|
||||
table.try_obligation(goal.clone())?;
|
||||
table.register_obligation(goal);
|
||||
Some((db.impl_items(impl_), table.resolve_completely(impl_substs)))
|
||||
Some((impl_.impl_items(db), table.resolve_completely(impl_substs)))
|
||||
})
|
||||
})
|
||||
}
|
||||
@ -875,7 +875,7 @@ fn is_inherent_impl_coherent(
|
||||
|
||||
_ => false,
|
||||
};
|
||||
let items = db.impl_items(impl_id);
|
||||
let items = impl_id.impl_items(db);
|
||||
rustc_has_incoherent_inherent_impls
|
||||
&& !items.items.is_empty()
|
||||
&& items.items.iter().all(|&(_, assoc)| match assoc {
|
||||
@ -1462,7 +1462,7 @@ fn iterate_inherent_methods(
|
||||
callback: &mut dyn FnMut(ReceiverAdjustments, AssocItemId, bool) -> ControlFlow<()>,
|
||||
) -> ControlFlow<()> {
|
||||
for &impl_id in impls.for_self_ty(self_ty) {
|
||||
for &(ref item_name, item) in table.db.impl_items(impl_id).items.iter() {
|
||||
for &(ref item_name, item) in impl_id.impl_items(table.db).items.iter() {
|
||||
let visible = match is_valid_impl_method_candidate(
|
||||
table,
|
||||
self_ty,
|
||||
|
@ -437,7 +437,7 @@ pub(crate) fn visit_module(
|
||||
) {
|
||||
visit_scope(db, crate_def_map, &crate_def_map[module_id].scope, cb);
|
||||
for impl_id in crate_def_map[module_id].scope.impls() {
|
||||
let impl_data = db.impl_items(impl_id);
|
||||
let impl_data = impl_id.impl_items(db);
|
||||
for &(_, item) in impl_data.items.iter() {
|
||||
match item {
|
||||
AssocItemId::FunctionId(it) => {
|
||||
|
@ -760,7 +760,7 @@ impl Module {
|
||||
|
||||
let ast_id_map = db.ast_id_map(file_id);
|
||||
|
||||
for diag in db.impl_items_with_diagnostics(impl_def.id).1.iter() {
|
||||
for diag in impl_def.id.impl_items_with_diagnostics(db).1.iter() {
|
||||
emit_def_diagnostic(db, acc, diag, edition);
|
||||
}
|
||||
|
||||
@ -824,7 +824,7 @@ impl Module {
|
||||
AssocItemId::ConstId(id) => !db.const_signature(id).has_body(),
|
||||
AssocItemId::TypeAliasId(it) => db.type_alias_signature(it).ty.is_none(),
|
||||
});
|
||||
impl_assoc_items_scratch.extend(db.impl_items(impl_def.id).items.iter().cloned());
|
||||
impl_assoc_items_scratch.extend(impl_def.id.impl_items(db).items.iter().cloned());
|
||||
|
||||
let redundant = impl_assoc_items_scratch
|
||||
.iter()
|
||||
@ -912,7 +912,7 @@ impl Module {
|
||||
&source_map,
|
||||
);
|
||||
|
||||
for &(_, item) in db.impl_items(impl_def.id).items.iter() {
|
||||
for &(_, item) in impl_def.id.impl_items(db).items.iter() {
|
||||
AssocItem::from(item).diagnostics(db, acc, style_lints);
|
||||
}
|
||||
}
|
||||
@ -4413,7 +4413,7 @@ impl Impl {
|
||||
}
|
||||
|
||||
pub fn items(self, db: &dyn HirDatabase) -> Vec<AssocItem> {
|
||||
db.impl_items(self.id).items.iter().map(|&(_, it)| it.into()).collect()
|
||||
self.id.impl_items(db).items.iter().map(|&(_, it)| it.into()).collect()
|
||||
}
|
||||
|
||||
pub fn is_negative(self, db: &dyn HirDatabase) -> bool {
|
||||
@ -4462,7 +4462,7 @@ impl Impl {
|
||||
}
|
||||
|
||||
fn all_macro_calls(&self, db: &dyn HirDatabase) -> Box<[(AstId<ast::Item>, MacroCallId)]> {
|
||||
db.impl_items(self.id).macro_calls.to_vec().into_boxed_slice()
|
||||
self.id.impl_items(db).macro_calls.to_vec().into_boxed_slice()
|
||||
}
|
||||
}
|
||||
|
||||
@ -5271,7 +5271,7 @@ impl Type {
|
||||
let impls = db.inherent_impls_in_crate(krate);
|
||||
|
||||
for impl_def in impls.for_self_ty(&self.ty) {
|
||||
for &(_, item) in db.impl_items(*impl_def).items.iter() {
|
||||
for &(_, item) in impl_def.impl_items(db).items.iter() {
|
||||
if callback(item) {
|
||||
return;
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ impl ChildBySource for TraitId {
|
||||
|
||||
impl ChildBySource for ImplId {
|
||||
fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap, file_id: HirFileId) {
|
||||
let data = db.impl_items(*self);
|
||||
let data = self.impl_items(db);
|
||||
data.macro_calls().filter(|(ast_id, _)| ast_id.file_id == file_id).for_each(
|
||||
|(ast_id, call_id)| {
|
||||
let ptr = ast_id.to_ptr(db);
|
||||
|
@ -321,7 +321,7 @@ impl<'a> SymbolCollector<'a> {
|
||||
.to_smolstr(),
|
||||
);
|
||||
self.with_container_name(impl_name, |s| {
|
||||
for &(ref name, assoc_item_id) in &self.db.impl_items(impl_id).items {
|
||||
for &(ref name, assoc_item_id) in &impl_id.impl_items(self.db).items {
|
||||
s.push_assoc_item(assoc_item_id, name, None)
|
||||
}
|
||||
})
|
||||
|
Loading…
x
Reference in New Issue
Block a user