aboutsummaryrefslogtreecommitdiff
path: root/mingling_macros/src
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-02 04:20:50 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-02 04:20:50 +0800
commit3f24e5b6ead1e153408ae5e58ad34636fe614645 (patch)
tree93b7c4da1e16c07e9b4c7842ffd6e410e4d1d967 /mingling_macros/src
parentfbe831d29310e050f156355ece670c5a89f9d269 (diff)
fix(macros): fix false positives in entry_has_variant substring matching
Diffstat (limited to 'mingling_macros/src')
-rw-r--r--mingling_macros/src/lib.rs25
1 files changed, 21 insertions, 4 deletions
diff --git a/mingling_macros/src/lib.rs b/mingling_macros/src/lib.rs
index 546416d..c82466d 100644
--- a/mingling_macros/src/lib.rs
+++ b/mingling_macros/src/lib.rs
@@ -241,10 +241,27 @@ pub(crate) fn check_duplicate_variant(
/// Checks if a stored entry string contains the given variant name.
/// Handles both "StructName => Variant," and "Self::Variant => ..." formats.
fn entry_has_variant(entry: &str, variant_name: &str) -> bool {
- entry.contains(&format!("=> {variant_name},"))
- || entry.contains(&format!("=> {variant_name} "))
- || entry.contains(&format!("=> {variant_name}"))
- || entry.contains(&format!(":: {variant_name} =>"))
+ let variant_match = format!("=> {variant_name}");
+
+ // "StructName => Variant," — exact match with trailing comma
+ if entry.contains(&format!("{variant_match},")) {
+ return true;
+ }
+ // "StructName => Variant " — exact match with trailing space
+ if entry.contains(&format!("{variant_match} ")) {
+ return true;
+ }
+ // "StructName => Variant" (fallback) — must NOT be followed by identifier chars
+ if let Some(idx) = entry.find(&variant_match) {
+ let after = idx + variant_match.len();
+ if after >= entry.len()
+ || !entry[after..].starts_with(|c: char| c.is_alphanumeric() || c == '_')
+ {
+ return true;
+ }
+ }
+ // "Self::Variant => ..." — match-arm existence check format
+ entry.contains(&format!(":: {variant_name} =>"))
}
/// Registers an outside-type as a member of a program group without modifying its definition.