diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-04-15 12:43:32 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-04-15 12:43:32 +0800 |
| commit | f029a51c1dd308ff8271c2be37d0fdc053552310 (patch) | |
| tree | 30704c833fe8ade5ea3bb1c0f71d286d37f013d8 | |
| parent | 5a60cb2edf9d9c6db19f74d27033febbd5abfbd9 (diff) | |
Add register_type macro and use it in chain and renderer macros
| -rw-r--r-- | mingling/src/lib.rs | 2 | ||||
| -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 |
4 files changed, 21 insertions, 5 deletions
diff --git a/mingling/src/lib.rs b/mingling/src/lib.rs index 5f45228..12d4a84 100644 --- a/mingling/src/lib.rs +++ b/mingling/src/lib.rs @@ -98,6 +98,8 @@ pub mod macros { pub use mingling_macros::r_print; /// Used to print content with a newline within a `Renderer` context pub use mingling_macros::r_println; + /// Used to register a type into the context + pub use mingling_macros::register_type; /// Used to generate a struct implementing the `Renderer` trait via a method pub use mingling_macros::renderer; #[cfg(feature = "comp")] 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; |
