@@ -21,7 +21,7 @@ use atty;
21
21
use std:: borrow:: Cow ;
22
22
use std:: io:: prelude:: * ;
23
23
use std:: io;
24
- use std:: collections:: { HashMap , HashSet } ;
24
+ use std:: collections:: HashMap ;
25
25
use std:: cmp:: min;
26
26
use termcolor:: { StandardStream , ColorChoice , ColorSpec , BufferWriter } ;
27
27
use termcolor:: { WriteColor , Color , Buffer } ;
@@ -33,6 +33,11 @@ const ANONYMIZED_LINE_NUM: &str = "LL";
33
33
pub trait Emitter {
34
34
/// Emit a structured diagnostic.
35
35
fn emit ( & mut self , db : & DiagnosticBuilder ) ;
36
+
37
+ /// Check if should show explanations about "rustc --explain"
38
+ fn should_show_explain ( & self ) -> bool {
39
+ true
40
+ }
36
41
}
37
42
38
43
impl Emitter for EmitterWriter {
@@ -80,6 +85,10 @@ impl Emitter for EmitterWriter {
80
85
& children,
81
86
& suggestions) ;
82
87
}
88
+
89
+ fn should_show_explain ( & self ) -> bool {
90
+ !self . short_message
91
+ }
83
92
}
84
93
85
94
/// maximum number of lines we will print for each error; arbitrary.
@@ -114,7 +123,6 @@ pub struct EmitterWriter {
114
123
cm : Option < Lrc < CodeMapper > > ,
115
124
short_message : bool ,
116
125
teach : bool ,
117
- error_codes : HashSet < String > ,
118
126
ui_testing : bool ,
119
127
}
120
128
@@ -124,34 +132,6 @@ struct FileWithAnnotatedLines {
124
132
multiline_depth : usize ,
125
133
}
126
134
127
- impl Drop for EmitterWriter {
128
- fn drop ( & mut self ) {
129
- if !self . short_message && !self . error_codes . is_empty ( ) {
130
- let mut error_codes = self . error_codes . clone ( ) . into_iter ( ) . collect :: < Vec < _ > > ( ) ;
131
- let mut dst = self . dst . writable ( ) ;
132
- error_codes. sort ( ) ;
133
- if error_codes. len ( ) > 1 {
134
- let limit = if error_codes. len ( ) > 9 { 9 } else { error_codes. len ( ) } ;
135
- writeln ! ( dst,
136
- "You've got a few errors: {}{}" ,
137
- error_codes[ ..limit] . join( ", " ) ,
138
- if error_codes. len( ) > 9 { "..." } else { "" }
139
- ) . expect ( "failed to give tips..." ) ;
140
- writeln ! ( dst,
141
- "If you want more information on an error, try using \
142
- \" rustc --explain {}\" ",
143
- & error_codes[ 0 ] ) . expect ( "failed to give tips..." ) ;
144
- } else {
145
- writeln ! ( dst,
146
- "If you want more information on this error, try using \
147
- \" rustc --explain {}\" ",
148
- & error_codes[ 0 ] ) . expect ( "failed to give tips..." ) ;
149
- }
150
- dst. flush ( ) . expect ( "failed to emit errors" ) ;
151
- }
152
- }
153
- }
154
-
155
135
impl EmitterWriter {
156
136
pub fn stderr ( color_config : ColorConfig ,
157
137
code_map : Option < Lrc < CodeMapper > > ,
@@ -164,7 +144,6 @@ impl EmitterWriter {
164
144
cm : code_map,
165
145
short_message,
166
146
teach,
167
- error_codes : HashSet :: new ( ) ,
168
147
ui_testing : false ,
169
148
}
170
149
}
@@ -179,7 +158,6 @@ impl EmitterWriter {
179
158
cm : code_map,
180
159
short_message,
181
160
teach,
182
- error_codes : HashSet :: new ( ) ,
183
161
ui_testing : false ,
184
162
}
185
163
}
@@ -993,18 +971,26 @@ impl EmitterWriter {
993
971
buffer. prepend ( 0 , " " , Style :: NoStyle ) ;
994
972
}
995
973
draw_note_separator ( & mut buffer, 0 , max_line_num_len + 1 ) ;
996
- buffer. append ( 0 , & level. to_string ( ) , Style :: HeaderMsg ) ;
997
- buffer. append ( 0 , ": " , Style :: NoStyle ) ;
974
+ let level_str = level. to_string ( ) ;
975
+ if !level_str. is_empty ( ) {
976
+ buffer. append ( 0 , & level_str, Style :: HeaderMsg ) ;
977
+ buffer. append ( 0 , ": " , Style :: NoStyle ) ;
978
+ }
998
979
self . msg_to_buffer ( & mut buffer, msg, max_line_num_len, "note" , None ) ;
999
980
} else {
1000
- buffer. append ( 0 , & level. to_string ( ) , Style :: Level ( level. clone ( ) ) ) ;
981
+ let level_str = level. to_string ( ) ;
982
+ if !level_str. is_empty ( ) {
983
+ buffer. append ( 0 , & level_str, Style :: Level ( level. clone ( ) ) ) ;
984
+ }
1001
985
// only render error codes, not lint codes
1002
986
if let Some ( DiagnosticId :: Error ( ref code) ) = * code {
1003
987
buffer. append ( 0 , "[" , Style :: Level ( level. clone ( ) ) ) ;
1004
988
buffer. append ( 0 , & code, Style :: Level ( level. clone ( ) ) ) ;
1005
989
buffer. append ( 0 , "]" , Style :: Level ( level. clone ( ) ) ) ;
1006
990
}
1007
- buffer. append ( 0 , ": " , Style :: HeaderMsg ) ;
991
+ if !level_str. is_empty ( ) {
992
+ buffer. append ( 0 , ": " , Style :: HeaderMsg ) ;
993
+ }
1008
994
for & ( ref text, _) in msg. iter ( ) {
1009
995
buffer. append ( 0 , text, Style :: HeaderMsg ) ;
1010
996
}
@@ -1020,14 +1006,12 @@ impl EmitterWriter {
1020
1006
if primary_span != & & DUMMY_SP {
1021
1007
( cm. lookup_char_pos ( primary_span. lo ( ) ) , cm)
1022
1008
} else {
1023
- emit_to_destination ( & buffer. render ( ) , level, & mut self . dst , self . short_message ,
1024
- & mut self . error_codes ) ?;
1009
+ emit_to_destination ( & buffer. render ( ) , level, & mut self . dst , self . short_message ) ?;
1025
1010
return Ok ( ( ) ) ;
1026
1011
}
1027
1012
} else {
1028
1013
// If we don't have span information, emit and exit
1029
- emit_to_destination ( & buffer. render ( ) , level, & mut self . dst , self . short_message ,
1030
- & mut self . error_codes ) ?;
1014
+ emit_to_destination ( & buffer. render ( ) , level, & mut self . dst , self . short_message ) ?;
1031
1015
return Ok ( ( ) ) ;
1032
1016
} ;
1033
1017
if let Ok ( pos) =
@@ -1200,8 +1184,7 @@ impl EmitterWriter {
1200
1184
}
1201
1185
1202
1186
// final step: take our styled buffer, render it, then output it
1203
- emit_to_destination ( & buffer. render ( ) , level, & mut self . dst , self . short_message ,
1204
- & mut self . error_codes ) ?;
1187
+ emit_to_destination ( & buffer. render ( ) , level, & mut self . dst , self . short_message ) ?;
1205
1188
1206
1189
Ok ( ( ) )
1207
1190
@@ -1218,8 +1201,11 @@ impl EmitterWriter {
1218
1201
let mut buffer = StyledBuffer :: new ( ) ;
1219
1202
1220
1203
// Render the suggestion message
1221
- buffer. append ( 0 , & level. to_string ( ) , Style :: Level ( level. clone ( ) ) ) ;
1222
- buffer. append ( 0 , ": " , Style :: HeaderMsg ) ;
1204
+ let level_str = level. to_string ( ) ;
1205
+ if !level_str. is_empty ( ) {
1206
+ buffer. append ( 0 , & level_str, Style :: Level ( level. clone ( ) ) ) ;
1207
+ buffer. append ( 0 , ": " , Style :: HeaderMsg ) ;
1208
+ }
1223
1209
self . msg_to_buffer ( & mut buffer,
1224
1210
& [ ( suggestion. msg . to_owned ( ) , Style :: NoStyle ) ] ,
1225
1211
max_line_num_len,
@@ -1289,8 +1275,7 @@ impl EmitterWriter {
1289
1275
let msg = format ! ( "and {} other candidates" , suggestions. len( ) - MAX_SUGGESTIONS ) ;
1290
1276
buffer. puts ( row_num, 0 , & msg, Style :: NoStyle ) ;
1291
1277
}
1292
- emit_to_destination ( & buffer. render ( ) , level, & mut self . dst , self . short_message ,
1293
- & mut self . error_codes ) ?;
1278
+ emit_to_destination ( & buffer. render ( ) , level, & mut self . dst , self . short_message ) ?;
1294
1279
}
1295
1280
Ok ( ( ) )
1296
1281
}
@@ -1321,7 +1306,7 @@ impl EmitterWriter {
1321
1306
draw_col_separator_no_space ( & mut buffer, 0 , max_line_num_len + 1 ) ;
1322
1307
}
1323
1308
match emit_to_destination ( & buffer. render ( ) , level, & mut self . dst ,
1324
- self . short_message , & mut self . error_codes ) {
1309
+ self . short_message ) {
1325
1310
Ok ( ( ) ) => ( ) ,
1326
1311
Err ( e) => panic ! ( "failed to emit error: {}" , e)
1327
1312
}
@@ -1416,8 +1401,7 @@ fn overlaps(a1: &Annotation, a2: &Annotation, padding: usize) -> bool {
1416
1401
fn emit_to_destination ( rendered_buffer : & Vec < Vec < StyledString > > ,
1417
1402
lvl : & Level ,
1418
1403
dst : & mut Destination ,
1419
- short_message : bool ,
1420
- error_codes : & mut HashSet < String > )
1404
+ short_message : bool )
1421
1405
-> io:: Result < ( ) > {
1422
1406
use lock;
1423
1407
@@ -1436,16 +1420,13 @@ fn emit_to_destination(rendered_buffer: &Vec<Vec<StyledString>>,
1436
1420
// same buffering approach. Instead, we use a global Windows mutex, which we acquire long
1437
1421
// enough to output the full error message, then we release.
1438
1422
let _buffer_lock = lock:: acquire_global_lock ( "rustc_errors" ) ;
1439
- for line in rendered_buffer {
1423
+ for ( pos , line) in rendered_buffer. iter ( ) . enumerate ( ) {
1440
1424
for part in line {
1441
1425
dst. apply_style ( lvl. clone ( ) , part. style ) ?;
1442
1426
write ! ( dst, "{}" , part. text) ?;
1443
- if !short_message && part. text . len ( ) == 12 && part. text . starts_with ( "error[E" ) {
1444
- error_codes. insert ( part. text [ 6 ..11 ] . to_owned ( ) ) ;
1445
- }
1446
1427
dst. reset ( ) ?;
1447
1428
}
1448
- if !short_message {
1429
+ if !short_message && ( !lvl . is_failure_note ( ) || pos != rendered_buffer . len ( ) - 1 ) {
1449
1430
write ! ( dst, "\n " ) ?;
1450
1431
}
1451
1432
}
0 commit comments