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