@@ -214,7 +214,7 @@ pub trait Emitter {
214214
215215    /// Formats the substitutions of the primary_span 
216216/// 
217- /// The  are a lot of conditions to this method, but in short: 
217+ /// There  are a lot of conditions to this method, but in short: 
218218/// 
219219/// * If the current `Diagnostic` has only one visible `CodeSuggestion`, 
220220///   we format the `help` suggestion depending on the content of the 
@@ -736,7 +736,9 @@ impl EmitterWriter {
736736
737737        let  line_offset = buffer. num_lines ( ) ; 
738738
739-         let  left = margin. left ( source_string. len ( ) ) ;  // Left trim 
739+         // Left trim 
740+         let  left = margin. left ( source_string. len ( ) ) ; 
741+ 
740742        // Account for unicode characters of width !=0 that were removed. 
741743        let  left = source_string
742744            . chars ( ) 
@@ -1623,18 +1625,27 @@ impl EmitterWriter {
16231625            suggestions. iter ( ) . take ( MAX_SUGGESTIONS ) 
16241626        { 
16251627            notice_capitalization |= only_capitalization; 
1626-             // Only show underline if the suggestion spans a single line and doesn't cover the 
1627-             // entirety of the code output. If you have multiple replacements in the same line 
1628-             // of code, show the underline. 
1629-             let  show_underline = !( parts. len ( )  == 1  && parts[ 0 ] . snippet . trim ( )  == complete. trim ( ) ) 
1630-                 && complete. lines ( ) . count ( )  == 1 ; 
16311628
16321629            let  has_deletion = parts. iter ( ) . any ( |p| p. is_deletion ( ) ) ; 
16331630            let  is_multiline = complete. lines ( ) . count ( )  > 1 ; 
16341631
1635-             let  show_diff = has_deletion && !is_multiline; 
1632+             enum  DisplaySuggestion  { 
1633+                 Underline , 
1634+                 Diff , 
1635+                 None , 
1636+             } 
1637+ 
1638+             let  show_code_change = if  has_deletion && !is_multiline { 
1639+                 DisplaySuggestion :: Diff 
1640+             }  else  if  ( parts. len ( )  != 1  || parts[ 0 ] . snippet . trim ( )  != complete. trim ( ) ) 
1641+                 && !is_multiline
1642+             { 
1643+                 DisplaySuggestion :: Underline 
1644+             }  else  { 
1645+                 DisplaySuggestion :: None 
1646+             } ; 
16361647
1637-             if  show_diff  { 
1648+             if  let   DisplaySuggestion :: Diff  = show_code_change  { 
16381649                row_num += 1 ; 
16391650            } 
16401651
@@ -1657,7 +1668,7 @@ impl EmitterWriter {
16571668                    & self . maybe_anonymized ( line_start + line_pos) , 
16581669                    Style :: LineNumber , 
16591670                ) ; 
1660-                 if  show_diff  { 
1671+                 if  let   DisplaySuggestion :: Diff  = show_code_change  { 
16611672                    // Add the line number for both addition and removal to drive the point home. 
16621673                    // 
16631674                    // N - fn foo<A: T>(bar: A) { 
@@ -1727,7 +1738,7 @@ impl EmitterWriter {
17271738            let  mut  offsets:  Vec < ( usize ,  isize ) >  = Vec :: new ( ) ; 
17281739            // Only show an underline in the suggestions if the suggestion is not the 
17291740            // entirety of the code being shown and the displayed code is not multiline. 
1730-             if  show_underline  { 
1741+             if  let   DisplaySuggestion :: Diff  |  DisplaySuggestion :: Underline  = show_code_change  { 
17311742                draw_col_separator ( & mut  buffer,  row_num,  max_line_num_len + 1 ) ; 
17321743                for  part in  parts { 
17331744                    let  span_start_pos = sm. lookup_char_pos ( part. span . lo ( ) ) . col_display ; 
@@ -1755,7 +1766,7 @@ impl EmitterWriter {
17551766                    assert ! ( underline_start >= 0  && underline_end >= 0 ) ; 
17561767                    let  padding:  usize  = max_line_num_len + 3 ; 
17571768                    for  p in  underline_start..underline_end { 
1758-                         if  !show_diff  { 
1769+                         if  let   DisplaySuggestion :: Underline  = show_code_change  { 
17591770                            // If this is a replacement, underline with `^`, if this is an addition 
17601771                            // underline with `+`. 
17611772                            buffer. putc ( 
@@ -1766,7 +1777,7 @@ impl EmitterWriter {
17661777                            ) ; 
17671778                        } 
17681779                    } 
1769-                     if  show_diff  { 
1780+                     if  let   DisplaySuggestion :: Diff  = show_code_change  { 
17701781                        // Colorize removal with red in diff format. 
17711782                        buffer. set_style_range ( 
17721783                            row_num - 2 , 
@@ -1797,7 +1808,7 @@ impl EmitterWriter {
17971808            // if we elided some lines, add an ellipsis 
17981809            if  lines. next ( ) . is_some ( )  { 
17991810                buffer. puts ( row_num,  max_line_num_len - 1 ,  "..." ,  Style :: LineNumber ) ; 
1800-             }  else  if  !show_underline  { 
1811+             }  else  if  let   DisplaySuggestion :: None  = show_code_change  { 
18011812                draw_col_separator_no_space ( & mut  buffer,  row_num,  max_line_num_len + 1 ) ; 
18021813                row_num += 1 ; 
18031814            } 
@@ -2083,7 +2094,7 @@ const OUTPUT_REPLACEMENTS: &[(char, &str)] = &[
20832094    ( '\t' ,  "    " ) ,    // We do our own tab replacement 
20842095    ( '\u{200D}' ,  "" ) ,  // Replace ZWJ with nothing for consistent terminal output of grapheme clusters. 
20852096    ( '\u{202A}' ,  "" ) ,  // The following unicode text flow control characters are inconsistently 
2086-     ( '\u{202B}' ,  "" ) ,  // supported accross  CLIs and can cause confusion due to the bytes on disk 
2097+     ( '\u{202B}' ,  "" ) ,  // supported across  CLIs and can cause confusion due to the bytes on disk 
20872098    ( '\u{202D}' ,  "" ) ,  // not corresponding to the visible source code, so we replace them always. 
20882099    ( '\u{202E}' ,  "" ) , 
20892100    ( '\u{2066}' ,  "" ) , 
0 commit comments