@@ -33,7 +33,11 @@ impl Emitter for EmitterWriter {
33
33
let mut primary_span = db. span . clone ( ) ;
34
34
let mut children = db. children . clone ( ) ;
35
35
self . fix_multispans_in_std_macros ( & mut primary_span, & mut children) ;
36
- self . emit_messages_default ( & db. level , & db. message , & db. code , & primary_span, & children) ;
36
+ self . emit_messages_default ( & db. level ,
37
+ & db. styled_message ( ) ,
38
+ & db. code ,
39
+ & primary_span,
40
+ & children) ;
37
41
}
38
42
}
39
43
@@ -695,17 +699,23 @@ impl EmitterWriter {
695
699
if spans_updated {
696
700
children. push ( SubDiagnostic {
697
701
level : Level :: Note ,
698
- message : "this error originates in a macro outside of the current crate"
699
- . to_string ( ) ,
702
+ message : vec ! [ ( "this error originates in a macro outside of the current crate"
703
+ . to_string( ) , Style :: NoStyle ) ] ,
700
704
span : MultiSpan :: new ( ) ,
701
705
render_span : None ,
702
706
} ) ;
703
707
}
704
708
}
705
709
706
710
/// Add a left margin to every line but the first, given a padding length and the label being
707
- /// displayed.
708
- fn msg_with_padding ( & self , msg : & str , padding : usize , label : & str ) -> String {
711
+ /// displayed, keeping the provided highlighting.
712
+ fn msg_to_buffer ( & self ,
713
+ buffer : & mut StyledBuffer ,
714
+ msg : & Vec < ( String , Style ) > ,
715
+ padding : usize ,
716
+ label : & str ,
717
+ override_style : Option < Style > ) {
718
+
709
719
// The extra 5 ` ` is padding that's always needed to align to the `note: `:
710
720
//
711
721
// error: message
@@ -726,20 +736,56 @@ impl EmitterWriter {
726
736
. map ( |_| " " )
727
737
. collect :: < String > ( ) ;
728
738
729
- msg. split ( '\n' ) . enumerate ( ) . fold ( "" . to_owned ( ) , |mut acc, x| {
730
- if x. 0 != 0 {
731
- acc. push_str ( "\n " ) ;
732
- // Align every line with first one.
733
- acc. push_str ( & padding) ;
739
+ /// Return wether `style`, or the override if present and the style is `NoStyle`.
740
+ fn style_or_override ( style : Style , override_style : Option < Style > ) -> Style {
741
+ if let Some ( o) = override_style {
742
+ if style == Style :: NoStyle {
743
+ return o;
744
+ }
745
+ }
746
+ style
747
+ }
748
+
749
+ let mut line_number = 0 ;
750
+
751
+ // Provided the following diagnostic message:
752
+ //
753
+ // let msg = vec![
754
+ // ("
755
+ // ("highlighted multiline\nstring to\nsee how it ", Style::NoStyle),
756
+ // ("looks", Style::Highlight),
757
+ // ("with\nvery ", Style::NoStyle),
758
+ // ("weird", Style::Highlight),
759
+ // (" formats\n", Style::NoStyle),
760
+ // ("see?", Style::Highlight),
761
+ // ];
762
+ //
763
+ // the expected output on a note is (* surround the highlighted text)
764
+ //
765
+ // = note: highlighted multiline
766
+ // string to
767
+ // see how it *looks* with
768
+ // very *weird* formats
769
+ // see?
770
+ for & ( ref text, ref style) in msg. iter ( ) {
771
+ let lines = text. split ( '\n' ) . collect :: < Vec < _ > > ( ) ;
772
+ if lines. len ( ) > 1 {
773
+ for ( i, line) in lines. iter ( ) . enumerate ( ) {
774
+ if i != 0 {
775
+ line_number += 1 ;
776
+ buffer. append ( line_number, & padding, Style :: NoStyle ) ;
777
+ }
778
+ buffer. append ( line_number, line, style_or_override ( * style, override_style) ) ;
779
+ }
780
+ } else {
781
+ buffer. append ( line_number, text, style_or_override ( * style, override_style) ) ;
734
782
}
735
- acc. push_str ( & x. 1 ) ;
736
- acc
737
- } )
783
+ }
738
784
}
739
785
740
786
fn emit_message_default ( & mut self ,
741
787
msp : & MultiSpan ,
742
- msg : & str ,
788
+ msg : & Vec < ( String , Style ) > ,
743
789
code : & Option < String > ,
744
790
level : & Level ,
745
791
max_line_num_len : usize ,
@@ -755,9 +801,7 @@ impl EmitterWriter {
755
801
draw_note_separator ( & mut buffer, 0 , max_line_num_len + 1 ) ;
756
802
buffer. append ( 0 , & level. to_string ( ) , Style :: HeaderMsg ) ;
757
803
buffer. append ( 0 , ": " , Style :: NoStyle ) ;
758
-
759
- let message = self . msg_with_padding ( msg, max_line_num_len, "note" ) ;
760
- buffer. append ( 0 , & message, Style :: NoStyle ) ;
804
+ self . msg_to_buffer ( & mut buffer, msg, max_line_num_len, "note" , None ) ;
761
805
} else {
762
806
buffer. append ( 0 , & level. to_string ( ) , Style :: Level ( level. clone ( ) ) ) ;
763
807
match code {
@@ -769,7 +813,9 @@ impl EmitterWriter {
769
813
_ => { }
770
814
}
771
815
buffer. append ( 0 , ": " , Style :: HeaderMsg ) ;
772
- buffer. append ( 0 , msg, Style :: HeaderMsg ) ;
816
+ for & ( ref text, _) in msg. iter ( ) {
817
+ buffer. append ( 0 , text, Style :: HeaderMsg ) ;
818
+ }
773
819
}
774
820
775
821
// Preprocess all the annotations so that they are grouped by file and by line number
@@ -879,7 +925,7 @@ impl EmitterWriter {
879
925
fn emit_suggestion_default ( & mut self ,
880
926
suggestion : & CodeSuggestion ,
881
927
level : & Level ,
882
- msg : & str ,
928
+ msg : & Vec < ( String , Style ) > ,
883
929
max_line_num_len : usize )
884
930
-> io:: Result < ( ) > {
885
931
use std:: borrow:: Borrow ;
@@ -890,9 +936,11 @@ impl EmitterWriter {
890
936
891
937
buffer. append ( 0 , & level. to_string ( ) , Style :: Level ( level. clone ( ) ) ) ;
892
938
buffer. append ( 0 , ": " , Style :: HeaderMsg ) ;
893
-
894
- let message = self . msg_with_padding ( msg, max_line_num_len, "suggestion" ) ;
895
- buffer. append ( 0 , & message, Style :: HeaderMsg ) ;
939
+ self . msg_to_buffer ( & mut buffer,
940
+ msg,
941
+ max_line_num_len,
942
+ "suggestion" ,
943
+ Some ( Style :: HeaderMsg ) ) ;
896
944
897
945
let lines = cm. span_to_lines ( primary_span) . unwrap ( ) ;
898
946
@@ -921,7 +969,7 @@ impl EmitterWriter {
921
969
}
922
970
fn emit_messages_default ( & mut self ,
923
971
level : & Level ,
924
- message : & String ,
972
+ message : & Vec < ( String , Style ) > ,
925
973
code : & Option < String > ,
926
974
span : & MultiSpan ,
927
975
children : & Vec < SubDiagnostic > ) {
@@ -942,7 +990,7 @@ impl EmitterWriter {
942
990
match child. render_span {
943
991
Some ( FullSpan ( ref msp) ) => {
944
992
match self . emit_message_default ( msp,
945
- & child. message ,
993
+ & child. styled_message ( ) ,
946
994
& None ,
947
995
& child. level ,
948
996
max_line_num_len,
@@ -954,15 +1002,15 @@ impl EmitterWriter {
954
1002
Some ( Suggestion ( ref cs) ) => {
955
1003
match self . emit_suggestion_default ( cs,
956
1004
& child. level ,
957
- & child. message ,
1005
+ & child. styled_message ( ) ,
958
1006
max_line_num_len) {
959
1007
Err ( e) => panic ! ( "failed to emit error: {}" , e) ,
960
1008
_ => ( )
961
1009
}
962
1010
} ,
963
1011
None => {
964
1012
match self . emit_message_default ( & child. span ,
965
- & child. message ,
1013
+ & child. styled_message ( ) ,
966
1014
& None ,
967
1015
& child. level ,
968
1016
max_line_num_len,
@@ -1197,6 +1245,7 @@ impl Destination {
1197
1245
self . start_attr ( term:: Attr :: Bold ) ?;
1198
1246
self . start_attr ( term:: Attr :: ForegroundColor ( l. color ( ) ) ) ?;
1199
1247
}
1248
+ Style :: Highlight => self . start_attr ( term:: Attr :: Bold ) ?,
1200
1249
}
1201
1250
Ok ( ( ) )
1202
1251
}
0 commit comments