@@ -16,6 +16,8 @@ use std::iter;
1616use std:: path:: Path ;
1717use std:: sync:: Arc ;
1818
19+ use anstream:: { AutoStream , ColorChoice } ;
20+ use anstyle:: { AnsiColor , Effects } ;
1921use derive_setters:: Setters ;
2022use rustc_data_structures:: fx:: { FxIndexMap , FxIndexSet } ;
2123use rustc_data_structures:: sync:: { DynSend , IntoDynSyncSend } ;
@@ -25,7 +27,6 @@ use rustc_lint_defs::pluralize;
2527use rustc_span:: hygiene:: { ExpnKind , MacroKind } ;
2628use rustc_span:: source_map:: SourceMap ;
2729use rustc_span:: { FileLines , FileName , SourceFile , Span , char_width, str_width} ;
28- use termcolor:: { Buffer , BufferWriter , Color , ColorChoice , ColorSpec , StandardStream , WriteColor } ;
2930use tracing:: { debug, instrument, trace, warn} ;
3031
3132use crate :: registry:: Registry ;
@@ -525,10 +526,6 @@ impl Emitter for HumanEmitter {
525526 !self . short_message
526527 }
527528
528- fn supports_color ( & self ) -> bool {
529- self . dst . supports_color ( )
530- }
531-
532529 fn translator ( & self ) -> & Translator {
533530 & self . translator
534531 }
@@ -1701,7 +1698,6 @@ impl HumanEmitter {
17011698 } else {
17021699 col_sep_before_no_show_source = true ;
17031700 }
1704-
17051701 // print out the span location and spacer before we print the annotated source
17061702 // to do this, we need to know if this span will be primary
17071703 let is_primary = primary_lo. file . name == annotated_file. file . name ;
@@ -3127,7 +3123,6 @@ impl FileWithAnnotatedLines {
31273123 multiline_depth : 0 ,
31283124 } ) ;
31293125 }
3130-
31313126 let mut output = vec ! [ ] ;
31323127 let mut multiline_annotations = vec ! [ ] ;
31333128
@@ -3361,7 +3356,7 @@ const OUTPUT_REPLACEMENTS: &[(char, &str)] = &[
33613356 ( '\u{2069}' , "�" ) ,
33623357] ;
33633358
3364- fn normalize_whitespace ( s : & str ) -> String {
3359+ pub ( crate ) fn normalize_whitespace ( s : & str ) -> String {
33653360 const {
33663361 let mut i = 1 ;
33673362 while i < OUTPUT_REPLACEMENTS . len ( ) {
@@ -3406,7 +3401,7 @@ fn overlaps(a1: &Annotation, a2: &Annotation, padding: usize) -> bool {
34063401 )
34073402}
34083403
3409- fn emit_to_destination (
3404+ pub ( crate ) fn emit_to_destination (
34103405 rendered_buffer : & [ Vec < StyledString > ] ,
34113406 lvl : & Level ,
34123407 dst : & mut Destination ,
@@ -3429,10 +3424,8 @@ fn emit_to_destination(
34293424 let _buffer_lock = lock:: acquire_global_lock ( "rustc_errors" ) ;
34303425 for ( pos, line) in rendered_buffer. iter ( ) . enumerate ( ) {
34313426 for part in line {
3432- let style = part. style . color_spec ( * lvl) ;
3433- dst. set_color ( & style) ?;
3434- write ! ( dst, "{}" , part. text) ?;
3435- dst. reset ( ) ?;
3427+ let style = part. style . anstyle ( * lvl) ;
3428+ write ! ( dst, "{style}{}{style:#}" , part. text) ?;
34363429 }
34373430 if !short_message && ( !lvl. is_failure_note ( ) || pos != rendered_buffer. len ( ) - 1 ) {
34383431 writeln ! ( dst) ?;
@@ -3442,11 +3435,11 @@ fn emit_to_destination(
34423435 Ok ( ( ) )
34433436}
34443437
3445- pub type Destination = Box < dyn WriteColor + Send > ;
3438+ pub type Destination = AutoStream < Box < dyn Write + Send > > ;
34463439
34473440struct Buffy {
3448- buffer_writer : BufferWriter ,
3449- buffer : Buffer ,
3441+ buffer_writer : std :: io :: Stderr ,
3442+ buffer : Vec < u8 > ,
34503443}
34513444
34523445impl Write for Buffy {
@@ -3455,7 +3448,7 @@ impl Write for Buffy {
34553448 }
34563449
34573450 fn flush ( & mut self ) -> io:: Result < ( ) > {
3458- self . buffer_writer . print ( & self . buffer ) ?;
3451+ self . buffer_writer . write_all ( & self . buffer ) ?;
34593452 self . buffer . clear ( ) ;
34603453 Ok ( ( ) )
34613454 }
@@ -3470,83 +3463,59 @@ impl Drop for Buffy {
34703463 }
34713464}
34723465
3473- impl WriteColor for Buffy {
3474- fn supports_color ( & self ) -> bool {
3475- self . buffer . supports_color ( )
3476- }
3477-
3478- fn set_color ( & mut self , spec : & ColorSpec ) -> io:: Result < ( ) > {
3479- self . buffer . set_color ( spec)
3480- }
3481-
3482- fn reset ( & mut self ) -> io:: Result < ( ) > {
3483- self . buffer . reset ( )
3484- }
3485- }
3486-
34873466pub fn stderr_destination ( color : ColorConfig ) -> Destination {
3467+ let buffer_writer = std:: io:: stderr ( ) ;
34883468 let choice = color. to_color_choice ( ) ;
3469+ // We need to resolve `ColorChoice::Auto` before `Box`ing since
3470+ // `ColorChoice::Auto` on `dyn Write` will always resolve to `Never`
3471+ let choice = if matches ! ( choice, ColorChoice :: Auto ) {
3472+ AutoStream :: choice ( & buffer_writer)
3473+ } else {
3474+ choice
3475+ } ;
34893476 // On Windows we'll be performing global synchronization on the entire
34903477 // system for emitting rustc errors, so there's no need to buffer
34913478 // anything.
34923479 //
34933480 // On non-Windows we rely on the atomicity of `write` to ensure errors
34943481 // don't get all jumbled up.
34953482 if cfg ! ( windows) {
3496- Box :: new ( StandardStream :: stderr ( choice ) )
3483+ AutoStream :: new ( Box :: new ( buffer_writer ) , choice )
34973484 } else {
3498- let buffer_writer = BufferWriter :: stderr ( choice) ;
3499- let buffer = buffer_writer. buffer ( ) ;
3500- Box :: new ( Buffy { buffer_writer, buffer } )
3485+ let buffer = Vec :: new ( ) ;
3486+ AutoStream :: new ( Box :: new ( Buffy { buffer_writer, buffer } ) , choice)
35013487 }
35023488}
35033489
35043490/// On Windows, BRIGHT_BLUE is hard to read on black. Use cyan instead.
35053491///
35063492/// See #36178.
3507- const BRIGHT_BLUE : Color = if cfg ! ( windows) { Color :: Cyan } else { Color :: Blue } ;
3493+ const BRIGHT_BLUE : anstyle:: Style = if cfg ! ( windows) {
3494+ AnsiColor :: BrightCyan . on_default ( )
3495+ } else {
3496+ AnsiColor :: BrightBlue . on_default ( )
3497+ } ;
35083498
35093499impl Style {
3510- fn color_spec ( & self , lvl : Level ) -> ColorSpec {
3511- let mut spec = ColorSpec :: new ( ) ;
3500+ pub ( crate ) fn anstyle ( & self , lvl : Level ) -> anstyle:: Style {
35123501 match self {
3513- Style :: Addition => {
3514- spec. set_fg ( Some ( Color :: Green ) ) . set_intense ( true ) ;
3515- }
3516- Style :: Removal => {
3517- spec. set_fg ( Some ( Color :: Red ) ) . set_intense ( true ) ;
3518- }
3519- Style :: LineAndColumn => { }
3520- Style :: LineNumber => {
3521- spec. set_bold ( true ) ;
3522- spec. set_intense ( true ) ;
3523- spec. set_fg ( Some ( BRIGHT_BLUE ) ) ;
3524- }
3525- Style :: Quotation => { }
3526- Style :: MainHeaderMsg => {
3527- spec. set_bold ( true ) ;
3528- if cfg ! ( windows) {
3529- spec. set_intense ( true ) . set_fg ( Some ( Color :: White ) ) ;
3530- }
3531- }
3532- Style :: UnderlinePrimary | Style :: LabelPrimary => {
3533- spec = lvl. color ( ) ;
3534- spec. set_bold ( true ) ;
3535- }
3536- Style :: UnderlineSecondary | Style :: LabelSecondary => {
3537- spec. set_bold ( true ) . set_intense ( true ) ;
3538- spec. set_fg ( Some ( BRIGHT_BLUE ) ) ;
3539- }
3540- Style :: HeaderMsg | Style :: NoStyle => { }
3541- Style :: Level ( lvl) => {
3542- spec = lvl. color ( ) ;
3543- spec. set_bold ( true ) ;
3544- }
3545- Style :: Highlight => {
3546- spec. set_bold ( true ) . set_fg ( Some ( Color :: Magenta ) ) ;
3502+ Style :: Addition => AnsiColor :: BrightGreen . on_default ( ) ,
3503+ Style :: Removal => AnsiColor :: BrightRed . on_default ( ) ,
3504+ Style :: LineAndColumn => anstyle:: Style :: new ( ) ,
3505+ Style :: LineNumber => BRIGHT_BLUE . effects ( Effects :: BOLD ) ,
3506+ Style :: Quotation => anstyle:: Style :: new ( ) ,
3507+ Style :: MainHeaderMsg => if cfg ! ( windows) {
3508+ AnsiColor :: BrightWhite . on_default ( )
3509+ } else {
3510+ anstyle:: Style :: new ( )
35473511 }
3512+ . effects ( Effects :: BOLD ) ,
3513+ Style :: UnderlinePrimary | Style :: LabelPrimary => lvl. color ( ) . effects ( Effects :: BOLD ) ,
3514+ Style :: UnderlineSecondary | Style :: LabelSecondary => BRIGHT_BLUE . effects ( Effects :: BOLD ) ,
3515+ Style :: HeaderMsg | Style :: NoStyle => anstyle:: Style :: new ( ) ,
3516+ Style :: Level ( lvl) => lvl. color ( ) . effects ( Effects :: BOLD ) ,
3517+ Style :: Highlight => AnsiColor :: Magenta . on_default ( ) . effects ( Effects :: BOLD ) ,
35483518 }
3549- spec
35503519 }
35513520}
35523521
0 commit comments