Skip to content

Commit 4bc43f6

Browse files
committed
Merge pull request #443 from marcusklaas/variadic-fns
Format variadic arguments
2 parents 4748386 + b768d27 commit 4bc43f6

File tree

3 files changed

+59
-9
lines changed

3 files changed

+59
-9
lines changed

src/items.rs

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,8 @@ impl<'a> FmtVisitor<'a> {
377377
multi_line_budget,
378378
indent,
379379
arg_indent,
380-
args_span));
380+
args_span,
381+
fd.variadic));
381382
result.push_str(&arg_str);
382383
if self.config.fn_args_layout == StructLitStyle::Block {
383384
result.push('\n');
@@ -475,7 +476,8 @@ impl<'a> FmtVisitor<'a> {
475476
multi_line_budget: usize,
476477
indent: Indent,
477478
arg_indent: Indent,
478-
span: Span)
479+
span: Span,
480+
variadic: bool)
479481
-> Option<String> {
480482
let context = self.get_context();
481483
let mut arg_item_strs = try_opt!(args.iter()
@@ -506,27 +508,59 @@ impl<'a> FmtVisitor<'a> {
506508
// without spans for the comment or parens, there is no chance of
507509
// getting it right. You also don't get to put a comment on self, unless
508510
// it is explicit.
509-
if args.len() >= min_args {
511+
if args.len() >= min_args || variadic {
510512
let comment_span_start = if min_args == 2 {
511513
span_after(span, ",", self.codemap)
512514
} else {
513515
span.lo
514516
};
515517

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+
516531
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),
518536
")",
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+
},
522558
comment_span_start,
523559
span.hi);
524560

525561
arg_items.extend(more_items);
526562
}
527563

528-
assert_eq!(arg_item_strs.len(), arg_items.len());
529-
530564
for (item, arg) in arg_items.iter_mut().zip(arg_item_strs) {
531565
item.item = Some(arg);
532566
}

tests/source/extern.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,10 @@ extern {
1919
extern "Rust" { static ext: u32;
2020
// Some comment.
2121
pub static mut var : SomeType ; }
22+
23+
extern "C" {
24+
fn syscall(number: libc::c_long /* comment 1 */, /* comm 2 */ ... /* sup? */) -> libc::c_long;
25+
26+
fn foo (x: *const c_char , ... ) ->
27+
libc::c_long;
28+
}

tests/target/extern.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,12 @@ extern "Rust" {
2727
// Some comment.
2828
pub static mut var: SomeType;
2929
}
30+
31+
extern {
32+
fn syscall(number: libc::c_long, // comment 1
33+
// comm 2
34+
... /* sup? */)
35+
-> libc::c_long;
36+
37+
fn foo(x: *const c_char, ...) -> libc::c_long;
38+
}

0 commit comments

Comments
 (0)