diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2025-06-21 16:52:03 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-21 16:52:03 +0000 |
| commit | a421ffbadb2b1de1ec570f2c763b25fbd3aed9d5 (patch) | |
| tree | 4d1a76b9757bba466007fb7b645f9da15d87d055 | |
| parent | 6330f9119b5fd0903ada2f9b2b976e718facd35a (diff) | |
| parent | e50ef68f0c617a3024dd1bcbf7941977f21028e1 (diff) | |
Fix `wildcard_enum_match_arm` suggests wrongly with raw identifiers (#15093)
Closes rust-lang/rust-clippy#15091 The lack of ability to escape raw identifiers is a known issue of Clippy. In this case, it can be avoided by snippet from the code. changelog: [`wildcard_enum_match_arm`] fix wrong suggestions with raw identifiers
| -rw-r--r-- | clippy_lints/src/matches/match_wild_enum.rs | 12 | ||||
| -rw-r--r-- | tests/ui/wildcard_enum_match_arm.fixed | 14 | ||||
| -rw-r--r-- | tests/ui/wildcard_enum_match_arm.rs | 14 | ||||
| -rw-r--r-- | tests/ui/wildcard_enum_match_arm.stderr | 8 |
4 files changed, 42 insertions, 6 deletions
diff --git a/clippy_lints/src/matches/match_wild_enum.rs b/clippy_lints/src/matches/match_wild_enum.rs index 24b4a675800..d9e5b07221d 100644 --- a/clippy_lints/src/matches/match_wild_enum.rs +++ b/clippy_lints/src/matches/match_wild_enum.rs @@ -1,4 +1,5 @@ use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_and_then}; +use clippy_utils::source::SpanRangeExt; use clippy_utils::ty::is_type_diagnostic_item; use clippy_utils::{is_refutable, peel_hir_pat_refs, recurse_or_patterns}; use rustc_errors::Applicability; @@ -116,11 +117,12 @@ pub(crate) fn check(cx: &LateContext<'_>, ex: &Expr<'_>, arms: &[Arm<'_>]) { let format_suggestion = |variant: &VariantDef| { format!( "{}{}{}{}", - if let Some(ident) = wildcard_ident { - format!("{} @ ", ident.name) - } else { - String::new() - }, + wildcard_ident.map_or(String::new(), |ident| { + ident + .span + .get_source_text(cx) + .map_or_else(|| format!("{} @ ", ident.name), |s| format!("{s} @ ")) + }), if let CommonPrefixSearcher::Path(path_prefix) = path_prefix { let mut s = String::new(); for seg in path_prefix { diff --git a/tests/ui/wildcard_enum_match_arm.fixed b/tests/ui/wildcard_enum_match_arm.fixed index 141ff6eb2ac..e40e5267383 100644 --- a/tests/ui/wildcard_enum_match_arm.fixed +++ b/tests/ui/wildcard_enum_match_arm.fixed @@ -105,3 +105,17 @@ fn main() { } } } + +fn issue15091() { + enum Foo { + A, + B, + C, + } + + match Foo::A { + Foo::A => {}, + r#type @ Foo::B | r#type @ Foo::C => {}, + //~^ wildcard_enum_match_arm + } +} diff --git a/tests/ui/wildcard_enum_match_arm.rs b/tests/ui/wildcard_enum_match_arm.rs index a13684e9100..8259f059847 100644 --- a/tests/ui/wildcard_enum_match_arm.rs +++ b/tests/ui/wildcard_enum_match_arm.rs @@ -105,3 +105,17 @@ fn main() { } } } + +fn issue15091() { + enum Foo { + A, + B, + C, + } + + match Foo::A { + Foo::A => {}, + r#type => {}, + //~^ wildcard_enum_match_arm + } +} diff --git a/tests/ui/wildcard_enum_match_arm.stderr b/tests/ui/wildcard_enum_match_arm.stderr index 088c6b7b284..1f1de166d00 100644 --- a/tests/ui/wildcard_enum_match_arm.stderr +++ b/tests/ui/wildcard_enum_match_arm.stderr @@ -40,5 +40,11 @@ error: wildcard match will also match any future added variants LL | _ => (), | ^ help: try: `Enum::B | Enum::__Private` -error: aborting due to 6 previous errors +error: wildcard match will also match any future added variants + --> tests/ui/wildcard_enum_match_arm.rs:118:9 + | +LL | r#type => {}, + | ^^^^^^ help: try: `r#type @ Foo::B | r#type @ Foo::C` + +error: aborting due to 7 previous errors |
