deasync/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4
5use proc_macro2::TokenStream as TokenStream2;
6use syn::{parse_macro_input, ImplItem, TraitItem};
7
8use quote::quote;
9
10mod parse;
11mod visit;
12
13fn deasync_input(input: &mut parse::Item) -> TokenStream2 {
14    match input {
15        parse::Item::Impl(item) => {
16            for inner in &mut item.items {
17                if let ImplItem::Method(ref mut method) = inner {
18                    method.sig.asyncness = None;
19                }
20            }
21            visit::AsyncAwaitRemoval.remove_async_await(quote!(#item))
22        }
23        parse::Item::Trait(item) => {
24            for inner in &mut item.items {
25                if let TraitItem::Method(ref mut method) = inner {
26                    method.sig.asyncness = None;
27                }
28            }
29            visit::AsyncAwaitRemoval.remove_async_await(quote!(#item))
30        }
31        parse::Item::Fn(item) => {
32            item.sig.asyncness = None;
33            visit::AsyncAwaitRemoval.remove_async_await(quote!(#item))
34        }
35    }
36    .into()
37}
38
39#[proc_macro_attribute]
40pub fn deasync(_args: TokenStream, input: TokenStream) -> TokenStream {
41    if !cfg!(feature = "bypass") {
42        let mut item = parse_macro_input!(input as parse::Item);
43        deasync_input(&mut item).into()
44    } else {
45        input
46    }
47}