6
6
// This pass is supposed to perform only simple checks not requiring name resolution
7
7
// or type checking or some other kind of complex analysis.
8
8
9
+ use itertools:: { Either , Itertools } ;
9
10
use rustc_ast:: ast:: * ;
10
11
use rustc_ast:: attr;
11
12
use rustc_ast:: expand:: is_proc_macro_attr;
@@ -640,7 +641,7 @@ impl<'a> AstValidator<'a> {
640
641
}
641
642
}
642
643
643
- fn suggest_correct_generic_order ( & self , data : & AngleBracketedArgs ) -> String {
644
+ fn correct_generic_order_suggestion ( & self , data : & AngleBracketedArgs ) -> String {
644
645
// Lifetimes always come first.
645
646
let lt_sugg = data. args . iter ( ) . filter_map ( |arg| match arg {
646
647
AngleBracketedArg :: Arg ( lt @ GenericArg :: Lifetime ( _) ) => {
@@ -649,11 +650,12 @@ impl<'a> AstValidator<'a> {
649
650
_ => None ,
650
651
} ) ;
651
652
let args_sugg = data. args . iter ( ) . filter_map ( |a| match a {
652
- AngleBracketedArg :: Arg ( GenericArg :: Lifetime ( _) ) => None ,
653
+ AngleBracketedArg :: Arg ( GenericArg :: Lifetime ( _) ) | AngleBracketedArg :: Constraint ( _) => {
654
+ None
655
+ }
653
656
AngleBracketedArg :: Arg ( arg) => Some ( pprust:: to_string ( |s| s. print_generic_arg ( arg) ) ) ,
654
- AngleBracketedArg :: Constraint ( _) => None ,
655
657
} ) ;
656
- // Cosntraints always come last.
658
+ // Constraints always come last.
657
659
let constraint_sugg = data. args . iter ( ) . filter_map ( |a| match a {
658
660
AngleBracketedArg :: Arg ( _) => None ,
659
661
AngleBracketedArg :: Constraint ( c) => {
@@ -673,22 +675,11 @@ impl<'a> AstValidator<'a> {
673
675
return ;
674
676
}
675
677
// Find all generic argument coming after the first constraint...
676
- let constraint_spans = data
677
- . args
678
- . iter ( )
679
- . filter_map ( |arg| match arg {
680
- AngleBracketedArg :: Constraint ( c) => Some ( c. span ) ,
681
- _ => None ,
682
- } )
683
- . collect :: < Vec < _ > > ( ) ;
684
- let arg_spans = data
685
- . args
686
- . iter ( )
687
- . filter_map ( |arg| match arg {
688
- AngleBracketedArg :: Arg ( a) => Some ( a. span ( ) ) ,
689
- _ => None ,
690
- } )
691
- . collect :: < Vec < _ > > ( ) ;
678
+ let ( constraint_spans, arg_spans) : ( Vec < Span > , Vec < Span > ) =
679
+ data. args . iter ( ) . partition_map ( |arg| match arg {
680
+ AngleBracketedArg :: Constraint ( c) => Either :: Left ( c. span ) ,
681
+ AngleBracketedArg :: Arg ( a) => Either :: Right ( a. span ( ) ) ,
682
+ } ) ;
692
683
let args_len = arg_spans. len ( ) ;
693
684
let constraint_len = constraint_spans. len ( ) ;
694
685
// ...and then error:
@@ -706,7 +697,7 @@ impl<'a> AstValidator<'a> {
706
697
pluralize!( constraint_len) ,
707
698
pluralize!( args_len)
708
699
) ,
709
- self . suggest_correct_generic_order ( & data) ,
700
+ self . correct_generic_order_suggestion ( & data) ,
710
701
Applicability :: MachineApplicable ,
711
702
)
712
703
. emit ( ) ;
0 commit comments