diff options
Diffstat (limited to 'mingling_macros')
| -rw-r--r-- | mingling_macros/src/chain.rs | 7 | ||||
| -rw-r--r-- | mingling_macros/src/lib.rs | 13 | ||||
| -rw-r--r-- | mingling_macros/src/renderer.rs | 4 |
3 files changed, 19 insertions, 5 deletions
diff --git a/mingling_macros/src/chain.rs b/mingling_macros/src/chain.rs index f1be091..cf91738 100644 --- a/mingling_macros/src/chain.rs +++ b/mingling_macros/src/chain.rs @@ -122,6 +122,8 @@ pub fn chain_attr(attr: TokenStream, item: TokenStream) -> TokenStream { let pascal_case_name = just_fmt::pascal_case!(fn_name.to_string()); let struct_name = Ident::new(&pascal_case_name, fn_name.span()); + let previous_type_str = previous_type.to_token_stream().to_string(); + // Generate the struct and implementation let expanded = if use_crate_prefix { quote! { @@ -129,6 +131,8 @@ pub fn chain_attr(attr: TokenStream, item: TokenStream) -> TokenStream { #[doc(hidden)] #vis struct #struct_name; + ::mingling::macros::register_type!(#previous_type_str); + impl ::mingling::Chain<ThisProgram> for #struct_name { type Previous = #previous_type; @@ -182,15 +186,12 @@ pub fn chain_attr(attr: TokenStream, item: TokenStream) -> TokenStream { let mut chains = crate::CHAINS.lock().unwrap(); let mut chain_exist = crate::CHAINS_EXIST.lock().unwrap(); - let mut packed_types = crate::PACKED_TYPES.lock().unwrap(); let chain_entry = chain_entry.to_string(); let chain_exist_entry = chain_exist_entry.to_string(); - let previous_type_str = previous_type.to_token_stream().to_string(); chains.insert(chain_entry); chain_exist.insert(chain_exist_entry); - packed_types.insert(previous_type_str); expanded.into() } diff --git a/mingling_macros/src/lib.rs b/mingling_macros/src/lib.rs index da431d5..ffcf7e9 100644 --- a/mingling_macros/src/lib.rs +++ b/mingling_macros/src/lib.rs @@ -167,6 +167,19 @@ pub fn program_gen_completion(input: TokenStream) -> TokenStream { TokenStream::from(comp_dispatcher) } +/// Internal macro for registering types. +/// +/// This macro is used internally by the `#[chain]` and `#[renderer]` attribute macros +#[proc_macro] +pub fn register_type(input: TokenStream) -> TokenStream { + let type_entry = parse_macro_input!(input as syn::LitStr); + let entry_str = type_entry.value(); + + PACKED_TYPES.lock().unwrap().insert(entry_str); + + TokenStream::new() +} + #[proc_macro] pub fn program_final_gen(input: TokenStream) -> TokenStream { let name = read_name(&input); diff --git a/mingling_macros/src/renderer.rs b/mingling_macros/src/renderer.rs index 26e7aa9..dc00bc9 100644 --- a/mingling_macros/src/renderer.rs +++ b/mingling_macros/src/renderer.rs @@ -108,7 +108,6 @@ pub fn renderer_attr(item: TokenStream) -> TokenStream { let mut renderers = crate::RENDERERS.lock().unwrap(); let mut renderer_exist = crate::RENDERERS_EXIST.lock().unwrap(); - let mut packed_types = crate::PACKED_TYPES.lock().unwrap(); #[cfg(feature = "general_renderer")] let mut general_renderers = crate::GENERAL_RENDERERS.lock().unwrap(); @@ -122,7 +121,6 @@ pub fn renderer_attr(item: TokenStream) -> TokenStream { renderers.insert(renderer_entry_str); renderer_exist.insert(renderer_exist_entry_str); - packed_types.insert(previous_type_str); #[cfg(feature = "general_renderer")] general_renderers.insert(general_renderer_entry_str); @@ -134,6 +132,8 @@ pub fn renderer_attr(item: TokenStream) -> TokenStream { #[doc(hidden)] #vis struct #struct_name; + ::mingling::macros::register_type!(#previous_type_str); + impl ::mingling::Renderer for #struct_name { type Previous = #previous_type; |
