aboutsummaryrefslogtreecommitdiff
path: root/mingling_macros
diff options
context:
space:
mode:
Diffstat (limited to 'mingling_macros')
-rw-r--r--mingling_macros/src/chain.rs10
-rw-r--r--mingling_macros/src/completion.rs1
-rw-r--r--mingling_macros/src/help.rs12
-rw-r--r--mingling_macros/src/lib.rs22
-rw-r--r--mingling_macros/src/renderer.rs1
5 files changed, 39 insertions, 7 deletions
diff --git a/mingling_macros/src/chain.rs b/mingling_macros/src/chain.rs
index a678858..92020ea 100644
--- a/mingling_macros/src/chain.rs
+++ b/mingling_macros/src/chain.rs
@@ -440,9 +440,13 @@ pub fn register_chain(input: TokenStream) -> TokenStream {
.unwrap()
.ident
.to_string();
- if let Err(err) =
- crate::check_duplicate_variant(&chains, &variant_name, "chain", previous_type.span())
- {
+ if let Err(err) = crate::check_duplicate_variant(
+ &chains,
+ &chain_entry_str,
+ &variant_name,
+ "chain",
+ previous_type.span(),
+ ) {
return err.into();
}
diff --git a/mingling_macros/src/completion.rs b/mingling_macros/src/completion.rs
index c4870d9..ae01462 100644
--- a/mingling_macros/src/completion.rs
+++ b/mingling_macros/src/completion.rs
@@ -158,6 +158,7 @@ pub fn completion_attr(attr: TokenStream, item: TokenStream) -> TokenStream {
let variant_name = previous_type_ident.to_string();
if let Err(err) = crate::check_duplicate_variant(
&completions,
+ &completion_str,
&variant_name,
"completion",
previous_type_path.span(),
diff --git a/mingling_macros/src/help.rs b/mingling_macros/src/help.rs
index e1095e6..6d427b9 100644
--- a/mingling_macros/src/help.rs
+++ b/mingling_macros/src/help.rs
@@ -110,9 +110,13 @@ pub fn help_attr(item: TokenStream) -> TokenStream {
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())
- {
+ if let Err(err) = crate::check_duplicate_variant(
+ &helps,
+ &entry_str,
+ &variant_name,
+ "help",
+ entry_type.span(),
+ ) {
return err.into();
}
}
@@ -208,7 +212,7 @@ pub fn register_help(input: TokenStream) -> TokenStream {
// 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())
+ crate::check_duplicate_variant(&helps, &entry_str, &variant_name, "help", entry_type.span())
{
return err.into();
}
diff --git a/mingling_macros/src/lib.rs b/mingling_macros/src/lib.rs
index 5bc73a4..8aa16f2 100644
--- a/mingling_macros/src/lib.rs
+++ b/mingling_macros/src/lib.rs
@@ -199,11 +199,16 @@ pub(crate) static HELP_REQUESTS: Registry = OnceLock::new();
/// Returns a `compile_error` token stream if a duplicate is found.
pub(crate) fn check_duplicate_variant(
set: &std::collections::BTreeSet<String>,
+ entry_str: &str,
variant_name: &str,
kind: &str,
error_span: proc_macro2::Span,
) -> Result<(), proc_macro2::TokenStream> {
for existing in set.iter() {
+ if existing == entry_str {
+ // Exact same entry - re-registration from RA re-analysis, skip
+ continue;
+ }
if entry_has_variant(existing, variant_name) {
return Err(syn::Error::new(
error_span,
@@ -1972,6 +1977,23 @@ pub fn program_final_gen(_input: TokenStream) -> TokenStream {
}
};
+ // Clear all global registries to prevent stale state in Rust Analyzer
+ get_global_set(&PACKED_TYPES).lock().unwrap().clear();
+ get_global_set(&CHAINS).lock().unwrap().clear();
+ get_global_set(&CHAINS_EXIST).lock().unwrap().clear();
+ get_global_set(&RENDERERS).lock().unwrap().clear();
+ get_global_set(&RENDERERS_EXIST).lock().unwrap().clear();
+ get_global_set(&HELP_REQUESTS).lock().unwrap().clear();
+ #[cfg(feature = "comp")]
+ get_global_set(&COMPLETIONS).lock().unwrap().clear();
+ #[cfg(feature = "dispatch_tree")]
+ get_global_set(&COMPILE_TIME_DISPATCHERS)
+ .lock()
+ .unwrap()
+ .clear();
+ #[cfg(feature = "general_renderer")]
+ get_global_set(&GENERAL_RENDERERS).lock().unwrap().clear();
+
TokenStream::from(expanded)
}
diff --git a/mingling_macros/src/renderer.rs b/mingling_macros/src/renderer.rs
index 79128ef..a82744a 100644
--- a/mingling_macros/src/renderer.rs
+++ b/mingling_macros/src/renderer.rs
@@ -252,6 +252,7 @@ pub fn register_renderer(input: TokenStream) -> TokenStream {
let renderers = get_global_set(&crate::RENDERERS).lock().unwrap();
if let Err(err) = crate::check_duplicate_variant(
&renderers,
+ &renderer_entry_str,
&variant_name,
"renderer",
previous_type.span(),