Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22189 from ChayimFriedman2/improve-item-tree
minor: Some improvements for item tree
| -rw-r--r-- | crates/hir-def/src/db.rs | 4 | ||||
| -rw-r--r-- | crates/hir-def/src/item_tree.rs | 42 | ||||
| -rw-r--r-- | crates/hir-def/src/item_tree/lower.rs | 8 |
3 files changed, 30 insertions, 24 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), } } diff --git a/crates/hir-def/src/item_tree/lower.rs b/crates/hir-def/src/item_tree/lower.rs index 31e409d86e..68b6cd79ae 100644 --- a/crates/hir-def/src/item_tree/lower.rs +++ b/crates/hir-def/src/item_tree/lower.rs @@ -65,7 +65,7 @@ impl<'db> Ctx<'db> { } pub(super) fn lower_module_items(mut self, item_owner: &dyn HasModuleItem) -> ItemTree { - self.top_level = item_owner.items().flat_map(|item| self.lower_mod_item(&item)).collect(); + self.top_level = item_owner.items().filter_map(|item| self.lower_mod_item(&item)).collect(); self.tree.vis.arena = self.visibilities.into_iter().collect(); self.tree.top_level = self.top_level.into_boxed_slice(); self.tree @@ -89,7 +89,7 @@ impl<'db> Ctx<'db> { _ => None, } }) - .flat_map(|item| self.lower_mod_item(&item)) + .filter_map(|item| self.lower_mod_item(&item)) .collect(); if let Some(ast::Expr::MacroExpr(tail_macro)) = stmts.expr() @@ -245,7 +245,9 @@ impl<'db> Ctx<'db> { ModKind::Inline { items: module .item_list() - .map(|list| list.items().flat_map(|item| self.lower_mod_item(&item)).collect()) + .map(|list| { + list.items().filter_map(|item| self.lower_mod_item(&item)).collect() + }) .unwrap_or_else(|| { cov_mark::hit!(name_res_works_for_broken_modules); Box::new([]) as Box<[_]> |