@@ -5,7 +5,7 @@ use clippy_utils::macros::span_is_local;
5
5
use clippy_utils:: source:: is_present_in_source;
6
6
use clippy_utils:: str_utils:: { camel_case_split, count_match_end, count_match_start, to_camel_case, to_snake_case} ;
7
7
use rustc_data_structures:: fx:: FxHashSet ;
8
- use rustc_hir:: { EnumDef , FieldDef , Item , ItemKind , OwnerId , Variant , VariantData } ;
8
+ use rustc_hir:: { EnumDef , FieldDef , Item , ItemKind , OwnerId , QPath , TyKind , Variant , VariantData } ;
9
9
use rustc_lint:: { LateContext , LateLintPass } ;
10
10
use rustc_session:: impl_lint_pass;
11
11
use rustc_span:: symbol:: Symbol ;
@@ -405,6 +405,7 @@ fn check_enum_start(cx: &LateContext<'_>, item_name: &str, variant: &Variant<'_>
405
405
if count_match_start ( item_name, name) . char_count == item_name_chars
406
406
&& name. chars ( ) . nth ( item_name_chars) . is_some_and ( |c| !c. is_lowercase ( ) )
407
407
&& name. chars ( ) . nth ( item_name_chars + 1 ) . is_some_and ( |c| !c. is_numeric ( ) )
408
+ && !check_enum_tuple_path_match ( name, variant. data )
408
409
{
409
410
span_lint_hir (
410
411
cx,
@@ -420,7 +421,9 @@ fn check_enum_end(cx: &LateContext<'_>, item_name: &str, variant: &Variant<'_>)
420
421
let name = variant. ident . name . as_str ( ) ;
421
422
let item_name_chars = item_name. chars ( ) . count ( ) ;
422
423
423
- if count_match_end ( item_name, name) . char_count == item_name_chars {
424
+ if count_match_end ( item_name, name) . char_count == item_name_chars
425
+ && !check_enum_tuple_path_match ( name, variant. data )
426
+ {
424
427
span_lint_hir (
425
428
cx,
426
429
ENUM_VARIANT_NAMES ,
@@ -431,6 +434,27 @@ fn check_enum_end(cx: &LateContext<'_>, item_name: &str, variant: &Variant<'_>)
431
434
}
432
435
}
433
436
437
+ /// Checks if an enum tuple variant contains a single field
438
+ /// whose qualified path contains the variant's name.
439
+ fn check_enum_tuple_path_match ( variant_name : & str , variant_data : VariantData < ' _ > ) -> bool {
440
+ // Only check single-field tuple variants
441
+ let VariantData :: Tuple ( fields, ..) = variant_data else {
442
+ return false ;
443
+ } ;
444
+ if fields. len ( ) != 1 {
445
+ return false ;
446
+ }
447
+ // Check if field type is a path and contains the variant name
448
+ match fields[ 0 ] . ty . kind {
449
+ TyKind :: Path ( QPath :: Resolved ( _, path) ) => path
450
+ . segments
451
+ . iter ( )
452
+ . any ( |segment| segment. ident . name . as_str ( ) == variant_name) ,
453
+ TyKind :: Path ( QPath :: TypeRelative ( _, segment) ) => segment. ident . name . as_str ( ) == variant_name,
454
+ _ => false ,
455
+ }
456
+ }
457
+
434
458
impl LateLintPass < ' _ > for ItemNameRepetitions {
435
459
fn check_item_post ( & mut self , _cx : & LateContext < ' _ > , item : & Item < ' _ > ) {
436
460
let Some ( _ident) = item. kind . ident ( ) else { return } ;
0 commit comments