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
Chayim Refael Friedman 4 weeks ago
parent 3aaa35b · parent 0d798b7 · commit 39e0f27
-rw-r--r--crates/hir-def/src/db.rs4
-rw-r--r--crates/hir-def/src/item_tree.rs42
-rw-r--r--crates/hir-def/src/item_tree/lower.rs8
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<[_]>