1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
mod impls; mod input; mod methods; mod traits; use macro_compose::{Collector, Context}; use proc_macro::TokenStream; use quote::format_ident; use syn::{parse_quote, Ident, ItemTrait}; #[proc_macro_attribute] pub fn async_trait_ext(input: TokenStream, item: TokenStream) -> TokenStream { let input: proc_macro2::TokenStream = input.into(); let item: proc_macro2::TokenStream = item.into(); let combined: proc_macro2::TokenStream = parse_quote!(#[async_trait_ext( #input )] #item); let mut collector = Collector::new(); let mut trait_context = Context::<ItemTrait>::new_parse2(&mut collector, combined); trait_context.lint(&traits::AttributeLint); trait_context.lint(&methods::MethodAttrLint); trait_context.expand(&traits::PollTraitExpand); trait_context.expand(&traits::ExtensionTraitExpand); trait_context.expand(&impls::ImplExtTraitExpand); collector.finish().into() } fn ext_trait_name(input: &ItemTrait) -> Ident { format_ident!("{}Ext", input.ident) }