@@ -1832,6 +1832,12 @@ impl EmitterWriter {
1832
1832
}
1833
1833
let show_code_change = if has_deletion && !is_multiline {
1834
1834
DisplaySuggestion :: Diff
1835
+ } else if let [ part] = & parts[ ..]
1836
+ && part. snippet . ends_with ( '\n' )
1837
+ && part. snippet . trim ( ) == complete. trim ( )
1838
+ {
1839
+ // We are adding a line(s) of code before code that was already there.
1840
+ DisplaySuggestion :: Add
1835
1841
} else if ( parts. len ( ) != 1 || parts[ 0 ] . snippet . trim ( ) != complete. trim ( ) )
1836
1842
&& !is_multiline
1837
1843
{
@@ -1879,14 +1885,23 @@ impl EmitterWriter {
1879
1885
row_num += line_end - line_start;
1880
1886
}
1881
1887
let mut unhighlighted_lines = Vec :: new ( ) ;
1888
+ let mut last_pos = 0 ;
1889
+ let mut is_item_attribute = false ;
1882
1890
for ( line_pos, ( line, highlight_parts) ) in lines. by_ref ( ) . zip ( highlights) . enumerate ( ) {
1891
+ last_pos = line_pos;
1883
1892
debug ! ( %line_pos, %line, ?highlight_parts) ;
1884
1893
1885
1894
// Remember lines that are not highlighted to hide them if needed
1886
1895
if highlight_parts. is_empty ( ) {
1887
1896
unhighlighted_lines. push ( ( line_pos, line) ) ;
1888
1897
continue ;
1889
1898
}
1899
+ if highlight_parts. len ( ) == 1
1900
+ && line. trim ( ) . starts_with ( "#[" )
1901
+ && line. trim ( ) . ends_with ( ']' )
1902
+ {
1903
+ is_item_attribute = true ;
1904
+ }
1890
1905
1891
1906
match unhighlighted_lines. len ( ) {
1892
1907
0 => ( ) ,
@@ -1963,13 +1978,41 @@ impl EmitterWriter {
1963
1978
is_multiline,
1964
1979
)
1965
1980
}
1981
+ if let DisplaySuggestion :: Add = show_code_change && is_item_attribute {
1982
+ // The suggestion adds an entire line of code, ending on a newline, so we'll also
1983
+ // print the *following* line, to provide context of what we're advicing people to
1984
+ // do. Otherwise you would only see contextless code that can be confused for
1985
+ // already existing code, despite the colors and UI elements.
1986
+ // We special case `#[derive(_)]\n` and other attribute suggestions, because those
1987
+ // are the ones where context is most useful.
1988
+ let file_lines = sm
1989
+ . span_to_lines ( span. primary_span ( ) . unwrap ( ) . shrink_to_hi ( ) )
1990
+ . expect ( "span_to_lines failed when emitting suggestion" ) ;
1991
+ let line_num = sm. lookup_char_pos ( parts[ 0 ] . span . lo ( ) ) . line ;
1992
+ if let Some ( line) = file_lines. file . get_line ( line_num - 1 ) {
1993
+ let line = normalize_whitespace ( & line) ;
1994
+ self . draw_code_line (
1995
+ & mut buffer,
1996
+ & mut row_num,
1997
+ & [ ] ,
1998
+ line_num + last_pos + 1 ,
1999
+ & line,
2000
+ DisplaySuggestion :: None ,
2001
+ max_line_num_len,
2002
+ & file_lines,
2003
+ is_multiline,
2004
+ )
2005
+ }
2006
+ }
1966
2007
1967
2008
// This offset and the ones below need to be signed to account for replacement code
1968
2009
// that is shorter than the original code.
1969
2010
let mut offsets: Vec < ( usize , isize ) > = Vec :: new ( ) ;
1970
2011
// Only show an underline in the suggestions if the suggestion is not the
1971
2012
// entirety of the code being shown and the displayed code is not multiline.
1972
- if let DisplaySuggestion :: Diff | DisplaySuggestion :: Underline = show_code_change {
2013
+ if let DisplaySuggestion :: Diff | DisplaySuggestion :: Underline | DisplaySuggestion :: Add =
2014
+ show_code_change
2015
+ {
1973
2016
draw_col_separator_no_space ( & mut buffer, row_num, max_line_num_len + 1 ) ;
1974
2017
for part in parts {
1975
2018
let span_start_pos = sm. lookup_char_pos ( part. span . lo ( ) ) . col_display ;
@@ -2247,6 +2290,10 @@ impl EmitterWriter {
2247
2290
}
2248
2291
}
2249
2292
buffer. append ( * row_num, & normalize_whitespace ( line_to_add) , Style :: NoStyle ) ;
2293
+ } else if let DisplaySuggestion :: Add = show_code_change {
2294
+ buffer. puts ( * row_num, 0 , & self . maybe_anonymized ( line_num) , Style :: LineNumber ) ;
2295
+ buffer. puts ( * row_num, max_line_num_len + 1 , "+ " , Style :: Addition ) ;
2296
+ buffer. append ( * row_num, & normalize_whitespace ( line_to_add) , Style :: NoStyle ) ;
2250
2297
} else {
2251
2298
buffer. puts ( * row_num, 0 , & self . maybe_anonymized ( line_num) , Style :: LineNumber ) ;
2252
2299
draw_col_separator ( buffer, * row_num, max_line_num_len + 1 ) ;
@@ -2281,6 +2328,7 @@ enum DisplaySuggestion {
2281
2328
Underline ,
2282
2329
Diff ,
2283
2330
None ,
2331
+ Add ,
2284
2332
}
2285
2333
2286
2334
impl FileWithAnnotatedLines {
0 commit comments