@@ -889,48 +889,45 @@ fn validate_generic_param_order(
889
889
) {
890
890
let mut max_param: Option < ParamKindOrd > = None ;
891
891
let mut out_of_order = FxHashMap :: default ( ) ;
892
- let mut param_idents = vec ! [ ] ;
892
+ let mut param_idents = Vec :: with_capacity ( generics . len ( ) ) ;
893
893
894
- for param in generics {
895
- let ident = Some ( param. ident . to_string ( ) ) ;
896
- let ( kind, bounds, span) = ( & param. kind , Some ( & * param. bounds ) , param . ident . span ) ;
894
+ for ( idx , param) in generics. iter ( ) . enumerate ( ) {
895
+ let ident = param. ident ;
896
+ let ( kind, bounds, span) = ( & param. kind , & param. bounds , ident. span ) ;
897
897
let ( ord_kind, ident) = match & param. kind {
898
- GenericParamKind :: Lifetime => ( ParamKindOrd :: Lifetime , ident) ,
899
- GenericParamKind :: Type { default : _ } => ( ParamKindOrd :: Type , ident) ,
898
+ GenericParamKind :: Lifetime => ( ParamKindOrd :: Lifetime , ident. to_string ( ) ) ,
899
+ GenericParamKind :: Type { default : _ } => ( ParamKindOrd :: Type , ident. to_string ( ) ) ,
900
900
GenericParamKind :: Const { ref ty, kw_span : _, default : _ } => {
901
901
let ty = pprust:: ty_to_string ( ty) ;
902
902
let unordered = sess. features_untracked ( ) . unordered_const_ty_params ( ) ;
903
- ( ParamKindOrd :: Const { unordered } , Some ( format ! ( "const {}: {}" , param . ident, ty) ) )
903
+ ( ParamKindOrd :: Const { unordered } , format ! ( "const {}: {}" , ident, ty) )
904
904
}
905
905
} ;
906
- if let Some ( ident) = ident {
907
- param_idents. push ( ( kind, ord_kind, bounds, param_idents. len ( ) , ident) ) ;
908
- }
909
- let max_param = & mut max_param;
906
+ param_idents. push ( ( kind, ord_kind, bounds, idx, ident) ) ;
910
907
match max_param {
911
- Some ( max_param) if * max_param > ord_kind => {
912
- let entry = out_of_order. entry ( ord_kind) . or_insert ( ( * max_param, vec ! [ ] ) ) ;
908
+ Some ( max_param) if max_param > ord_kind => {
909
+ let entry = out_of_order. entry ( ord_kind) . or_insert ( ( max_param, vec ! [ ] ) ) ;
913
910
entry. 1 . push ( span) ;
914
911
}
915
- Some ( _) | None => * max_param = Some ( ord_kind) ,
912
+ Some ( _) | None => max_param = Some ( ord_kind) ,
916
913
} ;
917
914
}
918
915
919
- let mut ordered_params = "<" . to_string ( ) ;
920
916
if !out_of_order. is_empty ( ) {
917
+ let mut ordered_params = "<" . to_string ( ) ;
921
918
param_idents. sort_by_key ( |& ( _, po, _, i, _) | ( po, i) ) ;
922
919
let mut first = true ;
923
920
for ( kind, _, bounds, _, ident) in param_idents {
924
921
if !first {
925
922
ordered_params += ", " ;
926
923
}
927
924
ordered_params += & ident;
928
- if let Some ( bounds) = bounds {
929
- if !bounds. is_empty ( ) {
930
- ordered_params += ": " ;
931
- ordered_params += & pprust:: bounds_to_string ( & bounds) ;
932
- }
925
+
926
+ if !bounds. is_empty ( ) {
927
+ ordered_params += ": " ;
928
+ ordered_params += & pprust:: bounds_to_string ( & bounds) ;
933
929
}
930
+
934
931
match kind {
935
932
GenericParamKind :: Type { default : Some ( default) } => {
936
933
ordered_params += " = " ;
@@ -946,32 +943,32 @@ fn validate_generic_param_order(
946
943
}
947
944
first = false ;
948
945
}
949
- }
950
- ordered_params += ">" ;
951
946
952
- for ( param_ord, ( max_param, spans) ) in & out_of_order {
953
- let mut err =
954
- handler. struct_span_err (
947
+ ordered_params += ">" ;
948
+
949
+ for ( param_ord, ( max_param, spans) ) in & out_of_order {
950
+ let mut err = handler. struct_span_err (
955
951
spans. clone ( ) ,
956
952
& format ! (
957
953
"{} parameters must be declared prior to {} parameters" ,
958
954
param_ord, max_param,
959
955
) ,
960
956
) ;
961
- err. span_suggestion (
962
- span,
963
- & format ! (
964
- "reorder the parameters: lifetimes, {}" ,
965
- if sess. features_untracked( ) . unordered_const_ty_params( ) {
966
- "then consts and types"
967
- } else {
968
- "then types, then consts"
969
- }
970
- ) ,
971
- ordered_params. clone ( ) ,
972
- Applicability :: MachineApplicable ,
973
- ) ;
974
- err. emit ( ) ;
957
+ err. span_suggestion (
958
+ span,
959
+ & format ! (
960
+ "reorder the parameters: lifetimes, {}" ,
961
+ if sess. features_untracked( ) . unordered_const_ty_params( ) {
962
+ "then consts and types"
963
+ } else {
964
+ "then types, then consts"
965
+ }
966
+ ) ,
967
+ ordered_params. clone ( ) ,
968
+ Applicability :: MachineApplicable ,
969
+ ) ;
970
+ err. emit ( ) ;
971
+ }
975
972
}
976
973
}
977
974
0 commit comments