Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/item_tree.rs')
| -rw-r--r-- | crates/hir-def/src/item_tree.rs | 42 |
1 files changed, 23 insertions, 19 deletions
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), } } |