Skip to content

Commit cfd31fb

Browse files
committed
Include trailing comma in multiline Debug representation
This commit changes the behavior of Formatter::debug_struct, debug_tuple, debug_list, debug_set, and debug_map to render trailing commas in {:#?} mode, which is the dominant style in modern Rust code. Before: Language { name: "Rust", trailing_commas: false } After: Language { name: "Rust", trailing_commas: true, }
1 parent a781c47 commit cfd31fb

28 files changed

+226
-252
lines changed

src/libcore/fmt/builders.rs

+32-58
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ impl<'a> PadAdapter<'a> {
1111
fmt.wrap_buf(move |buf| {
1212
*slot = Some(PadAdapter {
1313
buf,
14-
on_newline: false,
14+
on_newline: true,
1515
});
1616
slot.as_mut().unwrap()
1717
})
@@ -128,22 +128,21 @@ impl<'a, 'b: 'a> DebugStruct<'a, 'b> {
128128
#[stable(feature = "debug_builders", since = "1.2.0")]
129129
pub fn field(&mut self, name: &str, value: &dyn fmt::Debug) -> &mut DebugStruct<'a, 'b> {
130130
self.result = self.result.and_then(|_| {
131-
let prefix = if self.has_fields {
132-
","
133-
} else {
134-
" {"
135-
};
136-
137131
if self.is_pretty() {
132+
if !self.has_fields {
133+
self.fmt.write_str(" {\n")?;
134+
}
138135
let mut slot = None;
139136
let mut writer = PadAdapter::wrap(&mut self.fmt, &mut slot);
140-
writer.write_str(prefix)?;
141-
writer.write_str("\n")?;
142137
writer.write_str(name)?;
143138
writer.write_str(": ")?;
144-
value.fmt(&mut writer)
139+
value.fmt(&mut writer)?;
140+
writer.write_str(",\n")
145141
} else {
146-
write!(self.fmt, "{} {}: ", prefix, name)?;
142+
let prefix = if self.has_fields { ", " } else { " { " };
143+
self.fmt.write_str(prefix)?;
144+
self.fmt.write_str(name)?;
145+
self.fmt.write_str(": ")?;
147146
value.fmt(self.fmt)
148147
}
149148
});
@@ -184,7 +183,7 @@ impl<'a, 'b: 'a> DebugStruct<'a, 'b> {
184183
if self.has_fields {
185184
self.result = self.result.and_then(|_| {
186185
if self.is_pretty() {
187-
self.fmt.write_str("\n}")
186+
self.fmt.write_str("}")
188187
} else {
189188
self.fmt.write_str(" }")
190189
}
@@ -275,21 +274,17 @@ impl<'a, 'b: 'a> DebugTuple<'a, 'b> {
275274
#[stable(feature = "debug_builders", since = "1.2.0")]
276275
pub fn field(&mut self, value: &dyn fmt::Debug) -> &mut DebugTuple<'a, 'b> {
277276
self.result = self.result.and_then(|_| {
278-
let (prefix, space) = if self.fields > 0 {
279-
(",", " ")
280-
} else {
281-
("(", "")
282-
};
283-
284277
if self.is_pretty() {
278+
if self.fields == 0 {
279+
self.fmt.write_str("(\n")?;
280+
}
285281
let mut slot = None;
286282
let mut writer = PadAdapter::wrap(&mut self.fmt, &mut slot);
287-
writer.write_str(prefix)?;
288-
writer.write_str("\n")?;
289-
value.fmt(&mut writer)
283+
value.fmt(&mut writer)?;
284+
writer.write_str(",\n")
290285
} else {
286+
let prefix = if self.fields == 0 { "(" } else { ", " };
291287
self.fmt.write_str(prefix)?;
292-
self.fmt.write_str(space)?;
293288
value.fmt(self.fmt)
294289
}
295290
});
@@ -326,10 +321,7 @@ impl<'a, 'b: 'a> DebugTuple<'a, 'b> {
326321
pub fn finish(&mut self) -> fmt::Result {
327322
if self.fields > 0 {
328323
self.result = self.result.and_then(|_| {
329-
if self.is_pretty() {
330-
self.fmt.write_str("\n")?;
331-
}
332-
if self.fields == 1 && self.empty_name {
324+
if self.fields == 1 && self.empty_name && !self.is_pretty() {
333325
self.fmt.write_str(",")?;
334326
}
335327
self.fmt.write_str(")")
@@ -353,14 +345,13 @@ impl<'a, 'b: 'a> DebugInner<'a, 'b> {
353345
fn entry(&mut self, entry: &dyn fmt::Debug) {
354346
self.result = self.result.and_then(|_| {
355347
if self.is_pretty() {
348+
if !self.has_fields {
349+
self.fmt.write_str("\n")?;
350+
}
356351
let mut slot = None;
357352
let mut writer = PadAdapter::wrap(&mut self.fmt, &mut slot);
358-
writer.write_str(if self.has_fields {
359-
",\n"
360-
} else {
361-
"\n"
362-
})?;
363-
entry.fmt(&mut writer)
353+
entry.fmt(&mut writer)?;
354+
writer.write_str(",\n")
364355
} else {
365356
if self.has_fields {
366357
self.fmt.write_str(", ")?
@@ -372,15 +363,6 @@ impl<'a, 'b: 'a> DebugInner<'a, 'b> {
372363
self.has_fields = true;
373364
}
374365

375-
pub fn finish(&mut self) {
376-
let prefix = if self.is_pretty() && self.has_fields {
377-
"\n"
378-
} else {
379-
""
380-
};
381-
self.result = self.result.and_then(|_| self.fmt.write_str(prefix));
382-
}
383-
384366
fn is_pretty(&self) -> bool {
385367
self.fmt.alternate()
386368
}
@@ -421,7 +403,7 @@ pub struct DebugSet<'a, 'b: 'a> {
421403
}
422404

423405
pub fn debug_set_new<'a, 'b>(fmt: &'a mut fmt::Formatter<'b>) -> DebugSet<'a, 'b> {
424-
let result = write!(fmt, "{{");
406+
let result = fmt.write_str("{");
425407
DebugSet {
426408
inner: DebugInner {
427409
fmt,
@@ -519,7 +501,6 @@ impl<'a, 'b: 'a> DebugSet<'a, 'b> {
519501
/// ```
520502
#[stable(feature = "debug_builders", since = "1.2.0")]
521503
pub fn finish(&mut self) -> fmt::Result {
522-
self.inner.finish();
523504
self.inner.result.and_then(|_| self.inner.fmt.write_str("}"))
524505
}
525506
}
@@ -559,7 +540,7 @@ pub struct DebugList<'a, 'b: 'a> {
559540
}
560541

561542
pub fn debug_list_new<'a, 'b>(fmt: &'a mut fmt::Formatter<'b>) -> DebugList<'a, 'b> {
562-
let result = write!(fmt, "[");
543+
let result = fmt.write_str("[");
563544
DebugList {
564545
inner: DebugInner {
565546
fmt,
@@ -657,7 +638,6 @@ impl<'a, 'b: 'a> DebugList<'a, 'b> {
657638
/// ```
658639
#[stable(feature = "debug_builders", since = "1.2.0")]
659640
pub fn finish(&mut self) -> fmt::Result {
660-
self.inner.finish();
661641
self.inner.result.and_then(|_| self.inner.fmt.write_str("]"))
662642
}
663643
}
@@ -699,7 +679,7 @@ pub struct DebugMap<'a, 'b: 'a> {
699679
}
700680

701681
pub fn debug_map_new<'a, 'b>(fmt: &'a mut fmt::Formatter<'b>) -> DebugMap<'a, 'b> {
702-
let result = write!(fmt, "{{");
682+
let result = fmt.write_str("{");
703683
DebugMap {
704684
fmt,
705685
result,
@@ -734,16 +714,15 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> {
734714
pub fn entry(&mut self, key: &dyn fmt::Debug, value: &dyn fmt::Debug) -> &mut DebugMap<'a, 'b> {
735715
self.result = self.result.and_then(|_| {
736716
if self.is_pretty() {
717+
if !self.has_fields {
718+
self.fmt.write_str("\n")?;
719+
}
737720
let mut slot = None;
738721
let mut writer = PadAdapter::wrap(&mut self.fmt, &mut slot);
739-
writer.write_str(if self.has_fields {
740-
",\n"
741-
} else {
742-
"\n"
743-
})?;
744722
key.fmt(&mut writer)?;
745723
writer.write_str(": ")?;
746-
value.fmt(&mut writer)
724+
value.fmt(&mut writer)?;
725+
writer.write_str(",\n")
747726
} else {
748727
if self.has_fields {
749728
self.fmt.write_str(", ")?
@@ -818,12 +797,7 @@ impl<'a, 'b: 'a> DebugMap<'a, 'b> {
818797
/// ```
819798
#[stable(feature = "debug_builders", since = "1.2.0")]
820799
pub fn finish(&mut self) -> fmt::Result {
821-
let prefix = if self.is_pretty() && self.has_fields {
822-
"\n"
823-
} else {
824-
""
825-
};
826-
self.result.and_then(|_| write!(self.fmt, "{}}}", prefix))
800+
self.result.and_then(|_| self.fmt.write_str("}"))
827801
}
828802

829803
fn is_pretty(&self) -> bool {

src/libcore/tests/fmt/builders.rs

+26-26
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ mod debug_struct {
3030
assert_eq!("Foo { bar: true }", format!("{:?}", Foo));
3131
assert_eq!(
3232
"Foo {
33-
bar: true
33+
bar: true,
3434
}",
3535
format!("{:#?}", Foo));
3636
}
@@ -52,7 +52,7 @@ mod debug_struct {
5252
assert_eq!(
5353
"Foo {
5454
bar: true,
55-
baz: 10/20
55+
baz: 10/20,
5656
}",
5757
format!("{:#?}", Foo));
5858
}
@@ -87,9 +87,9 @@ mod debug_struct {
8787
"Bar {
8888
foo: Foo {
8989
bar: true,
90-
baz: 10/20
90+
baz: 10/20,
9191
},
92-
hello: \"world\"
92+
hello: \"world\",
9393
}",
9494
format!("{:#?}", Bar));
9595
}
@@ -127,7 +127,7 @@ mod debug_tuple {
127127
assert_eq!("Foo(true)", format!("{:?}", Foo));
128128
assert_eq!(
129129
"Foo(
130-
true
130+
true,
131131
)",
132132
format!("{:#?}", Foo));
133133
}
@@ -149,7 +149,7 @@ mod debug_tuple {
149149
assert_eq!(
150150
"Foo(
151151
true,
152-
10/20
152+
10/20,
153153
)",
154154
format!("{:#?}", Foo));
155155
}
@@ -184,9 +184,9 @@ mod debug_tuple {
184184
"Bar(
185185
Foo(
186186
true,
187-
10/20
187+
10/20,
188188
),
189-
\"world\"
189+
\"world\",
190190
)",
191191
format!("{:#?}", Bar));
192192
}
@@ -224,7 +224,7 @@ mod debug_map {
224224
assert_eq!("{\"bar\": true}", format!("{:?}", Foo));
225225
assert_eq!(
226226
"{
227-
\"bar\": true
227+
\"bar\": true,
228228
}",
229229
format!("{:#?}", Foo));
230230
}
@@ -246,7 +246,7 @@ mod debug_map {
246246
assert_eq!(
247247
"{
248248
\"bar\": true,
249-
10: 10/20
249+
10: 10/20,
250250
}",
251251
format!("{:#?}", Foo));
252252
}
@@ -282,12 +282,12 @@ mod debug_map {
282282
"{
283283
\"foo\": {
284284
\"bar\": true,
285-
10: 10/20
285+
10: 10/20,
286286
},
287287
{
288288
\"bar\": true,
289-
10: 10/20
290-
}: \"world\"
289+
10: 10/20,
290+
}: \"world\",
291291
}",
292292
format!("{:#?}", Bar));
293293
}
@@ -325,7 +325,7 @@ mod debug_set {
325325
assert_eq!("{true}", format!("{:?}", Foo));
326326
assert_eq!(
327327
"{
328-
true
328+
true,
329329
}",
330330
format!("{:#?}", Foo));
331331
}
@@ -347,7 +347,7 @@ mod debug_set {
347347
assert_eq!(
348348
"{
349349
true,
350-
10/20
350+
10/20,
351351
}",
352352
format!("{:#?}", Foo));
353353
}
@@ -382,9 +382,9 @@ mod debug_set {
382382
"{
383383
{
384384
true,
385-
10/20
385+
10/20,
386386
},
387-
\"world\"
387+
\"world\",
388388
}",
389389
format!("{:#?}", Bar));
390390
}
@@ -422,7 +422,7 @@ mod debug_list {
422422
assert_eq!("[true]", format!("{:?}", Foo));
423423
assert_eq!(
424424
"[
425-
true
425+
true,
426426
]",
427427
format!("{:#?}", Foo));
428428
}
@@ -444,7 +444,7 @@ mod debug_list {
444444
assert_eq!(
445445
"[
446446
true,
447-
10/20
447+
10/20,
448448
]",
449449
format!("{:#?}", Foo));
450450
}
@@ -479,9 +479,9 @@ mod debug_list {
479479
"[
480480
[
481481
true,
482-
10/20
482+
10/20,
483483
],
484-
\"world\"
484+
\"world\",
485485
]",
486486
format!("{:#?}", Bar));
487487
}
@@ -513,31 +513,31 @@ fn test_formatting_parameters_are_forwarded() {
513513
assert_eq!(format!("{:#03?}", struct_), "
514514
Foo {
515515
bar: 1024,
516-
baz: 007
516+
baz: 007,
517517
}
518518
".trim());
519519
assert_eq!(format!("{:#03?}", tuple), "
520520
(
521521
1024,
522-
007
522+
007,
523523
)
524524
".trim());
525525
assert_eq!(format!("{:#03?}", list), "
526526
[
527527
1024,
528-
007
528+
007,
529529
]
530530
".trim());
531531
assert_eq!(format!("{:#03?}", map), r#"
532532
{
533533
"bar": 1024,
534-
"baz": 007
534+
"baz": 007,
535535
}
536536
"#.trim());
537537
assert_eq!(format!("{:#03?}", set), "
538538
{
539539
007,
540-
1024
540+
1024,
541541
}
542542
".trim());
543543
}

0 commit comments

Comments
 (0)