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}