8322: Access a body's block def maps via a method r=jonas-schievink a=jonas-schievink

bors r+

Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
This commit is contained in:
bors[bot] 2021-04-04 01:04:44 +00:00 committed by GitHub
commit 4c8ee9a531
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 14 additions and 5 deletions

View File

@ -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<BlockId>,
block_scopes: Vec<BlockId>,
_c: Count<Self>,
}
@ -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<Item = (BlockId, Arc<DefMap>)> + '_ {
self.block_scopes
.iter()
.filter_map(move |block| db.block_def_map(*block).map(|map| (*block, map)))
}
fn new(
db: &dyn DefDatabase,
expander: Expander,

View File

@ -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);

View File

@ -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);

View File

@ -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);
}