@@ -494,81 +494,72 @@ impl<'a> DeclValidator<'a> {
494
494
IdentType :: Enum ,
495
495
) ;
496
496
497
- // Check the field names.
498
- let enum_variants_replacements = data
497
+ // Check the variant names.
498
+ self . validate_enum_variants ( enum_id)
499
+ }
500
+
501
+ /// Check incorrect names for enum variants.
502
+ fn validate_enum_variants ( & mut self , enum_id : EnumId ) {
503
+ let data = self . db . enum_data ( enum_id) ;
504
+ let mut enum_variants_replacements = data
499
505
. variants
500
506
. iter ( )
501
507
. filter_map ( |( _, name) | {
502
- Some ( Replacement {
508
+ to_camel_case ( & name . to_smol_str ( ) ) . map ( |new_name| Replacement {
503
509
current_name : name. clone ( ) ,
504
- suggested_text : to_camel_case ( & name . to_smol_str ( ) ) ? ,
510
+ suggested_text : new_name ,
505
511
expected_case : CaseType :: UpperCamelCase ,
506
512
} )
507
513
} )
508
- . collect ( ) ;
509
-
510
- // If there is at least one element to spawn a warning on, go to the source map and generate a warning.
511
- self . create_incorrect_case_diagnostic_for_enum_variants ( enum_id, enum_variants_replacements)
512
- }
514
+ . peekable ( ) ;
513
515
514
- /// Given the information about incorrect names for enum variants,
515
- /// looks up into the source code for exact locations and adds diagnostics into the sink.
516
- fn create_incorrect_case_diagnostic_for_enum_variants (
517
- & mut self ,
518
- enum_id : EnumId ,
519
- enum_variants_replacements : Vec < Replacement > ,
520
- ) {
521
516
// XXX: only look at sources if we do have incorrect names
522
- if enum_variants_replacements. is_empty ( ) {
517
+ if enum_variants_replacements. peek ( ) . is_none ( ) {
523
518
return ;
524
519
}
525
520
526
521
let enum_loc = enum_id. lookup ( self . db . upcast ( ) ) ;
527
522
let enum_src = enum_loc. source ( self . db . upcast ( ) ) ;
528
523
529
- let enum_variants_list = match enum_src. value . variant_list ( ) {
530
- Some ( variants) => variants,
531
- _ => {
532
- always ! (
533
- enum_variants_replacements. is_empty( ) ,
534
- "Replacements ({:?}) were generated for a enum variants which had no fields list: {:?}" ,
535
- enum_variants_replacements,
536
- enum_src
537
- ) ;
538
- return ;
539
- }
524
+ let Some ( enum_variants_list) = enum_src. value . variant_list ( ) else {
525
+ always ! (
526
+ enum_variants_replacements. peek( ) . is_none( ) ,
527
+ "Replacements ({:?}) were generated for enum variants \
528
+ which had no fields list: {:?}",
529
+ enum_variants_replacements,
530
+ enum_src
531
+ ) ;
532
+ return ;
540
533
} ;
541
534
let mut enum_variants_iter = enum_variants_list. variants ( ) ;
542
- for variant_to_rename in enum_variants_replacements {
535
+ for variant_replacement in enum_variants_replacements {
543
536
// We assume that parameters in replacement are in the same order as in the
544
537
// actual params list, but just some of them (ones that named correctly) are skipped.
545
- let ast_ptr = loop {
546
- match enum_variants_iter. next ( ) . and_then ( |v| v. name ( ) ) {
547
- Some ( variant_name) => {
548
- if variant_name. as_name ( ) == variant_to_rename. current_name {
549
- break variant_name;
550
- }
551
- }
552
- None => {
553
- never ! (
554
- "Replacement ({:?}) was generated for a enum variant which was not found: {:?}" ,
555
- variant_to_rename, enum_src
556
- ) ;
557
- return ;
538
+ let variant = loop {
539
+ if let Some ( variant) = enum_variants_iter. next ( ) {
540
+ let Some ( variant_name) = variant. name ( ) else {
541
+ continue ;
542
+ } ;
543
+ if variant_name. as_name ( ) == variant_replacement. current_name {
544
+ break variant;
558
545
}
546
+ } else {
547
+ never ! (
548
+ "Replacement ({:?}) was generated for an enum variant \
549
+ which was not found: {:?}",
550
+ variant_replacement,
551
+ enum_src
552
+ ) ;
553
+ return ;
559
554
}
560
555
} ;
561
556
562
- let diagnostic = IncorrectCase {
563
- file : enum_src. file_id ,
564
- ident_type : IdentType :: Variant ,
565
- ident : AstPtr :: new ( & ast_ptr) ,
566
- expected_case : variant_to_rename. expected_case ,
567
- ident_text : variant_to_rename. current_name . display ( self . db . upcast ( ) ) . to_string ( ) ,
568
- suggested_text : variant_to_rename. suggested_text ,
569
- } ;
570
-
571
- self . sink . push ( diagnostic) ;
557
+ self . create_incorrect_case_diagnostic_for_ast_node (
558
+ variant_replacement,
559
+ enum_src. file_id ,
560
+ & variant,
561
+ IdentType :: Variant ,
562
+ ) ;
572
563
}
573
564
}
574
565
0 commit comments