@@ -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) = (¶m.kind, & param.bounds, ident.span);
897
897
let (ord_kind, ident) = match ¶m.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