11// Formatting top-level items - functions, structs, enums, traits, impls.
22
3- use std:: borrow:: Cow ;
4- use std:: cmp:: { Ordering , max, min} ;
5-
3+ use itertools:: Itertools ;
64use regex:: Regex ;
7- use rustc_ast:: visit;
5+ use rustc_ast:: { AttrVec , visit} ;
86use rustc_ast:: { ast, ptr} ;
97use rustc_span:: { BytePos , DUMMY_SP , Span , symbol} ;
8+ use std:: borrow:: Cow ;
9+ use std:: cmp:: { Ordering , max, min} ;
1010
1111use crate :: attr:: filter_inline_attrs;
1212use crate :: comment:: {
@@ -536,6 +536,7 @@ impl<'a> FmtVisitor<'a> {
536536 enum_def : & ast:: EnumDef ,
537537 generics : & ast:: Generics ,
538538 span : Span ,
539+ attrs : & AttrVec ,
539540 ) {
540541 let enum_header =
541542 format_header ( & self . get_context ( ) , "enum " , ident, vis, self . block_indent ) ;
@@ -563,7 +564,7 @@ impl<'a> FmtVisitor<'a> {
563564
564565 self . last_pos = body_start;
565566
566- match self . format_variant_list ( enum_def, body_start, span. hi ( ) ) {
567+ match self . format_variant_list ( enum_def, body_start, span. hi ( ) , attrs ) {
567568 Some ( ref s) if enum_def. variants . is_empty ( ) => self . push_str ( s) ,
568569 rw => {
569570 self . push_rewrite ( mk_sp ( body_start, span. hi ( ) ) , rw) ;
@@ -578,6 +579,7 @@ impl<'a> FmtVisitor<'a> {
578579 enum_def : & ast:: EnumDef ,
579580 body_lo : BytePos ,
580581 body_hi : BytePos ,
582+ attrs : & AttrVec ,
581583 ) -> Option < String > {
582584 if enum_def. variants . is_empty ( ) {
583585 let mut buffer = String :: with_capacity ( 128 ) ;
@@ -615,7 +617,7 @@ impl<'a> FmtVisitor<'a> {
615617 . unwrap_or ( & 0 ) ;
616618
617619 let itemize_list_with = |one_line_width : usize | {
618- itemize_list (
620+ let iter = itemize_list (
619621 self . snippet_provider ,
620622 enum_def. variants . iter ( ) ,
621623 "}" ,
@@ -635,8 +637,16 @@ impl<'a> FmtVisitor<'a> {
635637 body_lo,
636638 body_hi,
637639 false ,
638- )
639- . collect ( )
640+ ) ;
641+ if contains_sort ( attrs) {
642+ // sort the items by their name as this enum has the rustfmt::sort attr
643+ iter. enumerate ( )
644+ . sorted_by_key ( |& ( i, _) | enum_def. variants [ i] . ident . name . as_str ( ) )
645+ . map ( |( _, item) | item)
646+ . collect ( )
647+ } else {
648+ iter. collect ( )
649+ }
640650 } ;
641651 let mut items: Vec < _ > = itemize_list_with ( self . config . struct_variant_width ( ) ) ;
642652
0 commit comments