// no-prefer-dynamic #![crate_type = "proc-macro"] #![feature(repr128, proc_macro_hygiene, proc_macro_quote)] #![allow(clippy::useless_conversion)] extern crate proc_macro; extern crate quote; extern crate syn; use proc_macro::TokenStream; use quote::{quote, quote_spanned}; use syn::parse_macro_input; use syn::{parse_quote, ItemTrait, TraitItem}; #[proc_macro_attribute] pub fn fake_async_trait(_args: TokenStream, input: TokenStream) -> TokenStream { let mut item = parse_macro_input!(input as ItemTrait); for inner in &mut item.items { if let TraitItem::Method(method) = inner { let sig = &method.sig; let block = &mut method.default; if let Some(block) = block { let brace = block.brace_token; let my_block = quote_spanned!( brace.span => { // Should not trigger `empty_line_after_outer_attr` #[crate_type = "lib"] #sig #block Vec::new() }); *block = parse_quote!(#my_block); } } } TokenStream::from(quote!(#item)) }