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
This commit is contained in:
Samuel Tardieu 2025-06-21 16:52:03 +00:00 committed by GitHub
commit a421ffbadb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 42 additions and 6 deletions

View file

@ -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 {

View file

@ -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
}
}

View file

@ -105,3 +105,17 @@ fn main() {
}
}
}
fn issue15091() {
enum Foo {
A,
B,
C,
}
match Foo::A {
Foo::A => {},
r#type => {},
//~^ wildcard_enum_match_arm
}
}

View file

@ -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