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.rs28
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()
}