Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/item_tree/lower.rs')
| -rw-r--r-- | crates/hir-def/src/item_tree/lower.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/crates/hir-def/src/item_tree/lower.rs b/crates/hir-def/src/item_tree/lower.rs index 77b186f8e3..49deff080e 100644 --- a/crates/hir-def/src/item_tree/lower.rs +++ b/crates/hir-def/src/item_tree/lower.rs @@ -101,6 +101,34 @@ impl<'a> Ctx<'a> { self.tree } + pub(super) fn block_has_items(mut self, block: &ast::BlockExpr) -> bool { + let statement_has_item = block + .statements() + .find_map(|stmt| match stmt { + ast::Stmt::Item(item) => self.lower_mod_item(&item), + // Macro calls can be both items and expressions. The syntax library always treats + // them as expressions here, so we undo that. + ast::Stmt::ExprStmt(es) => match es.expr()? { + ast::Expr::MacroExpr(expr) => self.lower_mod_item(&expr.macro_call()?.into()), + _ => None, + }, + _ => None, + }) + .is_some(); + if statement_has_item { + return true; + } + + if let Some(ast::Expr::MacroExpr(expr)) = block.tail_expr() { + if let Some(call) = expr.macro_call() { + if let Some(_) = self.lower_mod_item(&call.into()) { + return true; + } + } + } + false + } + fn data(&mut self) -> &mut ItemTreeData { self.tree.data_mut() } |