diff options
| author | Lukas Wirth <lukastw97@gmail.com> | 2023-08-10 19:22:46 +0200 |
|---|---|---|
| committer | Lukas Wirth <lukastw97@gmail.com> | 2023-08-10 19:24:39 +0200 |
| commit | bfad781a77cf2eb945694718e9cb3ab2830ecb28 (patch) | |
| tree | bca523074bc989bac2be5c576690e3a7b6b62af7 | |
| parent | fde2d9b47c1ca1a5b4c816e72acb784f7731f03e (diff) | |
| download | rust-bfad781a77cf2eb945694718e9cb3ab2830ecb28.tar.gz rust-bfad781a77cf2eb945694718e9cb3ab2830ecb28.zip | |
Memoize block_item_tree_query
| -rw-r--r-- | crates/hir-def/src/db.rs | 3 | ||||
| -rw-r--r-- | crates/hir-def/src/item_tree.rs | 6 |
2 files changed, 4 insertions, 5 deletions
diff --git a/crates/hir-def/src/db.rs b/crates/hir-def/src/db.rs index 5d2edf9f304..31c1a713031 100644 --- a/crates/hir-def/src/db.rs +++ b/crates/hir-def/src/db.rs @@ -83,9 +83,6 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + Upcast<dyn ExpandDataba fn file_item_tree(&self, file_id: HirFileId) -> Arc<ItemTree>; #[salsa::invoke(ItemTree::block_item_tree_query)] - // FIXME: Investigate memory usage increase if this were not transparent - // Also make sure to `shrink_to_fit` if you do - #[salsa::transparent] fn block_item_tree_query(&self, block_id: BlockId) -> Arc<ItemTree>; #[salsa::invoke(crate_def_map_wait)] diff --git a/crates/hir-def/src/item_tree.rs b/crates/hir-def/src/item_tree.rs index 62292779571..5734f1c67b6 100644 --- a/crates/hir-def/src/item_tree.rs +++ b/crates/hir-def/src/item_tree.rs @@ -148,7 +148,9 @@ impl ItemTree { let block = loc.ast_id.to_node(db.upcast()); let ctx = lower::Ctx::new(db, loc.ast_id.file_id); - Arc::new(ctx.lower_block(&block)) + let mut item_tree = ctx.lower_block(&block); + item_tree.shrink_to_fit(); + Arc::new(item_tree) } /// Returns an iterator over all items located at the top level of the `HirFileId` this @@ -383,7 +385,7 @@ impl TreeId { pub(crate) fn item_tree(&self, db: &dyn DefDatabase) -> Arc<ItemTree> { match self.block { - Some(block) => ItemTree::block_item_tree_query(db, block), + Some(block) => db.block_item_tree_query(block), None => db.file_item_tree(self.file), } } |
