@@ -377,7 +377,8 @@ impl<'a> FmtVisitor<'a> {
377
377
multi_line_budget,
378
378
indent,
379
379
arg_indent,
380
- args_span) ) ;
380
+ args_span,
381
+ fd. variadic) ) ;
381
382
result. push_str ( & arg_str) ;
382
383
if self . config . fn_args_layout == StructLitStyle :: Block {
383
384
result. push ( '\n' ) ;
@@ -475,7 +476,8 @@ impl<'a> FmtVisitor<'a> {
475
476
multi_line_budget : usize ,
476
477
indent : Indent ,
477
478
arg_indent : Indent ,
478
- span : Span )
479
+ span : Span ,
480
+ variadic : bool )
479
481
-> Option < String > {
480
482
let context = self . get_context ( ) ;
481
483
let mut arg_item_strs = try_opt ! ( args. iter( )
@@ -506,27 +508,59 @@ impl<'a> FmtVisitor<'a> {
506
508
// without spans for the comment or parens, there is no chance of
507
509
// getting it right. You also don't get to put a comment on self, unless
508
510
// it is explicit.
509
- if args. len ( ) >= min_args {
511
+ if args. len ( ) >= min_args || variadic {
510
512
let comment_span_start = if min_args == 2 {
511
513
span_after ( span, "," , self . codemap )
512
514
} else {
513
515
span. lo
514
516
} ;
515
517
518
+ enum ArgumentKind < ' a > {
519
+ Regular ( & ' a ast:: Arg ) ,
520
+ Variadic ( BytePos ) ,
521
+ }
522
+
523
+ let variadic_arg = if variadic {
524
+ let variadic_span = codemap:: mk_sp ( args. last ( ) . unwrap ( ) . ty . span . hi , span. hi ) ;
525
+ let variadic_start = span_after ( variadic_span, "..." , self . codemap ) - BytePos ( 1 ) ;
526
+ Some ( ArgumentKind :: Variadic ( variadic_start) )
527
+ } else {
528
+ None
529
+ } ;
530
+
516
531
let more_items = itemize_list ( self . codemap ,
517
- args[ min_args - 1 ..] . iter ( ) ,
532
+ args[ min_args - 1 ..]
533
+ . iter ( )
534
+ . map ( ArgumentKind :: Regular )
535
+ . chain ( variadic_arg) ,
518
536
")" ,
519
- |arg| span_lo_for_arg ( arg) ,
520
- |arg| arg. ty . span . hi ,
521
- |_| None ,
537
+ |arg| {
538
+ match * arg {
539
+ ArgumentKind :: Regular ( arg) =>
540
+ span_lo_for_arg ( arg) ,
541
+ ArgumentKind :: Variadic ( start) => start,
542
+ }
543
+ } ,
544
+ |arg| {
545
+ match * arg {
546
+ ArgumentKind :: Regular ( arg) => arg. ty . span . hi ,
547
+ ArgumentKind :: Variadic ( start) =>
548
+ start + BytePos ( 3 ) ,
549
+ }
550
+ } ,
551
+ |arg| {
552
+ match * arg {
553
+ ArgumentKind :: Regular ( ..) => None ,
554
+ ArgumentKind :: Variadic ( ..) =>
555
+ Some ( "..." . to_owned ( ) ) ,
556
+ }
557
+ } ,
522
558
comment_span_start,
523
559
span. hi ) ;
524
560
525
561
arg_items. extend ( more_items) ;
526
562
}
527
563
528
- assert_eq ! ( arg_item_strs. len( ) , arg_items. len( ) ) ;
529
-
530
564
for ( item, arg) in arg_items. iter_mut ( ) . zip ( arg_item_strs) {
531
565
item. item = Some ( arg) ;
532
566
}
0 commit comments