@@ -14,13 +14,15 @@ use crate::comment::{
14
14
recover_comment_removed, recover_missing_comment_in_span, rewrite_missing_comment,
15
15
FindUncommented ,
16
16
} ;
17
- use crate :: config:: lists:: * ;
17
+ use crate :: config:: { lists:: * , Density } ;
18
18
use crate :: config:: { BraceStyle , Config , IndentStyle , Version } ;
19
19
use crate :: expr:: {
20
20
is_empty_block, is_simple_block_stmt, rewrite_assign_rhs, rewrite_assign_rhs_with,
21
21
rewrite_assign_rhs_with_comments, RhsAssignKind , RhsTactics ,
22
22
} ;
23
- use crate :: lists:: { definitive_tactic, itemize_list, write_list, ListFormatting , Separator } ;
23
+ use crate :: lists:: {
24
+ definitive_tactic, itemize_list, write_list, ListFormatting , ListItem , Separator ,
25
+ } ;
24
26
use crate :: macros:: { rewrite_macro, MacroPosition } ;
25
27
use crate :: overflow;
26
28
use crate :: rewrite:: { Rewrite , RewriteContext } ;
@@ -515,11 +517,32 @@ impl<'a> FmtVisitor<'a> {
515
517
} ;
516
518
let mut items: Vec < _ > = itemize_list_with ( self . config . struct_variant_width ( ) ) ;
517
519
520
+ let is_multiline_variant = |item : & ListItem | {
521
+ item. inner_as_ref ( )
522
+ . lines ( )
523
+ . skip_while ( |l| {
524
+ if self . config . enum_variant_layout ( ) == Density :: Compressed {
525
+ l. trim_start ( ) . starts_with ( "#" ) || l. trim_start ( ) . starts_with ( "///" )
526
+ } else {
527
+ false
528
+ }
529
+ } )
530
+ . count ( )
531
+ > 1
532
+ } ;
533
+
518
534
// If one of the variants use multiple lines, use multi-lined formatting for all variants.
519
- let has_multiline_variant = items. iter ( ) . any ( |item| item. inner_as_ref ( ) . contains ( '\n' ) ) ;
520
- let has_single_line_variant = items. iter ( ) . any ( |item| !item. inner_as_ref ( ) . contains ( '\n' ) ) ;
521
- if has_multiline_variant && has_single_line_variant {
522
- items = itemize_list_with ( 0 ) ;
535
+ let has_multiline_variant = items. iter ( ) . any ( |item| is_multiline_variant ( item) ) ;
536
+ let has_single_line_variant = items
537
+ . iter ( )
538
+ . any ( |item| item. inner_as_ref ( ) . lines ( ) . count ( ) == 1 ) ;
539
+
540
+ match self . config . enum_variant_layout ( ) {
541
+ Density :: Vertical => items = itemize_list_with ( 0 ) ,
542
+ Density :: Tall if has_multiline_variant && has_single_line_variant => {
543
+ items = itemize_list_with ( 0 )
544
+ }
545
+ _ => { }
523
546
}
524
547
525
548
let shape = self . shape ( ) . sub_width ( 2 ) ?;
0 commit comments