diff options
Diffstat (limited to 'crates/hir_def')
-rw-r--r-- | crates/hir_def/src/body.rs | 12 | ||||
-rw-r--r-- | crates/hir_def/src/child_by_source.rs | 2 |
2 files changed, 12 insertions, 2 deletions
diff --git a/crates/hir_def/src/body.rs b/crates/hir_def/src/body.rs index 1080d9c2c..ad3d5afbe 100644 --- a/crates/hir_def/src/body.rs +++ b/crates/hir_def/src/body.rs | |||
@@ -226,7 +226,7 @@ pub struct Body { | |||
226 | /// The `ExprId` of the actual body expression. | 226 | /// The `ExprId` of the actual body expression. |
227 | pub body_expr: ExprId, | 227 | pub body_expr: ExprId, |
228 | /// Block expressions in this body that may contain inner items. | 228 | /// Block expressions in this body that may contain inner items. |
229 | pub block_scopes: Vec<BlockId>, | 229 | block_scopes: Vec<BlockId>, |
230 | _c: Count<Self>, | 230 | _c: Count<Self>, |
231 | } | 231 | } |
232 | 232 | ||
@@ -310,6 +310,16 @@ impl Body { | |||
310 | db.body_with_source_map(def).0 | 310 | db.body_with_source_map(def).0 |
311 | } | 311 | } |
312 | 312 | ||
313 | /// Returns an iterator over all block expressions in this body that define inner items. | ||
314 | pub fn blocks<'a>( | ||
315 | &'a self, | ||
316 | db: &'a dyn DefDatabase, | ||
317 | ) -> impl Iterator<Item = (BlockId, Arc<DefMap>)> + '_ { | ||
318 | self.block_scopes | ||
319 | .iter() | ||
320 | .filter_map(move |block| db.block_def_map(*block).map(|map| (*block, map))) | ||
321 | } | ||
322 | |||
313 | fn new( | 323 | fn new( |
314 | db: &dyn DefDatabase, | 324 | db: &dyn DefDatabase, |
315 | expander: Expander, | 325 | expander: Expander, |
diff --git a/crates/hir_def/src/child_by_source.rs b/crates/hir_def/src/child_by_source.rs index 2a331dcaf..f40a7f80d 100644 --- a/crates/hir_def/src/child_by_source.rs +++ b/crates/hir_def/src/child_by_source.rs | |||
@@ -160,7 +160,7 @@ impl ChildBySource for EnumId { | |||
160 | impl ChildBySource for DefWithBodyId { | 160 | impl ChildBySource for DefWithBodyId { |
161 | fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap) { | 161 | fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap) { |
162 | let body = db.body(*self); | 162 | let body = db.body(*self); |
163 | for def_map in body.block_scopes.iter().filter_map(|block| db.block_def_map(*block)) { | 163 | for (_, def_map) in body.blocks(db) { |
164 | // All block expressions are merged into the same map, because they logically all add | 164 | // All block expressions are merged into the same map, because they logically all add |
165 | // inner items to the containing `DefWithBodyId`. | 165 | // inner items to the containing `DefWithBodyId`. |
166 | def_map[def_map.root()].scope.child_by_source_to(db, res); | 166 | def_map[def_map.root()].scope.child_by_source_to(db, res); |