@@ -74,6 +74,7 @@ pub(super) fn lower(
7474 _c : Count :: new ( ) ,
7575 } ,
7676 expander,
77+ statements_in_scope : Vec :: new ( ) ,
7778 }
7879 . collect ( params, body)
7980}
@@ -83,6 +84,7 @@ struct ExprCollector<'a> {
8384 expander : Expander ,
8485 body : Body ,
8586 source_map : BodySourceMap ,
87+ statements_in_scope : Vec < Statement > ,
8688}
8789
8890impl ExprCollector < ' _ > {
@@ -533,15 +535,13 @@ impl ExprCollector<'_> {
533535 ids[ 0 ]
534536 }
535537 ast:: Expr :: MacroStmts ( e) => {
536- // FIXME: these statements should be held by some hir containter
537- for stmt in e. statements ( ) {
538- self . collect_stmt ( stmt) ;
539- }
540- if let Some ( expr) = e. expr ( ) {
541- self . collect_expr ( expr)
542- } else {
543- self . alloc_expr ( Expr :: Missing , syntax_ptr)
544- }
538+ e. statements ( ) . for_each ( |s| self . collect_stmt ( s) ) ;
539+ let tail = e
540+ . expr ( )
541+ . map ( |e| self . collect_expr ( e) )
542+ . unwrap_or_else ( || self . alloc_expr ( Expr :: Missing , syntax_ptr. clone ( ) ) ) ;
543+
544+ self . alloc_expr ( Expr :: MacroStmts { tail } , syntax_ptr)
545545 }
546546 } )
547547 }
@@ -618,58 +618,54 @@ impl ExprCollector<'_> {
618618 }
619619 }
620620
621- fn collect_stmt ( & mut self , s : ast:: Stmt ) -> Option < Vec < Statement > > {
622- let stmt = match s {
621+ fn collect_stmt ( & mut self , s : ast:: Stmt ) {
622+ match s {
623623 ast:: Stmt :: LetStmt ( stmt) => {
624- self . check_cfg ( & stmt) ?;
625-
624+ if self . check_cfg ( & stmt) . is_none ( ) {
625+ return ;
626+ }
626627 let pat = self . collect_pat_opt ( stmt. pat ( ) ) ;
627628 let type_ref = stmt. ty ( ) . map ( |it| TypeRef :: from_ast ( & self . ctx ( ) , it) ) ;
628629 let initializer = stmt. initializer ( ) . map ( |e| self . collect_expr ( e) ) ;
629- vec ! [ Statement :: Let { pat, type_ref, initializer } ]
630+ self . statements_in_scope . push ( Statement :: Let { pat, type_ref, initializer } ) ;
630631 }
631632 ast:: Stmt :: ExprStmt ( stmt) => {
632- self . check_cfg ( & stmt) ?;
633+ if self . check_cfg ( & stmt) . is_none ( ) {
634+ return ;
635+ }
633636
634637 // Note that macro could be expended to multiple statements
635638 if let Some ( ast:: Expr :: MacroCall ( m) ) = stmt. expr ( ) {
636639 let syntax_ptr = AstPtr :: new ( & stmt. expr ( ) . unwrap ( ) ) ;
637- let mut stmts = vec ! [ ] ;
638640
639641 self . collect_macro_call ( m, syntax_ptr. clone ( ) , false , |this, expansion| {
640642 match expansion {
641643 Some ( expansion) => {
642644 let statements: ast:: MacroStmts = expansion;
643645
644- statements. statements ( ) . for_each ( |stmt| {
645- if let Some ( mut r) = this. collect_stmt ( stmt) {
646- stmts. append ( & mut r) ;
647- }
648- } ) ;
646+ statements. statements ( ) . for_each ( |stmt| this. collect_stmt ( stmt) ) ;
649647 if let Some ( expr) = statements. expr ( ) {
650- stmts. push ( Statement :: Expr ( this. collect_expr ( expr) ) ) ;
648+ let expr = this. collect_expr ( expr) ;
649+ this. statements_in_scope . push ( Statement :: Expr ( expr) ) ;
651650 }
652651 }
653652 None => {
654- stmts. push ( Statement :: Expr (
655- this. alloc_expr ( Expr :: Missing , syntax_ptr. clone ( ) ) ,
656- ) ) ;
653+ let expr = this. alloc_expr ( Expr :: Missing , syntax_ptr. clone ( ) ) ;
654+ this. statements_in_scope . push ( Statement :: Expr ( expr) ) ;
657655 }
658656 }
659657 } ) ;
660- stmts
661658 } else {
662- vec ! [ Statement :: Expr ( self . collect_expr_opt( stmt. expr( ) ) ) ]
659+ let expr = self . collect_expr_opt ( stmt. expr ( ) ) ;
660+ self . statements_in_scope . push ( Statement :: Expr ( expr) ) ;
663661 }
664662 }
665663 ast:: Stmt :: Item ( item) => {
666- self . check_cfg ( & item) ? ;
667-
668- return None ;
664+ if self . check_cfg ( & item) . is_none ( ) {
665+ return ;
666+ }
669667 }
670- } ;
671-
672- Some ( stmt)
668+ }
673669 }
674670
675671 fn collect_block ( & mut self , block : ast:: BlockExpr ) -> ExprId {
@@ -685,10 +681,12 @@ impl ExprCollector<'_> {
685681 let module = if has_def_map { def_map. root ( ) } else { self . expander . module } ;
686682 let prev_def_map = mem:: replace ( & mut self . expander . def_map , def_map) ;
687683 let prev_local_module = mem:: replace ( & mut self . expander . module , module) ;
684+ let prev_statements = std:: mem:: take ( & mut self . statements_in_scope ) ;
685+
686+ block. statements ( ) . for_each ( |s| self . collect_stmt ( s) ) ;
688687
689- let statements =
690- block. statements ( ) . filter_map ( |s| self . collect_stmt ( s) ) . flatten ( ) . collect ( ) ;
691688 let tail = block. tail_expr ( ) . map ( |e| self . collect_expr ( e) ) ;
689+ let statements = std:: mem:: replace ( & mut self . statements_in_scope , prev_statements) ;
692690 let syntax_node_ptr = AstPtr :: new ( & block. into ( ) ) ;
693691 let expr_id = self . alloc_expr (
694692 Expr :: Block { id : block_id, statements, tail, label : None } ,
0 commit comments