aboutsummaryrefslogtreecommitdiff
path: root/mingling_macros/src/help.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-06-23 00:40:05 +0800
committer魏曹先生 <1992414357@qq.com>2026-06-23 00:40:05 +0800
commit1df1fc664c4a4b12807a49ef2f1a0effda6ce064 (patch)
treea5bcdab31e18094b226d6cef36d99c879c64e25f /mingling_macros/src/help.rs
parentd94103fd7e76dd86cd64c23f00c818165fb7dc22 (diff)
Add compile-time duplicate variant detection
Add duplicate variant checks for chain, renderer, help, and completion registrations to produce a clear compile error instead of silently generating unreachable code
Diffstat (limited to 'mingling_macros/src/help.rs')
-rw-r--r--mingling_macros/src/help.rs33
1 files changed, 29 insertions, 4 deletions
diff --git a/mingling_macros/src/help.rs b/mingling_macros/src/help.rs
index e904b16..e1095e6 100644
--- a/mingling_macros/src/help.rs
+++ b/mingling_macros/src/help.rs
@@ -105,6 +105,18 @@ pub fn help_attr(item: TokenStream) -> TokenStream {
// Register the help request mapping
let help_entry = build_help_entry(&struct_name, &entry_type);
let entry_str = help_entry.to_string();
+
+ // Check for duplicate variant before inserting
+ let variant_name = entry_type.path.segments.last().unwrap().ident.to_string();
+ {
+ let helps = get_global_set(&crate::HELP_REQUESTS).lock().unwrap();
+ if let Err(err) =
+ crate::check_duplicate_variant(&helps, &variant_name, "help", entry_type.span())
+ {
+ return err.into();
+ }
+ }
+
get_global_set(&crate::HELP_REQUESTS)
.lock()
.unwrap()
@@ -185,10 +197,23 @@ pub fn register_help(input: TokenStream) -> TokenStream {
// Register the help request mapping
let help_entry = build_help_entry(&struct_name, &entry_type);
let entry_str = help_entry.to_string();
- get_global_set(&crate::HELP_REQUESTS)
- .lock()
- .unwrap()
- .insert(entry_str);
+
+ // Check if entry was already pre-inserted by `#[help]` attribute
+ let mut helps = get_global_set(&crate::HELP_REQUESTS).lock().unwrap();
+ if helps.contains(&entry_str) {
+ // Already registered by `#[help]`, no duplicate check needed
+ return quote! {}.into();
+ }
+
+ // Check for duplicate variant (different struct, same type)
+ let variant_name = entry_type.path.segments.last().unwrap().ident.to_string();
+ if let Err(err) =
+ crate::check_duplicate_variant(&helps, &variant_name, "help", entry_type.span())
+ {
+ return err.into();
+ }
+
+ helps.insert(entry_str);
quote! {}.into()
}