use proc_macro2::{Group, TokenStream, TokenTree}; pub(crate) fn sync(input: TokenStream) -> TokenStream { let mut output = TokenStream::new(); let mut tokens = input.into_iter().peekable(); while let Some(token) = tokens.next() { match token { TokenTree::Group(group) => { let mut replacement = Group::new(group.delimiter(), sync(group.stream())); replacement.set_span(group.span()); output.extend([TokenTree::Group(replacement)]); } TokenTree::Ident(ident) if ident == "async" => { if matches!(tokens.peek(), Some(TokenTree::Ident(ident)) if ident == "move") { let move_token = tokens.next(); if matches!(tokens.peek(), Some(TokenTree::Punct(punct)) if punct.as_char() == '|') { output.extend(move_token); } } } TokenTree::Punct(punct) if punct.as_char() == '.' && matches!(tokens.peek(), Some(TokenTree::Ident(ident)) if ident == "await") => { tokens.next(); } token => output.extend([token]), } } output }