@@ -147,7 +147,7 @@ impl VisitMut for Scrub<'_> {
147
147
syn:: Expr :: ForLoop ( expr) => {
148
148
syn:: visit_mut:: visit_expr_for_loop_mut ( self , expr) ;
149
149
// TODO: Should we allow other attributes?
150
- if expr. attrs . len ( ) != 1 || !expr. attrs [ 0 ] . path . is_ident ( "await" ) {
150
+ if expr. attrs . len ( ) != 1 || !expr. attrs [ 0 ] . meta . path ( ) . is_ident ( AWAIT_ATTR_NAME ) {
151
151
return ;
152
152
}
153
153
let syn:: ExprForLoop {
@@ -159,11 +159,7 @@ impl VisitMut for Scrub<'_> {
159
159
..
160
160
} = expr;
161
161
162
- let attr = attrs. pop ( ) . unwrap ( ) ;
163
- if let Err ( e) = syn:: parse2 :: < syn:: parse:: Nothing > ( attr. tokens ) {
164
- * i = syn:: parse2 ( e. to_compile_error ( ) ) . unwrap ( ) ;
165
- return ;
166
- }
162
+ attrs. pop ( ) . unwrap ( ) ;
167
163
168
164
let crate_path = self . crate_path ;
169
165
* i = syn:: parse_quote! { {
@@ -270,6 +266,10 @@ pub fn try_stream_inner(input: TokenStream) -> TokenStream {
270
266
. into ( )
271
267
}
272
268
269
+ // syn 2.0 wont parse `#[await] for x in xs {}`
270
+ // because `await` is a keyword, use `await_` instead
271
+ const AWAIT_ATTR_NAME : & str = "await_" ;
272
+
273
273
/// Replace `for await` with `#[await] for`, which will be later transformed into a `next` loop.
274
274
fn replace_for_await ( input : impl IntoIterator < Item = TokenTree > ) -> TokenStream2 {
275
275
let mut input = input. into_iter ( ) . peekable ( ) ;
@@ -280,6 +280,8 @@ fn replace_for_await(input: impl IntoIterator<Item = TokenTree>) -> TokenStream2
280
280
TokenTree :: Ident ( ident) => {
281
281
match input. peek ( ) {
282
282
Some ( TokenTree :: Ident ( next) ) if ident == "for" && next == "await" => {
283
+ let next_span = next. span ( ) ;
284
+ let next = syn:: Ident :: new ( AWAIT_ATTR_NAME , next_span) ;
283
285
tokens. extend ( quote ! ( #[ #next] ) ) ;
284
286
let _ = input. next ( ) ;
285
287
}
0 commit comments