aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_def/src/item_tree.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_def/src/item_tree.rs')
-rw-r--r--crates/hir_def/src/item_tree.rs28
1 files changed, 11 insertions, 17 deletions
diff --git a/crates/hir_def/src/item_tree.rs b/crates/hir_def/src/item_tree.rs
index ff62928df..6494cebd3 100644
--- a/crates/hir_def/src/item_tree.rs
+++ b/crates/hir_def/src/item_tree.rs
@@ -69,13 +69,12 @@ impl GenericParamsId {
69pub struct ItemTree { 69pub struct ItemTree {
70 top_level: SmallVec<[ModItem; 1]>, 70 top_level: SmallVec<[ModItem; 1]>,
71 attrs: FxHashMap<AttrOwner, RawAttrs>, 71 attrs: FxHashMap<AttrOwner, RawAttrs>,
72 inner_items: FxHashMap<FileAstId<ast::Item>, SmallVec<[ModItem; 1]>>,
73 72
74 data: Option<Box<ItemTreeData>>, 73 data: Option<Box<ItemTreeData>>,
75} 74}
76 75
77impl ItemTree { 76impl ItemTree {
78 pub fn item_tree_query(db: &dyn DefDatabase, file_id: HirFileId) -> Arc<ItemTree> { 77 pub(crate) fn item_tree_query(db: &dyn DefDatabase, file_id: HirFileId) -> Arc<ItemTree> {
79 let _p = profile::span("item_tree_query").detail(|| format!("{:?}", file_id)); 78 let _p = profile::span("item_tree_query").detail(|| format!("{:?}", file_id));
80 let syntax = if let Some(node) = db.parse_or_expand(file_id) { 79 let syntax = if let Some(node) = db.parse_or_expand(file_id) {
81 node 80 node
@@ -117,12 +116,7 @@ impl ItemTree {
117 } 116 }
118 117
119 fn empty() -> Self { 118 fn empty() -> Self {
120 Self { 119 Self { top_level: Default::default(), attrs: Default::default(), data: Default::default() }
121 top_level: Default::default(),
122 attrs: Default::default(),
123 inner_items: Default::default(),
124 data: Default::default(),
125 }
126 } 120 }
127 121
128 fn shrink_to_fit(&mut self) { 122 fn shrink_to_fit(&mut self) {
@@ -147,6 +141,7 @@ impl ItemTree {
147 macro_defs, 141 macro_defs,
148 vis, 142 vis,
149 generics, 143 generics,
144 inner_items,
150 } = &mut **data; 145 } = &mut **data;
151 146
152 imports.shrink_to_fit(); 147 imports.shrink_to_fit();
@@ -169,6 +164,8 @@ impl ItemTree {
169 164
170 vis.arena.shrink_to_fit(); 165 vis.arena.shrink_to_fit();
171 generics.arena.shrink_to_fit(); 166 generics.arena.shrink_to_fit();
167
168 inner_items.shrink_to_fit();
172 } 169 }
173 } 170 }
174 171
@@ -191,16 +188,11 @@ impl ItemTree {
191 self.raw_attrs(of).clone().filter(db, krate) 188 self.raw_attrs(of).clone().filter(db, krate)
192 } 189 }
193 190
194 /// Returns the lowered inner items that `ast` corresponds to.
195 ///
196 /// Most AST items are lowered to a single `ModItem`, but some (eg. `use` items) may be lowered
197 /// to multiple items in the `ItemTree`.
198 pub fn inner_items(&self, ast: FileAstId<ast::Item>) -> &[ModItem] {
199 &self.inner_items[&ast]
200 }
201
202 pub fn all_inner_items(&self) -> impl Iterator<Item = ModItem> + '_ { 191 pub fn all_inner_items(&self) -> impl Iterator<Item = ModItem> + '_ {
203 self.inner_items.values().flatten().copied() 192 match &self.data {
193 Some(data) => Some(data.inner_items.values().flatten().copied()).into_iter().flatten(),
194 None => None.into_iter().flatten(),
195 }
204 } 196 }
205 197
206 pub fn source<S: ItemTreeNode>(&self, db: &dyn DefDatabase, of: ItemTreeId<S>) -> S::Source { 198 pub fn source<S: ItemTreeNode>(&self, db: &dyn DefDatabase, of: ItemTreeId<S>) -> S::Source {
@@ -297,6 +289,8 @@ struct ItemTreeData {
297 289
298 vis: ItemVisibilities, 290 vis: ItemVisibilities,
299 generics: GenericParamsStorage, 291 generics: GenericParamsStorage,
292
293 inner_items: FxHashMap<FileAstId<ast::BlockExpr>, SmallVec<[ModItem; 1]>>,
300} 294}
301 295
302#[derive(Debug, Eq, PartialEq, Hash)] 296#[derive(Debug, Eq, PartialEq, Hash)]