@@ -13,6 +13,7 @@ struct AsyncStreamImpl {
1313}
1414
1515struct Scrub {
16+ is_xforming : bool ,
1617 is_try : bool ,
1718 yielder : syn:: Ident ,
1819 unit : Box < syn:: Expr > ,
@@ -39,6 +40,11 @@ impl Parse for AsyncStreamImpl {
3940
4041impl VisitMut for Scrub {
4142 fn visit_expr_mut ( & mut self , i : & mut syn:: Expr ) {
43+ if !self . is_xforming {
44+ syn:: visit_mut:: visit_expr_mut ( self , i) ;
45+ return ;
46+ }
47+
4248 match i {
4349 syn:: Expr :: Yield ( yield_expr) => {
4450 self . num_yield += 1 ;
@@ -71,9 +77,23 @@ impl VisitMut for Scrub {
7177 }
7278 } ;
7379 }
74- expr => syn:: visit_mut:: visit_expr_mut ( self , expr) ,
80+ syn:: Expr :: Closure ( _) |
81+ syn:: Expr :: Async ( _) => {
82+ let prev = self . is_xforming ;
83+ self . is_xforming = false ;
84+ syn:: visit_mut:: visit_expr_mut ( self , i) ;
85+ self . is_xforming = prev;
86+ }
87+ _ => syn:: visit_mut:: visit_expr_mut ( self , i) ,
7588 }
7689 }
90+
91+ fn visit_item_mut ( & mut self , i : & mut syn:: Item ) {
92+ let prev = self . is_xforming ;
93+ self . is_xforming = false ;
94+ syn:: visit_mut:: visit_item_mut ( self , i) ;
95+ self . is_xforming = prev;
96+ }
7797}
7898
7999#[ proc_macro_hack]
@@ -84,6 +104,7 @@ pub fn async_stream_impl(input: TokenStream) -> TokenStream {
84104 } = syn:: parse_macro_input!( input as AsyncStreamImpl ) ;
85105
86106 let mut scrub = Scrub {
107+ is_xforming : true ,
87108 is_try : false ,
88109 yielder,
89110 unit : syn:: parse_quote!( ( ) ) ,
@@ -119,6 +140,7 @@ pub fn async_try_stream_impl(input: TokenStream) -> TokenStream {
119140 } = syn:: parse_macro_input!( input as AsyncStreamImpl ) ;
120141
121142 let mut scrub = Scrub {
143+ is_xforming : true ,
122144 is_try : true ,
123145 yielder,
124146 unit : syn:: parse_quote!( ( ) ) ,
0 commit comments