@@ -40,7 +40,8 @@ pub trait CoreEmitter {
40
40
msg : & str ,
41
41
code : Option < & str > ,
42
42
lvl : Level ,
43
- is_header : bool ) ;
43
+ is_header : bool ,
44
+ show_snippet : bool ) ;
44
45
}
45
46
46
47
impl < T : CoreEmitter > Emitter for T {
@@ -53,25 +54,47 @@ impl<T: CoreEmitter> Emitter for T {
53
54
msg,
54
55
code,
55
56
lvl,
57
+ true ,
56
58
true ) ;
57
59
}
58
60
59
61
fn emit_struct ( & mut self , db : & DiagnosticBuilder ) {
62
+ let old_school = match :: std:: env:: var ( "RUST_NEW_ERROR_FORMAT" ) {
63
+ Ok ( _) => false ,
64
+ Err ( _) => true ,
65
+ } ;
66
+ let db_span = FullSpan ( db. span . clone ( ) ) ;
60
67
self . emit_message ( & FullSpan ( db. span . clone ( ) ) ,
61
68
& db. message ,
62
69
db. code . as_ref ( ) . map ( |s| & * * s) ,
63
70
db. level ,
71
+ true ,
64
72
true ) ;
65
73
for child in & db. children {
66
74
let render_span = child. render_span
67
75
. clone ( )
68
76
. unwrap_or_else (
69
77
|| FullSpan ( child. span . clone ( ) ) ) ;
70
- self . emit_message ( & render_span,
71
- & child. message ,
72
- None ,
73
- child. level ,
74
- false ) ;
78
+
79
+ if !old_school {
80
+ self . emit_message ( & render_span,
81
+ & child. message ,
82
+ None ,
83
+ child. level ,
84
+ false ,
85
+ true ) ;
86
+ } else {
87
+ let ( render_span, show_snippet) = match render_span. span ( ) . primary_span ( ) {
88
+ None => ( db_span. clone ( ) , false ) ,
89
+ _ => ( render_span, true )
90
+ } ;
91
+ self . emit_message ( & render_span,
92
+ & child. message ,
93
+ None ,
94
+ child. level ,
95
+ false ,
96
+ show_snippet) ;
97
+ }
75
98
}
76
99
}
77
100
}
@@ -108,7 +131,8 @@ impl CoreEmitter for BasicEmitter {
108
131
msg : & str ,
109
132
code : Option < & str > ,
110
133
lvl : Level ,
111
- _is_header : bool ) {
134
+ _is_header : bool ,
135
+ _show_snippet : bool ) {
112
136
// we ignore the span as we have no access to a codemap at this point
113
137
if let Err ( e) = print_diagnostic ( & mut self . dst , "" , lvl, msg, code) {
114
138
panic ! ( "failed to print diagnostics: {:?}" , e) ;
@@ -146,8 +170,9 @@ impl CoreEmitter for EmitterWriter {
146
170
msg : & str ,
147
171
code : Option < & str > ,
148
172
lvl : Level ,
149
- is_header : bool ) {
150
- match self . emit_message_ ( rsp, msg, code, lvl, is_header) {
173
+ is_header : bool ,
174
+ show_snippet : bool ) {
175
+ match self . emit_message_ ( rsp, msg, code, lvl, is_header, show_snippet) {
151
176
Ok ( ( ) ) => { }
152
177
Err ( e) => panic ! ( "failed to emit error: {}" , e)
153
178
}
@@ -213,7 +238,8 @@ impl EmitterWriter {
213
238
msg : & str ,
214
239
code : Option < & str > ,
215
240
lvl : Level ,
216
- is_header : bool )
241
+ is_header : bool ,
242
+ show_snippet : bool )
217
243
-> io:: Result < ( ) > {
218
244
if is_header {
219
245
if self . first {
@@ -243,10 +269,24 @@ impl EmitterWriter {
243
269
}
244
270
}
245
271
_ => {
246
- print_diagnostic ( & mut self . dst , "" , lvl, msg, code) ?
272
+ if self . old_school {
273
+ let loc = match rsp. span ( ) . primary_span ( ) {
274
+ Some ( COMMAND_LINE_SP ) | Some ( DUMMY_SP ) => "" . to_string ( ) ,
275
+ Some ( ps) => self . cm . span_to_string ( ps) ,
276
+ None => "" . to_string ( )
277
+ } ;
278
+ print_diagnostic ( & mut self . dst , & loc, lvl, msg, code) ?
279
+ }
280
+ else {
281
+ print_diagnostic ( & mut self . dst , "" , lvl, msg, code) ?
282
+ }
247
283
}
248
284
}
249
285
286
+ if !show_snippet {
287
+ return Ok ( ( ) ) ;
288
+ }
289
+
250
290
// Watch out for various nasty special spans; don't try to
251
291
// print any filename or anything for those.
252
292
match rsp. span ( ) . primary_span ( ) {
@@ -333,8 +373,10 @@ impl EmitterWriter {
333
373
msp. primary_span ( ) ) ;
334
374
if self . old_school {
335
375
let mut output_vec = vec ! [ ] ;
376
+
336
377
for span_label in msp. span_labels ( ) {
337
378
let mut snippet_data = snippet_data. clone ( ) ;
379
+
338
380
snippet_data. push ( span_label. span ,
339
381
span_label. is_primary ,
340
382
span_label. label ) ;
@@ -412,7 +454,16 @@ fn print_diagnostic(dst: &mut Destination,
412
454
code : Option < & str > )
413
455
-> io:: Result < ( ) > {
414
456
if !topic. is_empty ( ) {
415
- write ! ( dst, "{}: " , topic) ?;
457
+ let old_school = match :: std:: env:: var ( "RUST_NEW_ERROR_FORMAT" ) {
458
+ Ok ( _) => false ,
459
+ Err ( _) => true ,
460
+ } ;
461
+ if !old_school {
462
+ write ! ( dst, "{}: " , topic) ?;
463
+ }
464
+ else {
465
+ write ! ( dst, "{} " , topic) ?;
466
+ }
416
467
dst. reset_attrs ( ) ?;
417
468
}
418
469
dst. start_attr ( term:: Attr :: Bold ) ?;
0 commit comments