diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-06-23 00:40:05 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-06-23 00:40:05 +0800 |
| commit | 1df1fc664c4a4b12807a49ef2f1a0effda6ce064 (patch) | |
| tree | a5bcdab31e18094b226d6cef36d99c879c64e25f /mingling_macros/src/help.rs | |
| parent | d94103fd7e76dd86cd64c23f00c818165fb7dc22 (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.rs | 33 |
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() } |
