diff --git a/crates/hir-def/src/body/lower.rs b/crates/hir-def/src/body/lower.rs index cb6fdbfc56..8ebac5cb1c 100644 --- a/crates/hir-def/src/body/lower.rs +++ b/crates/hir-def/src/body/lower.rs @@ -628,8 +628,9 @@ impl ExprCollector<'_> { fn collect_macro_as_stmt( &mut self, + statements: &mut Vec, mac: ast::MacroExpr, - ) -> Option<(Vec, Option)> { + ) -> Option { let mac_call = mac.macro_call()?; let syntax_ptr = AstPtr::new(&ast::Expr::from(mac)); let macro_ptr = AstPtr::new(&mac_call); @@ -639,49 +640,32 @@ impl ExprCollector<'_> { false, |this, expansion: Option| match expansion { Some(expansion) => { - let mut statements: Vec<_> = expansion - .statements() - .filter_map(|stmt| this.collect_stmt(stmt)) - .flatten() - .collect(); - let tail = expansion.expr().and_then(|expr| match expr { - ast::Expr::MacroExpr(mac) => { - let (stmts, tail) = this.collect_macro_as_stmt(mac)?; - statements.extend(stmts); - tail - } + expansion.statements().for_each(|stmt| this.collect_stmt(statements, stmt)); + expansion.expr().and_then(|expr| match expr { + ast::Expr::MacroExpr(mac) => this.collect_macro_as_stmt(statements, mac), expr => Some(this.collect_expr(expr)), - }); - Some((statements, tail)) + }) } None => None, }, ); - let mut stmts = Vec::new(); - let expr = match expansion { - Some((statements, tail)) => { - stmts.extend(statements); + match expansion { + Some(tail) => { // Make the macro-call point to its expanded expression so we can query // semantics on syntax pointers to the macro let src = self.expander.to_source(syntax_ptr); - match tail { - Some(tail) => { - self.source_map.expr_map.insert(src, tail); - tail - } - None => self.make_expr(Expr::Missing, Ok(src.clone())), - } + self.source_map.expr_map.insert(src, tail); + Some(tail) } - None => self.alloc_expr(Expr::Missing, syntax_ptr), - }; - Some((stmts, Some(expr))) + None => None, + } } - fn collect_stmt(&mut self, s: ast::Stmt) -> Option> { + fn collect_stmt(&mut self, statements: &mut Vec, s: ast::Stmt) { match s { ast::Stmt::LetStmt(stmt) => { if self.check_cfg(&stmt).is_none() { - return None; + return; } let pat = self.collect_pat_opt(stmt.pat()); let type_ref = @@ -691,29 +675,26 @@ impl ExprCollector<'_> { .let_else() .and_then(|let_else| let_else.block_expr()) .map(|block| self.collect_block(block)); - Some(vec![Statement::Let { pat, type_ref, initializer, else_branch }]) + statements.push(Statement::Let { pat, type_ref, initializer, else_branch }); } ast::Stmt::ExprStmt(stmt) => { let expr = stmt.expr(); - if let Some(expr) = &expr { - if self.check_cfg(expr).is_none() { - return None; - } + match &expr { + Some(expr) if self.check_cfg(expr).is_none() => return, + _ => (), } let has_semi = stmt.semicolon_token().is_some(); // Note that macro could be expanded to multiple statements if let Some(ast::Expr::MacroExpr(mac)) = expr { - let (mut statements, tail) = self.collect_macro_as_stmt(mac)?; - if let Some(expr) = tail { - statements.push(Statement::Expr { expr, has_semi }); + if let Some(expr) = self.collect_macro_as_stmt(statements, mac) { + statements.push(Statement::Expr { expr, has_semi }) } - Some(statements) } else { let expr = self.collect_expr_opt(expr); - Some(vec![Statement::Expr { expr, has_semi }]) + statements.push(Statement::Expr { expr, has_semi }); } } - ast::Stmt::Item(_item) => None, + ast::Stmt::Item(_item) => (), } } @@ -734,14 +715,10 @@ impl ExprCollector<'_> { let prev_def_map = mem::replace(&mut self.expander.def_map, def_map); let prev_local_module = mem::replace(&mut self.expander.module, module); - let mut statements: Vec<_> = - block.statements().filter_map(|s| self.collect_stmt(s)).flatten().collect(); + let mut statements = Vec::new(); + block.statements().for_each(|s| self.collect_stmt(&mut statements, s)); let tail = block.tail_expr().and_then(|e| match e { - ast::Expr::MacroExpr(mac) => { - let (stmts, tail) = self.collect_macro_as_stmt(mac)?; - statements.extend(stmts); - tail - } + ast::Expr::MacroExpr(mac) => self.collect_macro_as_stmt(&mut statements, mac), expr => self.maybe_collect_expr(expr), }); let tail = tail.or_else(|| { diff --git a/crates/hir-ty/src/tests/macros.rs b/crates/hir-ty/src/tests/macros.rs index a1a2fdd1fb..b3adafaafd 100644 --- a/crates/hir-ty/src/tests/macros.rs +++ b/crates/hir-ty/src/tests/macros.rs @@ -311,7 +311,6 @@ fn expr_macro_expanded_in_stmts() { !3..4 'a': () !5..7 '()': () 57..84 '{ ...); } }': () - 63..82 'id! { ... (); }': () "#]], ); } @@ -336,7 +335,6 @@ fn recursive_macro_expanded_in_stmts() { } "#, expect![[r#" - !0..13 'ng!{[leta=3]}': {unknown} !3..4 'a': i32 !5..6 '3': i32 196..237 '{ ...= a; }': () @@ -361,7 +359,6 @@ fn recursive_inner_item_macro_rules() { "#, expect![[r#" !0..1 '1': i32 - !0..7 'mac!($)': {unknown} 107..143 '{ ...!(); }': () 129..130 'a': i32 "#]], diff --git a/crates/hir-ty/src/tests/regression.rs b/crates/hir-ty/src/tests/regression.rs index cc49c3d45f..23e51a9c16 100644 --- a/crates/hir-ty/src/tests/regression.rs +++ b/crates/hir-ty/src/tests/regression.rs @@ -578,7 +578,6 @@ fn issue_6811() { !11..13 '_b': i32 !14..15 '1': i32 103..131 '{ ...!(); }': () - 109..128 'profil...ion!()': {unknown} "#]], ); } diff --git a/crates/hir-ty/src/tests/simple.rs b/crates/hir-ty/src/tests/simple.rs index 5b08f55210..707e9e8450 100644 --- a/crates/hir-ty/src/tests/simple.rs +++ b/crates/hir-ty/src/tests/simple.rs @@ -2549,7 +2549,6 @@ impl B for Astruct {} expect![[r#" 569..573 'self': Box<[T], A> 602..634 '{ ... }': Vec - 612..628 'unimpl...ted!()': Vec 648..761 '{ ...t]); }': () 658..661 'vec': Vec 664..679 '<[_]>::into_vec': fn into_vec(Box<[i32], Global>) -> Vec