@@ -2,7 +2,10 @@ use Destination::*;
22
33use syntax_pos:: { SourceFile , Span , MultiSpan } ;
44
5- use crate :: { Level , CodeSuggestion , DiagnosticBuilder , SubDiagnostic , SourceMapperDyn , DiagnosticId } ;
5+ use crate :: {
6+ Level , CodeSuggestion , DiagnosticBuilder , SubDiagnostic ,
7+ SuggestionStyle , SourceMapperDyn , DiagnosticId ,
8+ } ;
69use crate :: snippet:: { Annotation , AnnotationType , Line , MultilineAnnotation , StyledString , Style } ;
710use crate :: styled_buffer:: StyledBuffer ;
811
@@ -43,9 +46,14 @@ impl Emitter for EmitterWriter {
4346 // don't display long messages as labels
4447 sugg. msg . split_whitespace ( ) . count ( ) < 10 &&
4548 // don't display multiline suggestions as labels
46- !sugg. substitutions [ 0 ] . parts [ 0 ] . snippet . contains ( '\n' ) {
49+ !sugg. substitutions [ 0 ] . parts [ 0 ] . snippet . contains ( '\n' ) &&
50+ // when this style is set we want the suggestion to be a message, not inline
51+ sugg. style != SuggestionStyle :: HideCodeAlways &&
52+ // trivial suggestion for tooling's sake, never shown
53+ sugg. style != SuggestionStyle :: CompletelyHidden
54+ {
4755 let substitution = & sugg. substitutions [ 0 ] . parts [ 0 ] . snippet . trim ( ) ;
48- let msg = if substitution. len ( ) == 0 || ! sugg. show_code_when_inline {
56+ let msg = if substitution. len ( ) == 0 || sugg. style . hide_inline ( ) {
4957 // This substitution is only removal or we explicitly don't want to show the
5058 // code inline, don't show it
5159 format ! ( "help: {}" , sugg. msg)
@@ -942,14 +950,15 @@ impl EmitterWriter {
942950 }
943951 }
944952
945- fn emit_message_default ( & mut self ,
946- msp : & MultiSpan ,
947- msg : & [ ( String , Style ) ] ,
948- code : & Option < DiagnosticId > ,
949- level : & Level ,
950- max_line_num_len : usize ,
951- is_secondary : bool )
952- -> io:: Result < ( ) > {
953+ fn emit_message_default (
954+ & mut self ,
955+ msp : & MultiSpan ,
956+ msg : & [ ( String , Style ) ] ,
957+ code : & Option < DiagnosticId > ,
958+ level : & Level ,
959+ max_line_num_len : usize ,
960+ is_secondary : bool ,
961+ ) -> io:: Result < ( ) > {
953962 let mut buffer = StyledBuffer :: new ( ) ;
954963 let header_style = if is_secondary {
955964 Style :: HeaderMsg
@@ -1184,11 +1193,12 @@ impl EmitterWriter {
11841193
11851194 }
11861195
1187- fn emit_suggestion_default ( & mut self ,
1188- suggestion : & CodeSuggestion ,
1189- level : & Level ,
1190- max_line_num_len : usize )
1191- -> io:: Result < ( ) > {
1196+ fn emit_suggestion_default (
1197+ & mut self ,
1198+ suggestion : & CodeSuggestion ,
1199+ level : & Level ,
1200+ max_line_num_len : usize ,
1201+ ) -> io:: Result < ( ) > {
11921202 if let Some ( ref sm) = self . sm {
11931203 let mut buffer = StyledBuffer :: new ( ) ;
11941204
@@ -1198,11 +1208,13 @@ impl EmitterWriter {
11981208 buffer. append ( 0 , & level_str, Style :: Level ( level. clone ( ) ) ) ;
11991209 buffer. append ( 0 , ": " , Style :: HeaderMsg ) ;
12001210 }
1201- self . msg_to_buffer ( & mut buffer,
1202- & [ ( suggestion. msg . to_owned ( ) , Style :: NoStyle ) ] ,
1203- max_line_num_len,
1204- "suggestion" ,
1205- Some ( Style :: HeaderMsg ) ) ;
1211+ self . msg_to_buffer (
1212+ & mut buffer,
1213+ & [ ( suggestion. msg . to_owned ( ) , Style :: NoStyle ) ] ,
1214+ max_line_num_len,
1215+ "suggestion" ,
1216+ Some ( Style :: HeaderMsg ) ,
1217+ ) ;
12061218
12071219 // Render the replacements for each suggestion
12081220 let suggestions = suggestion. splice_lines ( & * * sm) ;
@@ -1340,22 +1352,42 @@ impl EmitterWriter {
13401352 if !self . short_message {
13411353 for child in children {
13421354 let span = child. render_span . as_ref ( ) . unwrap_or ( & child. span ) ;
1343- match self . emit_message_default ( & span,
1344- & child. styled_message ( ) ,
1345- & None ,
1346- & child. level ,
1347- max_line_num_len,
1348- true ) {
1355+ match self . emit_message_default (
1356+ & span,
1357+ & child. styled_message ( ) ,
1358+ & None ,
1359+ & child. level ,
1360+ max_line_num_len,
1361+ true ,
1362+ ) {
13491363 Err ( e) => panic ! ( "failed to emit error: {}" , e) ,
13501364 _ => ( )
13511365 }
13521366 }
13531367 for sugg in suggestions {
1354- match self . emit_suggestion_default ( sugg,
1355- & Level :: Help ,
1356- max_line_num_len) {
1357- Err ( e) => panic ! ( "failed to emit error: {}" , e) ,
1358- _ => ( )
1368+ if sugg. style == SuggestionStyle :: CompletelyHidden {
1369+ // do not display this suggestion, it is meant only for tools
1370+ } else if sugg. style == SuggestionStyle :: HideCodeAlways {
1371+ match self . emit_message_default (
1372+ & MultiSpan :: new ( ) ,
1373+ & [ ( sugg. msg . to_owned ( ) , Style :: HeaderMsg ) ] ,
1374+ & None ,
1375+ & Level :: Help ,
1376+ max_line_num_len,
1377+ true ,
1378+ ) {
1379+ Err ( e) => panic ! ( "failed to emit error: {}" , e) ,
1380+ _ => ( )
1381+ }
1382+ } else {
1383+ match self . emit_suggestion_default (
1384+ sugg,
1385+ & Level :: Help ,
1386+ max_line_num_len,
1387+ ) {
1388+ Err ( e) => panic ! ( "failed to emit error: {}" , e) ,
1389+ _ => ( )
1390+ }
13591391 }
13601392 }
13611393 }
0 commit comments