1use proc_macro2::token_stream::TokenStream as TkStream;
8use syn::ItemTrait;
9
10mod simple_trait_info;
11mod trait_path_attrib;
12
13pub use simple_trait_info::SimpleTraitInfo;
15pub use trait_path_attrib::TraitPathAttrib;
17
18fn process_trait(trait_decl: ItemTrait) -> TkStream
20{
21 let traitvis = trait_decl.vis.clone();
22
23 let macrovis = if let syn::Visibility::Public(_) = traitvis {
24 quote::quote!{#[macro_export]}
25 }
26 else {quote::quote!{}};
27
28 let trait_macro_name = syn::Ident::new(format!("TraitInfo_{}", trait_decl.ident).as_str(), trait_decl.ident.span());
29
30 let simp_trait_info = SimpleTraitInfo::create(&trait_decl);
31
32 let base32hash_tinfo = simp_trait_info.hash_base32();
34 let trait_macro_name_real = syn::Ident::new(format!("TraitInfo{}_{}", base32hash_tinfo, trait_decl.ident).as_str(), trait_decl.ident.span());
35
36 quote::quote!(
37 #trait_decl
38
39 #macrovis
40 macro_rules! #trait_macro_name_real {
41 ($target_bridge_macro:ident, [ $($bridgecontent:tt)*]) => {
42 $target_bridge_macro!([$($bridgecontent)*],[ #simp_trait_info ]);
43 };
44 }
45
46 #traitvis use #trait_macro_name_real as #trait_macro_name;
47 )
48
49}
50
51pub fn trait_info_codegen(input:TkStream) -> TkStream
53{
54 let parse_status = syn::parse2::<ItemTrait>(input);
55 match parse_status {
56 syn::Result::Ok(tinfo) => {
57 process_trait(tinfo)
58 },
59 syn::Result::Err(errobj) =>{
60 errobj.into_compile_error()
61 }
62 }
63}
64