@@ -656,11 +656,6 @@ impl Emitter for SilentEmitter {
656
656
}
657
657
}
658
658
659
- /// Maximum number of lines we will print for a multiline suggestion; arbitrary.
660
- ///
661
- /// This should be replaced with a more involved mechanism to output multiline suggestions that
662
- /// more closely mimics the regular diagnostic output, where irrelevant code lines are elided.
663
- pub const MAX_SUGGESTION_HIGHLIGHT_LINES : usize = 6 ;
664
659
/// Maximum number of suggestions to be shown
665
660
///
666
661
/// Arbitrary, but taken from trait import suggestion limit
@@ -1839,79 +1834,115 @@ impl EmitterWriter {
1839
1834
}
1840
1835
row_num += line_end - line_start;
1841
1836
}
1842
- for ( line_pos, ( line, highlight_parts) ) in
1843
- lines. by_ref ( ) . zip ( highlights) . take ( MAX_SUGGESTION_HIGHLIGHT_LINES ) . enumerate ( )
1844
- {
1845
- // Print the span column to avoid confusion
1846
- buffer. puts (
1847
- row_num,
1848
- 0 ,
1849
- & self . maybe_anonymized ( line_start + line_pos) ,
1850
- Style :: LineNumber ,
1851
- ) ;
1852
- if let DisplaySuggestion :: Diff = show_code_change {
1853
- // Add the line number for both addition and removal to drive the point home.
1854
- //
1855
- // N - fn foo<A: T>(bar: A) {
1856
- // N + fn foo(bar: impl T) {
1837
+ let mut unhighlighted_lines = Vec :: new ( ) ;
1838
+ for ( line_pos, ( line, highlight_parts) ) in lines. by_ref ( ) . zip ( highlights) . enumerate ( ) {
1839
+ debug ! ( %line_pos, %line, ?highlight_parts) ;
1840
+
1841
+ let print_line = |line_pos : usize ,
1842
+ line : & str ,
1843
+ highlight_parts : & Vec < SubstitutionHighlight > ,
1844
+ buffer : & mut StyledBuffer ,
1845
+ row_num : & mut usize | {
1846
+ // Print the span column to avoid confusion
1857
1847
buffer. puts (
1858
- row_num - 1 ,
1848
+ * row_num,
1859
1849
0 ,
1860
1850
& self . maybe_anonymized ( line_start + line_pos) ,
1861
1851
Style :: LineNumber ,
1862
1852
) ;
1863
- buffer. puts ( row_num - 1 , max_line_num_len + 1 , "- " , Style :: Removal ) ;
1864
- buffer. puts (
1865
- row_num - 1 ,
1866
- max_line_num_len + 3 ,
1867
- & normalize_whitespace (
1868
- & * file_lines
1869
- . file
1870
- . get_line ( file_lines. lines [ line_pos] . line_index )
1871
- . unwrap ( ) ,
1872
- ) ,
1873
- Style :: NoStyle ,
1874
- ) ;
1875
- buffer. puts ( row_num, max_line_num_len + 1 , "+ " , Style :: Addition ) ;
1876
- } else if is_multiline {
1877
- match & highlight_parts[ ..] {
1878
- [ SubstitutionHighlight { start : 0 , end } ] if * end == line. len ( ) => {
1879
- buffer. puts ( row_num, max_line_num_len + 1 , "+ " , Style :: Addition ) ;
1880
- }
1881
- [ ] => {
1882
- draw_col_separator ( & mut buffer, row_num, max_line_num_len + 1 ) ;
1883
- }
1884
- _ => {
1885
- buffer. puts ( row_num, max_line_num_len + 1 , "~ " , Style :: Addition ) ;
1853
+ if let DisplaySuggestion :: Diff = show_code_change {
1854
+ // Add the line number for both addition and removal to drive the point home.
1855
+ //
1856
+ // N - fn foo<A: T>(bar: A) {
1857
+ // N + fn foo(bar: impl T) {
1858
+ buffer. puts (
1859
+ * row_num - 1 ,
1860
+ 0 ,
1861
+ & self . maybe_anonymized ( line_start + line_pos) ,
1862
+ Style :: LineNumber ,
1863
+ ) ;
1864
+ buffer. puts ( * row_num - 1 , max_line_num_len + 1 , "- " , Style :: Removal ) ;
1865
+ buffer. puts (
1866
+ * row_num - 1 ,
1867
+ max_line_num_len + 3 ,
1868
+ & normalize_whitespace (
1869
+ & * file_lines
1870
+ . file
1871
+ . get_line ( file_lines. lines [ line_pos] . line_index )
1872
+ . unwrap ( ) ,
1873
+ ) ,
1874
+ Style :: NoStyle ,
1875
+ ) ;
1876
+ buffer. puts ( * row_num, max_line_num_len + 1 , "+ " , Style :: Addition ) ;
1877
+ } else if is_multiline {
1878
+ match & highlight_parts[ ..] {
1879
+ [ SubstitutionHighlight { start : 0 , end } ] if * end == line. len ( ) => {
1880
+ buffer. puts ( * row_num, max_line_num_len + 1 , "+ " , Style :: Addition ) ;
1881
+ }
1882
+ [ ] => {
1883
+ draw_col_separator ( buffer, * row_num, max_line_num_len + 1 ) ;
1884
+ }
1885
+ _ => {
1886
+ buffer. puts ( * row_num, max_line_num_len + 1 , "~ " , Style :: Addition ) ;
1887
+ }
1886
1888
}
1889
+ } else {
1890
+ draw_col_separator ( buffer, * row_num, max_line_num_len + 1 ) ;
1887
1891
}
1888
- } else {
1889
- draw_col_separator ( & mut buffer, row_num, max_line_num_len + 1 ) ;
1890
- }
1891
1892
1892
- // print the suggestion
1893
- buffer. append ( row_num, & normalize_whitespace ( line) , Style :: NoStyle ) ;
1893
+ // print the suggestion
1894
+ buffer. append ( * row_num, & normalize_whitespace ( line) , Style :: NoStyle ) ;
1894
1895
1895
- // Colorize addition/replacements with green.
1896
- for & SubstitutionHighlight { start, end } in highlight_parts {
1897
- // Account for tabs when highlighting (#87972).
1898
- let tabs: usize = line
1899
- . chars ( )
1900
- . take ( start)
1901
- . map ( |ch| match ch {
1902
- '\t' => 3 ,
1903
- _ => 0 ,
1904
- } )
1905
- . sum ( ) ;
1906
- buffer. set_style_range (
1907
- row_num,
1908
- max_line_num_len + 3 + start + tabs,
1909
- max_line_num_len + 3 + end + tabs,
1910
- Style :: Addition ,
1911
- true ,
1912
- ) ;
1896
+ // Colorize addition/replacements with green.
1897
+ for & SubstitutionHighlight { start, end } in highlight_parts {
1898
+ // Account for tabs when highlighting (#87972).
1899
+ let tabs: usize = line
1900
+ . chars ( )
1901
+ . take ( start)
1902
+ . map ( |ch| match ch {
1903
+ '\t' => 3 ,
1904
+ _ => 0 ,
1905
+ } )
1906
+ . sum ( ) ;
1907
+ buffer. set_style_range (
1908
+ * row_num,
1909
+ max_line_num_len + 3 + start + tabs,
1910
+ max_line_num_len + 3 + end + tabs,
1911
+ Style :: Addition ,
1912
+ true ,
1913
+ ) ;
1914
+ }
1915
+ * row_num += 1 ;
1916
+ } ;
1917
+
1918
+ if highlight_parts. is_empty ( ) {
1919
+ unhighlighted_lines. push ( ( line_pos, line) ) ;
1920
+ continue ;
1913
1921
}
1914
- row_num += 1 ;
1922
+
1923
+ match unhighlighted_lines. len ( ) {
1924
+ 0 => ( ) ,
1925
+ // Since we show first line, "..." line and last line,
1926
+ // There is no reason to hide if there are 3 or less lines
1927
+ // (because then we just replace a line with ... which is
1928
+ // not helpful)
1929
+ n if n <= 3 => unhighlighted_lines. drain ( ..) . for_each ( |( p, l) | {
1930
+ print_line ( p, l, & Vec :: new ( ) , & mut buffer, & mut row_num)
1931
+ } ) ,
1932
+ _ => {
1933
+ unhighlighted_lines
1934
+ . drain ( ..1 )
1935
+ . next ( )
1936
+ . map ( |( p, l) | print_line ( p, l, & Vec :: new ( ) , & mut buffer, & mut row_num) ) ;
1937
+ buffer. puts ( row_num, max_line_num_len - 1 , "..." , Style :: LineNumber ) ;
1938
+ row_num += 1 ;
1939
+ unhighlighted_lines
1940
+ . pop ( )
1941
+ . map ( |( p, l) | print_line ( p, l, & Vec :: new ( ) , & mut buffer, & mut row_num) ) ;
1942
+ }
1943
+ }
1944
+
1945
+ print_line ( line_pos, line, highlight_parts, & mut buffer, & mut row_num)
1915
1946
}
1916
1947
1917
1948
// This offset and the ones below need to be signed to account for replacement code
0 commit comments