gix-macros 0.1.6

Proc-macro utilities for gix
Documentation
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
}