From 6f66a3158f4a4b2bca42ec385abefbf4011618cc Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Mon, 20 Apr 2026 14:06:38 +0800 Subject: Move type registration to pack! and Groupped macros --- mingling_macros/src/chain.rs | 5 +--- mingling_macros/src/groupped.rs | 2 ++ mingling_macros/src/lib.rs | 54 ++++++++++++----------------------------- mingling_macros/src/pack.rs | 6 +++++ mingling_macros/src/renderer.rs | 5 +--- 5 files changed, 26 insertions(+), 46 deletions(-) (limited to 'mingling_macros/src') diff --git a/mingling_macros/src/chain.rs b/mingling_macros/src/chain.rs index fe48b59..7894362 100644 --- a/mingling_macros/src/chain.rs +++ b/mingling_macros/src/chain.rs @@ -297,8 +297,5 @@ pub fn register_chain(input: TokenStream) -> TokenStream { chains.insert(chain_entry_str); chain_exist.insert(chain_exist_entry_str); - quote! { - ::mingling::macros::register_type!(#previous_type); - } - .into() + quote! {}.into() } diff --git a/mingling_macros/src/groupped.rs b/mingling_macros/src/groupped.rs index 5e0c3e9..980c08a 100644 --- a/mingling_macros/src/groupped.rs +++ b/mingling_macros/src/groupped.rs @@ -70,6 +70,8 @@ pub fn derive_groupped_serialize(input: TokenStream) -> TokenStream { #[derive(serde::Serialize)] #input_parsed + ::mingling::macros::register_type!(#struct_name); + impl ::mingling::Groupped<#group_ident> for #struct_name { fn member_id() -> #group_ident { #group_ident::#struct_name diff --git a/mingling_macros/src/lib.rs b/mingling_macros/src/lib.rs index 4ae9e43..8df8ad7 100644 --- a/mingling_macros/src/lib.rs +++ b/mingling_macros/src/lib.rs @@ -116,11 +116,13 @@ pub fn gen_program(input: TokenStream) -> TokenStream { #[cfg(feature = "comp")] let out = TokenStream::from(quote! { - ::mingling::macros::program_gen_completion!(#name); + ::mingling::macros::program_comp_gen!(#name); + ::mingling::macros::program_fallback_gen!(#name); ::mingling::macros::program_final_gen!(#name); }); #[cfg(not(feature = "comp"))] let out = TokenStream::from(quote! { + ::mingling::macros::program_fallback_gen!(#name); ::mingling::macros::program_final_gen!(#name); }); @@ -129,7 +131,7 @@ pub fn gen_program(input: TokenStream) -> TokenStream { #[proc_macro] #[cfg(feature = "comp")] -pub fn program_gen_completion(input: TokenStream) -> TokenStream { +pub fn program_comp_gen(input: TokenStream) -> TokenStream { let name = read_name(&input); #[cfg(feature = "async")] @@ -209,13 +211,22 @@ pub fn register_renderer(input: TokenStream) -> TokenStream { renderer::register_renderer(input) } +#[proc_macro] +pub fn program_fallback_gen(input: TokenStream) -> TokenStream { + let name = read_name(&input); + + let expanded = quote! { + ::mingling::macros::pack!(#name, RendererNotFound = String); + ::mingling::macros::pack!(#name, DispatcherNotFound = Vec); + }; + TokenStream::from(expanded) +} + #[proc_macro] pub fn program_final_gen(input: TokenStream) -> TokenStream { let name = read_name(&input); - let mut packed_types = PACKED_TYPES.lock().unwrap().clone(); - packed_types.insert("DispatcherNotFound".to_string()); - packed_types.insert("RendererNotFound".to_string()); + let packed_types = PACKED_TYPES.lock().unwrap().clone(); let renderers = RENDERERS.lock().unwrap().clone(); let chains = CHAINS.lock().unwrap().clone(); @@ -295,9 +306,6 @@ pub fn program_final_gen(input: TokenStream) -> TokenStream { let comp = quote! {}; let expanded = quote! { - ::mingling::macros::pack!(#name, RendererNotFound = String); - ::mingling::macros::pack!(#name, DispatcherNotFound = Vec); - #[derive(Debug, Default, PartialEq, Eq, Clone)] #[repr(u32)] pub enum #name { @@ -355,36 +363,6 @@ pub fn program_final_gen(input: TokenStream) -> TokenStream { TokenStream::from(expanded) } -/// Internal macro for registering chains. -/// -/// This macro is used internally by the `#[chain]` attribute macro -/// and should not be used directly. -#[doc(hidden)] -#[proc_macro] -pub fn __register_chain(input: TokenStream) -> TokenStream { - let chain_entry = parse_macro_input!(input as syn::LitStr); - let entry_str = chain_entry.value(); - - CHAINS.lock().unwrap().insert(entry_str); - - TokenStream::new() -} - -/// Internal macro for registering renderers. -/// -/// This macro is used internally by the `#[renderer]` attribute macro -/// and should not be used directly. -#[doc(hidden)] -#[proc_macro] -pub fn __register_renderer(input: TokenStream) -> TokenStream { - let renderer_entry = parse_macro_input!(input as syn::LitStr); - let entry_str = renderer_entry.value(); - - RENDERERS.lock().unwrap().insert(entry_str); - - TokenStream::new() -} - #[cfg(feature = "comp")] #[proc_macro] pub fn suggest(input: TokenStream) -> TokenStream { diff --git a/mingling_macros/src/pack.rs b/mingling_macros/src/pack.rs index 226dc35..9da16de 100644 --- a/mingling_macros/src/pack.rs +++ b/mingling_macros/src/pack.rs @@ -162,6 +162,10 @@ pub fn pack(input: TokenStream) -> TokenStream { } }; + let register_impl = quote! { + ::mingling::macros::register_type!(#type_name); + }; + let any_out_impl = quote! { impl Into> for #type_name { fn into(self) -> mingling::AnyOutput<#group_name> { @@ -207,6 +211,7 @@ pub fn pack(input: TokenStream) -> TokenStream { #as_ref_impl #deref_impl #default_impl + #register_impl impl Into> for #type_name { fn into(self) -> mingling::AnyOutput { @@ -248,6 +253,7 @@ pub fn pack(input: TokenStream) -> TokenStream { #as_ref_impl #deref_impl #default_impl + #register_impl #any_out_impl #group_impl diff --git a/mingling_macros/src/renderer.rs b/mingling_macros/src/renderer.rs index a3da2e7..38d7930 100644 --- a/mingling_macros/src/renderer.rs +++ b/mingling_macros/src/renderer.rs @@ -222,8 +222,5 @@ pub fn register_renderer(input: TokenStream) -> TokenStream { #[cfg(feature = "general_renderer")] general_renderers.insert(general_renderer_entry_str); - quote! { - ::mingling::macros::register_type!(#previous_type); - } - .into() + quote! {}.into() } -- cgit