@@ -431,8 +431,8 @@ impl<'a> FmtVisitor<'a> {
431
431
self . last_pos = span. lo + BytePos ( struct_snippet. find ( '{' ) . unwrap ( ) as u32 + 1 ) ;
432
432
433
433
self . block_indent += config ! ( tab_spaces) ;
434
- for f in & struct_def. fields {
435
- self . visit_field ( f, span. lo , & struct_snippet) ;
434
+ for ( i , f ) in struct_def. fields . iter ( ) . enumerate ( ) {
435
+ self . visit_field ( f, i == struct_def . fields . len ( ) - 1 , span. lo , & struct_snippet) ;
436
436
}
437
437
self . block_indent -= config ! ( tab_spaces) ;
438
438
@@ -457,6 +457,7 @@ impl<'a> FmtVisitor<'a> {
457
457
// Field of a struct
458
458
fn visit_field ( & mut self ,
459
459
field : & ast:: StructField ,
460
+ last_field : bool ,
460
461
// These two args are for missing spans hacks.
461
462
struct_start : BytePos ,
462
463
struct_snippet : & str )
@@ -480,21 +481,25 @@ impl<'a> FmtVisitor<'a> {
480
481
} ;
481
482
let typ = pprust:: ty_to_string ( & field. node . ty ) ;
482
483
483
- let field_str = match name {
484
+ let mut field_str = match name {
484
485
Some ( name) => {
485
486
let budget = config ! ( ideal_width) - self . block_indent ;
487
+ // 3 is being conservative and assuming that there will be a trailing comma.
486
488
if self . block_indent + vis. len ( ) + name. len ( ) + typ. len ( ) + 3 > budget {
487
- format ! ( "{}{}:\n {}{}, " ,
489
+ format ! ( "{}{}:\n {}{}" ,
488
490
vis,
489
491
name,
490
492
& make_indent( self . block_indent + config!( tab_spaces) ) ,
491
493
typ)
492
494
} else {
493
- format ! ( "{}{}: {}, " , vis, name, typ)
495
+ format ! ( "{}{}: {}" , vis, name, typ)
494
496
}
495
497
}
496
- None => format ! ( "{}{}, " , vis, typ) ,
498
+ None => format ! ( "{}{}" , vis, typ) ,
497
499
} ;
500
+ if !last_field || config ! ( struct_trailing_comma) {
501
+ field_str. push ( ',' ) ;
502
+ }
498
503
self . changes . push_str_span ( field. span , & field_str) ;
499
504
500
505
// This hack makes sure we only add comments etc. after the comma, and
0 commit comments