From d8bf9bef800969304440fd2a2a324606a342eaa2 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Sun, 4 Apr 2021 03:03:18 +0200 Subject: Access a body's block def maps via a method --- crates/hir_def/src/body.rs | 12 +++++++++++- crates/hir_def/src/child_by_source.rs | 2 +- crates/hir_ty/src/diagnostics/decl_check.rs | 3 +-- crates/hir_ty/src/tests.rs | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) (limited to 'crates') 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 { /// The `ExprId` of the actual body expression. pub body_expr: ExprId, /// Block expressions in this body that may contain inner items. - pub block_scopes: Vec, + block_scopes: Vec, _c: Count, } @@ -310,6 +310,16 @@ impl Body { db.body_with_source_map(def).0 } + /// Returns an iterator over all block expressions in this body that define inner items. + pub fn blocks<'a>( + &'a self, + db: &'a dyn DefDatabase, + ) -> impl Iterator)> + '_ { + self.block_scopes + .iter() + .filter_map(move |block| db.block_def_map(*block).map(|map| (*block, map))) + } + fn new( db: &dyn DefDatabase, 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 { impl ChildBySource for DefWithBodyId { fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap) { let body = db.body(*self); - for def_map in body.block_scopes.iter().filter_map(|block| db.block_def_map(*block)) { + for (_, def_map) in body.blocks(db) { // All block expressions are merged into the same map, because they logically all add // inner items to the containing `DefWithBodyId`. def_map[def_map.root()].scope.child_by_source_to(db, res); diff --git a/crates/hir_ty/src/diagnostics/decl_check.rs b/crates/hir_ty/src/diagnostics/decl_check.rs index 207c7cb82..1c9f9ede7 100644 --- a/crates/hir_ty/src/diagnostics/decl_check.rs +++ b/crates/hir_ty/src/diagnostics/decl_check.rs @@ -99,8 +99,7 @@ impl<'a, 'b> DeclValidator<'a, 'b> { let body = self.db.body(func.into()); // Recursively validate inner scope items, such as static variables and constants. - let db = self.db; - for block_def_map in body.block_scopes.iter().filter_map(|block| db.block_def_map(*block)) { + for (_, block_def_map) in body.blocks(self.db.upcast()) { for (_, module) in block_def_map.modules() { for def_id in module.scope.declarations() { let mut validator = DeclValidator::new(self.db, self.krate, self.sink); diff --git a/crates/hir_ty/src/tests.rs b/crates/hir_ty/src/tests.rs index ad283c1e0..ccfb88c52 100644 --- a/crates/hir_ty/src/tests.rs +++ b/crates/hir_ty/src/tests.rs @@ -288,7 +288,7 @@ fn visit_module( } fn visit_body(db: &TestDB, body: &Body, cb: &mut dyn FnMut(DefWithBodyId)) { - for def_map in body.block_scopes.iter().filter_map(|block| db.block_def_map(*block)) { + for (_, def_map) in body.blocks(db) { for (mod_id, _) in def_map.modules() { visit_module(db, &def_map, mod_id, cb); } -- cgit v1.2.3