@@ -484,21 +484,30 @@ impl<'a> FmtVisitor<'a> {
484
484
let indentation = self . block_indent . to_string ( self . config ) ;
485
485
result. push_str ( & indentation) ;
486
486
487
- let items = itemize_list (
488
- self . codemap ,
489
- enum_def. variants . iter ( ) ,
490
- "}" ,
491
- |f| if !f. node . attrs . is_empty ( ) {
492
- f. node . attrs [ 0 ] . span . lo ( )
493
- } else {
494
- f. span . lo ( )
495
- } ,
496
- |f| f. span . hi ( ) ,
497
- |f| self . format_variant ( f) ,
498
- body_lo,
499
- body_hi,
500
- false ,
501
- ) ;
487
+ let itemize_list_with = |one_line_width : usize | {
488
+ itemize_list (
489
+ self . codemap ,
490
+ enum_def. variants . iter ( ) ,
491
+ "}" ,
492
+ |f| if !f. node . attrs . is_empty ( ) {
493
+ f. node . attrs [ 0 ] . span . lo ( )
494
+ } else {
495
+ f. span . lo ( )
496
+ } ,
497
+ |f| f. span . hi ( ) ,
498
+ |f| self . format_variant ( f, one_line_width) ,
499
+ body_lo,
500
+ body_hi,
501
+ false ,
502
+ ) . collect ( )
503
+ } ;
504
+ let mut items: Vec < _ > = itemize_list_with ( self . config . struct_variant_width ( ) ) ;
505
+ // If one of the variants use multiple lines, use multi-lined formatting for all variants.
506
+ let has_multiline_variant = items. iter ( ) . any ( |item| item. inner_as_ref ( ) . contains ( "\n " ) ) ;
507
+ let has_single_line_variant = items. iter ( ) . any ( |item| !item. inner_as_ref ( ) . contains ( "\n " ) ) ;
508
+ if has_multiline_variant && has_single_line_variant {
509
+ items = itemize_list_with ( 0 ) ;
510
+ }
502
511
503
512
let shape = self . shape ( ) . sub_width ( 2 ) . unwrap ( ) ;
504
513
let fmt = ListFormatting {
@@ -512,14 +521,14 @@ impl<'a> FmtVisitor<'a> {
512
521
config : self . config ,
513
522
} ;
514
523
515
- let list = write_list ( & items. collect :: < Vec < _ > > ( ) , & fmt) ?;
524
+ let list = write_list ( & items, & fmt) ?;
516
525
result. push_str ( & list) ;
517
526
result. push ( '\n' ) ;
518
527
Some ( result)
519
528
}
520
529
521
530
// Variant of an enum.
522
- fn format_variant ( & self , field : & ast:: Variant ) -> Option < String > {
531
+ fn format_variant ( & self , field : & ast:: Variant , one_line_width : usize ) -> Option < String > {
523
532
if contains_skip ( & field. node . attrs ) {
524
533
let lo = field. node . attrs [ 0 ] . span . lo ( ) ;
525
534
let span = mk_sp ( lo, field. span . hi ( ) ) ;
@@ -544,7 +553,7 @@ impl<'a> FmtVisitor<'a> {
544
553
& context,
545
554
& StructParts :: from_variant ( field) ,
546
555
indent,
547
- Some ( self . config . struct_variant_width ( ) ) ,
556
+ Some ( one_line_width ) ,
548
557
) ?
549
558
}
550
559
ast:: VariantData :: Unit ( ..) => if let Some ( ref expr) = field. node . disr_expr {
0 commit comments