Unnamed repository; edit this file 'description' to name the repository.
Remove `Arc` from `file_item_tree`
Chayim Refael Friedman 4 weeks ago
parent da6a848 · commit 810291e
-rw-r--r--crates/hir-def/src/db.rs4
-rw-r--r--crates/hir-def/src/item_tree.rs42
2 files changed, 25 insertions, 21 deletions
diff --git a/crates/hir-def/src/db.rs b/crates/hir-def/src/db.rs
index 9dd7768ead..d644c1e9fe 100644
--- a/crates/hir-def/src/db.rs
+++ b/crates/hir-def/src/db.rs
@@ -14,7 +14,7 @@ use crate::{
StaticLoc, StructId, StructLoc, TraitId, TraitLoc, TypeAliasId, TypeAliasLoc, UnionId,
UnionLoc, UseId, UseLoc,
attrs::AttrFlags,
- item_tree::{ItemTree, file_item_tree_query},
+ item_tree::{ItemTree, file_item_tree},
nameres::crate_def_map,
visibility::{self, Visibility},
};
@@ -87,7 +87,7 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
fn expand_proc_attr_macros(&self) -> bool;
/// Computes an [`ItemTree`] for the given file or macro expansion.
- #[salsa::invoke(file_item_tree_query)]
+ #[salsa::invoke(file_item_tree)]
#[salsa::transparent]
fn file_item_tree(&self, file_id: HirFileId, krate: Crate) -> &ItemTree;
diff --git a/crates/hir-def/src/item_tree.rs b/crates/hir-def/src/item_tree.rs
index e7ab2b390f..4b50161c04 100644
--- a/crates/hir-def/src/item_tree.rs
+++ b/crates/hir-def/src/item_tree.rs
@@ -61,7 +61,6 @@ use span::{
use stdx::never;
use syntax::{SourceFile, SyntaxKind, ast, match_ast};
use thin_vec::ThinVec;
-use triomphe::Arc;
use tt::TextRange;
use crate::{BlockId, Lookup, attrs::parse_extra_crate_attrs, db::DefDatabase};
@@ -121,14 +120,30 @@ fn lower_extra_crate_attrs<'a>(
AttrsOrCfg::lower(db, &crate_attrs_as_src, cfg_options, span_map)
}
-#[salsa_macros::tracked(returns(deref))]
-pub(crate) fn file_item_tree_query(
+pub(crate) fn file_item_tree(db: &dyn DefDatabase, file_id: HirFileId, krate: Crate) -> &ItemTree {
+ match file_item_tree_query(db, file_id, krate) {
+ Some(item_tree) => item_tree,
+ None => {
+ static EMPTY: OnceLock<ItemTree> = OnceLock::new();
+ EMPTY.get_or_init(|| ItemTree {
+ top_level: Box::new([]),
+ attrs: FxHashMap::default(),
+ small_data: FxHashMap::default(),
+ big_data: FxHashMap::default(),
+ top_attrs: AttrsOrCfg::empty(),
+ vis: ItemVisibilities { arena: ThinVec::new() },
+ })
+ }
+ }
+}
+
+#[salsa_macros::tracked(returns(ref))]
+fn file_item_tree_query(
db: &dyn DefDatabase,
file_id: HirFileId,
krate: Crate,
-) -> Arc<ItemTree> {
+) -> Option<Box<ItemTree>> {
let _p = tracing::info_span!("file_item_tree_query", ?file_id).entered();
- static EMPTY: OnceLock<Arc<ItemTree>> = OnceLock::new();
let ctx = lower::Ctx::new(db, file_id, krate);
let syntax = db.parse_or_expand(file_id);
@@ -174,21 +189,10 @@ pub(crate) fn file_item_tree_query(
&& top_attrs.is_empty()
&& vis.arena.is_empty()
{
- EMPTY
- .get_or_init(|| {
- Arc::new(ItemTree {
- top_level: Box::new([]),
- attrs: FxHashMap::default(),
- small_data: FxHashMap::default(),
- big_data: FxHashMap::default(),
- top_attrs: AttrsOrCfg::empty(),
- vis: ItemVisibilities { arena: ThinVec::new() },
- })
- })
- .clone()
+ None
} else {
item_tree.shrink_to_fit();
- Arc::new(item_tree)
+ Some(Box::new(item_tree))
}
}
@@ -343,7 +347,7 @@ impl TreeId {
pub(crate) fn item_tree<'db>(&self, db: &'db dyn DefDatabase, krate: Crate) -> &'db ItemTree {
match self.block {
Some(block) => block_item_tree_query(db, block, krate),
- None => file_item_tree_query(db, self.file, krate),
+ None => file_item_tree(db, self.file, krate),
}
}