mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-28 18:43:01 +00:00
De-arc trait items query
This commit is contained in:
parent
70cbf8332a
commit
f25912c6f9
33 changed files with 110 additions and 107 deletions
|
|
@ -25,7 +25,7 @@ use crate::{
|
|||
import_map::ImportMap,
|
||||
item_tree::{ItemTree, file_item_tree_query},
|
||||
lang_item::{self, LangItem},
|
||||
nameres::{assoc::TraitItems, crate_def_map, diagnostics::DefDiagnostics},
|
||||
nameres::crate_def_map,
|
||||
signatures::{
|
||||
ConstSignature, EnumSignature, FunctionSignature, ImplSignature, StaticSignature,
|
||||
StructSignature, TraitAliasSignature, TraitSignature, TypeAliasSignature, UnionSignature,
|
||||
|
|
@ -119,13 +119,6 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
|
|||
id: VariantId,
|
||||
) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>);
|
||||
|
||||
#[salsa::transparent]
|
||||
#[salsa::invoke(TraitItems::trait_items_query)]
|
||||
fn trait_items(&self, e: TraitId) -> Arc<TraitItems>;
|
||||
|
||||
#[salsa::invoke(TraitItems::trait_items_with_diagnostics_query)]
|
||||
fn trait_items_with_diagnostics(&self, tr: TraitId) -> (Arc<TraitItems>, DefDiagnostics);
|
||||
|
||||
#[salsa::tracked]
|
||||
fn variant_fields(&self, id: VariantId) -> Arc<VariantFields> {
|
||||
self.variant_fields_with_source_map(id).0
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ use crate::{
|
|||
AssocItemId, AttrDefId, Complete, FxIndexMap, ModuleDefId, ModuleId, TraitId,
|
||||
db::DefDatabase,
|
||||
item_scope::{ImportOrExternCrate, ItemInNs},
|
||||
nameres::{DefMap, crate_def_map},
|
||||
nameres::{DefMap, assoc::TraitItems, crate_def_map},
|
||||
visibility::Visibility,
|
||||
};
|
||||
|
||||
|
|
@ -221,7 +221,7 @@ impl ImportMap {
|
|||
trait_import_info: &ImportInfo,
|
||||
) {
|
||||
let _p = tracing::info_span!("collect_trait_assoc_items").entered();
|
||||
for &(ref assoc_item_name, item) in &db.trait_items(tr).items {
|
||||
for &(ref assoc_item_name, item) in &TraitItems::query(db, tr).items {
|
||||
let module_def_id = match item {
|
||||
AssocItemId::FunctionId(f) => ModuleDefId::from(f),
|
||||
AssocItemId::ConstId(c) => ModuleDefId::from(c),
|
||||
|
|
@ -482,7 +482,7 @@ mod tests {
|
|||
use expect_test::{Expect, expect};
|
||||
use test_fixture::WithFixture;
|
||||
|
||||
use crate::{ItemContainerId, Lookup, test_db::TestDB};
|
||||
use crate::{ItemContainerId, Lookup, nameres::assoc::TraitItems, test_db::TestDB};
|
||||
|
||||
use super::*;
|
||||
|
||||
|
|
@ -580,7 +580,7 @@ mod tests {
|
|||
|
||||
let trait_info = dependency_imports.import_info_for(ItemInNs::Types(trait_id.into()))?;
|
||||
|
||||
let trait_items = db.trait_items(trait_id);
|
||||
let trait_items = TraitItems::query(db, trait_id);
|
||||
let (assoc_item_name, _) = trait_items
|
||||
.items
|
||||
.iter()
|
||||
|
|
|
|||
|
|
@ -9,8 +9,10 @@ use triomphe::Arc;
|
|||
|
||||
use crate::{
|
||||
AdtId, AssocItemId, AttrDefId, Crate, EnumId, EnumVariantId, FunctionId, ImplId, ModuleDefId,
|
||||
StaticId, StructId, TraitId, TypeAliasId, UnionId, db::DefDatabase, expr_store::path::Path,
|
||||
nameres::crate_def_map,
|
||||
StaticId, StructId, TraitId, TypeAliasId, UnionId,
|
||||
db::DefDatabase,
|
||||
expr_store::path::Path,
|
||||
nameres::{assoc::TraitItems, crate_def_map},
|
||||
};
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
|
|
@ -113,14 +115,16 @@ pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> Option<Box<LangIt
|
|||
match def {
|
||||
ModuleDefId::TraitId(trait_) => {
|
||||
lang_items.collect_lang_item(db, trait_, LangItemTarget::Trait);
|
||||
db.trait_items(trait_).items.iter().for_each(|&(_, assoc_id)| match assoc_id {
|
||||
AssocItemId::FunctionId(f) => {
|
||||
lang_items.collect_lang_item(db, f, LangItemTarget::Function);
|
||||
TraitItems::query(db, trait_).items.iter().for_each(|&(_, assoc_id)| {
|
||||
match assoc_id {
|
||||
AssocItemId::FunctionId(f) => {
|
||||
lang_items.collect_lang_item(db, f, LangItemTarget::Function);
|
||||
}
|
||||
AssocItemId::TypeAliasId(alias) => {
|
||||
lang_items.collect_lang_item(db, alias, LangItemTarget::TypeAlias)
|
||||
}
|
||||
AssocItemId::ConstId(_) => {}
|
||||
}
|
||||
AssocItemId::TypeAliasId(alias) => {
|
||||
lang_items.collect_lang_item(db, alias, LangItemTarget::TypeAlias)
|
||||
}
|
||||
AssocItemId::ConstId(_) => {}
|
||||
});
|
||||
}
|
||||
ModuleDefId::AdtId(AdtId::EnumId(e)) => {
|
||||
|
|
|
|||
|
|
@ -89,7 +89,9 @@ use crate::{
|
|||
db::DefDatabase,
|
||||
hir::generics::{LocalLifetimeParamId, LocalTypeOrConstParamId},
|
||||
nameres::{
|
||||
LocalDefMap, assoc::ImplItems, block_def_map, crate_def_map, crate_local_def_map,
|
||||
LocalDefMap,
|
||||
assoc::{ImplItems, TraitItems},
|
||||
block_def_map, crate_def_map, crate_local_def_map,
|
||||
diagnostics::DefDiagnostics,
|
||||
},
|
||||
signatures::{EnumVariants, InactiveEnumVariantCode, VariantFields},
|
||||
|
|
@ -282,6 +284,13 @@ impl_intern!(StaticId, StaticLoc, intern_static, lookup_intern_static);
|
|||
pub type TraitLoc = ItemLoc<ast::Trait>;
|
||||
impl_intern!(TraitId, TraitLoc, intern_trait, lookup_intern_trait);
|
||||
|
||||
impl TraitId {
|
||||
#[inline]
|
||||
pub fn trait_items(self, db: &dyn DefDatabase) -> &TraitItems {
|
||||
TraitItems::query(db, self)
|
||||
}
|
||||
}
|
||||
|
||||
pub type TraitAliasLoc = ItemLoc<ast::TraitAlias>;
|
||||
impl_intern!(TraitAliasId, TraitAliasLoc, intern_trait_alias, lookup_intern_trait_alias);
|
||||
|
||||
|
|
|
|||
|
|
@ -38,16 +38,18 @@ pub struct TraitItems {
|
|||
pub macro_calls: ThinVec<(AstId<ast::Item>, MacroCallId)>,
|
||||
}
|
||||
|
||||
#[salsa::tracked]
|
||||
impl TraitItems {
|
||||
#[inline]
|
||||
pub(crate) fn trait_items_query(db: &dyn DefDatabase, tr: TraitId) -> Arc<TraitItems> {
|
||||
db.trait_items_with_diagnostics(tr).0
|
||||
pub(crate) fn query(db: &dyn DefDatabase, tr: TraitId) -> &TraitItems {
|
||||
&Self::query_with_diagnostics(db, tr).0
|
||||
}
|
||||
|
||||
pub(crate) fn trait_items_with_diagnostics_query(
|
||||
#[salsa::tracked(returns(ref))]
|
||||
pub fn query_with_diagnostics(
|
||||
db: &dyn DefDatabase,
|
||||
tr: TraitId,
|
||||
) -> (Arc<TraitItems>, DefDiagnostics) {
|
||||
) -> (TraitItems, DefDiagnostics) {
|
||||
let ItemLoc { container: module_id, id: ast_id } = tr.lookup(db);
|
||||
|
||||
let collector =
|
||||
|
|
@ -55,7 +57,7 @@ impl TraitItems {
|
|||
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(TraitItems { macro_calls, items }), DefDiagnostics::new(diagnostics))
|
||||
(TraitItems { macro_calls, items }, DefDiagnostics::new(diagnostics))
|
||||
}
|
||||
|
||||
pub fn associated_types(&self) -> impl Iterator<Item = TypeAliasId> + '_ {
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ use crate::{
|
|||
macro_call_as_call_id,
|
||||
nameres::{
|
||||
BuiltinShadowMode, DefMap, LocalDefMap, MacroSubNs, ModuleData, ModuleOrigin, ResolveMode,
|
||||
assoc::TraitItems,
|
||||
attr_resolution::{attr_macro_as_call_id, derive_macro_as_call_id},
|
||||
crate_def_map,
|
||||
diagnostics::DefDiagnostic,
|
||||
|
|
@ -1020,8 +1021,7 @@ impl<'db> DefCollector<'db> {
|
|||
let resolutions = if true {
|
||||
vec![]
|
||||
} else {
|
||||
self.db
|
||||
.trait_items(it)
|
||||
TraitItems::query(self.db, it)
|
||||
.items
|
||||
.iter()
|
||||
.map(|&(ref name, variant)| {
|
||||
|
|
|
|||
|
|
@ -24,8 +24,8 @@ use crate::{
|
|||
item_scope::{BUILTIN_SCOPE, ImportOrExternCrate},
|
||||
item_tree::FieldsShape,
|
||||
nameres::{
|
||||
BlockInfo, BuiltinShadowMode, DefMap, LocalDefMap, MacroSubNs, crate_def_map,
|
||||
sub_namespace_match,
|
||||
BlockInfo, BuiltinShadowMode, DefMap, LocalDefMap, MacroSubNs, assoc::TraitItems,
|
||||
crate_def_map, sub_namespace_match,
|
||||
},
|
||||
per_ns::PerNs,
|
||||
visibility::{RawVisibility, Visibility},
|
||||
|
|
@ -584,8 +584,11 @@ impl DefMap {
|
|||
// now resulting in a cycle.
|
||||
// To properly implement this, trait item collection needs to be done in def map
|
||||
// collection...
|
||||
let item =
|
||||
if true { None } else { db.trait_items(t).assoc_item_by_name(segment) };
|
||||
let item = if true {
|
||||
None
|
||||
} else {
|
||||
TraitItems::query(db, t).assoc_item_by_name(segment)
|
||||
};
|
||||
return match item {
|
||||
Some(item) => ResolvePathResult::new(
|
||||
match item {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue