about summary refs log tree commit diff
path: root/compiler/rustc_errors/src
diff options
context:
space:
mode:
authorMaybe Waffle <waffle.lapkin@gmail.com>2022-06-13 15:22:26 +0400
committerMaybe Waffle <waffle.lapkin@gmail.com>2022-06-16 17:08:26 +0400
commitcf6f821c3372b5ddc3cb0a92afcc48a1e0313efa (patch)
tree1109880e7fd7e1879d0e51a46bbc5bb23b7be29e /compiler/rustc_errors/src
parenta607cffc8c731f47a828c16d461bb97fda5ed41c (diff)
downloadrust-cf6f821c3372b5ddc3cb0a92afcc48a1e0313efa.tar.gz
rust-cf6f821c3372b5ddc3cb0a92afcc48a1e0313efa.zip
Try to clean up code...
I'm not sure if I succeeded
Diffstat (limited to 'compiler/rustc_errors/src')
-rw-r--r--compiler/rustc_errors/src/emitter.rs243
1 files changed, 150 insertions, 93 deletions
diff --git a/compiler/rustc_errors/src/emitter.rs b/compiler/rustc_errors/src/emitter.rs
index 269d34ea432..690ba14e699 100644
--- a/compiler/rustc_errors/src/emitter.rs
+++ b/compiler/rustc_errors/src/emitter.rs
@@ -10,7 +10,7 @@
 use Destination::*;
 
 use rustc_span::source_map::SourceMap;
-use rustc_span::{SourceFile, Span};
+use rustc_span::{FileLines, SourceFile, Span};
 
 use crate::snippet::{Annotation, AnnotationType, Line, MultilineAnnotation, Style, StyledString};
 use crate::styled_buffer::StyledBuffer;
@@ -1756,12 +1756,6 @@ impl EmitterWriter {
             let has_deletion = parts.iter().any(|p| p.is_deletion());
             let is_multiline = complete.lines().count() > 1;
 
-            enum DisplaySuggestion {
-                Underline,
-                Diff,
-                None,
-            }
-
             if let Some(span) = span.primary_span() {
                 // Compare the primary span of the diagnostic with the span of the suggestion
                 // being emitted.  If they belong to the same file, we don't *need* to show the
@@ -1838,83 +1832,7 @@ impl EmitterWriter {
             for (line_pos, (line, highlight_parts)) in lines.by_ref().zip(highlights).enumerate() {
                 debug!(%line_pos, %line, ?highlight_parts);
 
-                let print_line = |line_pos: usize,
-                                  line: &str,
-                                  highlight_parts: &Vec<SubstitutionHighlight>,
-                                  buffer: &mut StyledBuffer,
-                                  row_num: &mut usize| {
-                    // Print the span column to avoid confusion
-                    buffer.puts(
-                        *row_num,
-                        0,
-                        &self.maybe_anonymized(line_start + line_pos),
-                        Style::LineNumber,
-                    );
-                    if let DisplaySuggestion::Diff = show_code_change {
-                        // Add the line number for both addition and removal to drive the point home.
-                        //
-                        // N - fn foo<A: T>(bar: A) {
-                        // N + fn foo(bar: impl T) {
-                        buffer.puts(
-                            *row_num - 1,
-                            0,
-                            &self.maybe_anonymized(line_start + line_pos),
-                            Style::LineNumber,
-                        );
-                        buffer.puts(*row_num - 1, max_line_num_len + 1, "- ", Style::Removal);
-                        buffer.puts(
-                            *row_num - 1,
-                            max_line_num_len + 3,
-                            &normalize_whitespace(
-                                &*file_lines
-                                    .file
-                                    .get_line(file_lines.lines[line_pos].line_index)
-                                    .unwrap(),
-                            ),
-                            Style::NoStyle,
-                        );
-                        buffer.puts(*row_num, max_line_num_len + 1, "+ ", Style::Addition);
-                    } else if is_multiline {
-                        match &highlight_parts[..] {
-                            [SubstitutionHighlight { start: 0, end }] if *end == line.len() => {
-                                buffer.puts(*row_num, max_line_num_len + 1, "+ ", Style::Addition);
-                            }
-                            [] => {
-                                draw_col_separator(buffer, *row_num, max_line_num_len + 1);
-                            }
-                            _ => {
-                                buffer.puts(*row_num, max_line_num_len + 1, "~ ", Style::Addition);
-                            }
-                        }
-                    } else {
-                        draw_col_separator(buffer, *row_num, max_line_num_len + 1);
-                    }
-
-                    // print the suggestion
-                    buffer.append(*row_num, &normalize_whitespace(line), Style::NoStyle);
-
-                    // Colorize addition/replacements with green.
-                    for &SubstitutionHighlight { start, end } in highlight_parts {
-                        // Account for tabs when highlighting (#87972).
-                        let tabs: usize = line
-                            .chars()
-                            .take(start)
-                            .map(|ch| match ch {
-                                '\t' => 3,
-                                _ => 0,
-                            })
-                            .sum();
-                        buffer.set_style_range(
-                            *row_num,
-                            max_line_num_len + 3 + start + tabs,
-                            max_line_num_len + 3 + end + tabs,
-                            Style::Addition,
-                            true,
-                        );
-                    }
-                    *row_num += 1;
-                };
-
+                // Remember lines that are not highlighted to hide them if needed
                 if highlight_parts.is_empty() {
                     unhighlighted_lines.push((line_pos, line));
                     continue;
@@ -1927,22 +1845,77 @@ impl EmitterWriter {
                     // (because then we just replace a line with ... which is
                     // not helpful)
                     n if n <= 3 => unhighlighted_lines.drain(..).for_each(|(p, l)| {
-                        print_line(p, l, &Vec::new(), &mut buffer, &mut row_num)
+                        self.draw_code_line(
+                            &mut buffer,
+                            &mut row_num,
+                            &Vec::new(),
+                            p,
+                            l,
+                            line_start,
+                            show_code_change,
+                            max_line_num_len,
+                            &file_lines,
+                            is_multiline,
+                        )
                     }),
+                    // Print first unhighlighted line, "..." and last unhighlighted line, like so:
+                    //
+                    // LL | this line was highlighted
+                    // LL | this line is just for context
+                    //   ...
+                    // LL | this line is just for context
+                    // LL | this line was highlighted
                     _ => {
-                        unhighlighted_lines
-                            .drain(..1)
-                            .next()
-                            .map(|(p, l)| print_line(p, l, &Vec::new(), &mut buffer, &mut row_num));
+                        let last_line = unhighlighted_lines.pop();
+                        let first_line = unhighlighted_lines.drain(..).next();
+
+                        first_line.map(|(p, l)| {
+                            self.draw_code_line(
+                                &mut buffer,
+                                &mut row_num,
+                                &Vec::new(),
+                                p,
+                                l,
+                                line_start,
+                                show_code_change,
+                                max_line_num_len,
+                                &file_lines,
+                                is_multiline,
+                            )
+                        });
+
                         buffer.puts(row_num, max_line_num_len - 1, "...", Style::LineNumber);
                         row_num += 1;
-                        unhighlighted_lines
-                            .pop()
-                            .map(|(p, l)| print_line(p, l, &Vec::new(), &mut buffer, &mut row_num));
+
+                        last_line.map(|(p, l)| {
+                            self.draw_code_line(
+                                &mut buffer,
+                                &mut row_num,
+                                &Vec::new(),
+                                p,
+                                l,
+                                line_start,
+                                show_code_change,
+                                max_line_num_len,
+                                &file_lines,
+                                is_multiline,
+                            )
+                        });
                     }
                 }
 
-                print_line(line_pos, line, highlight_parts, &mut buffer, &mut row_num)
+                self.draw_code_line(
+                    &mut buffer,
+                    &mut row_num,
+                    highlight_parts,
+                    line_pos,
+                    line,
+                    line_start,
+                    show_code_change,
+                    max_line_num_len,
+                    &file_lines,
+                    is_multiline,
+                )
             }
 
             // This offset and the ones below need to be signed to account for replacement code
@@ -2127,6 +2100,90 @@ impl EmitterWriter {
             }
         }
     }
+
+    fn draw_code_line(
+        &self,
+        buffer: &mut StyledBuffer,
+        row_num: &mut usize,
+        highlight_parts: &Vec<SubstitutionHighlight>,
+        line_pos: usize,
+        line: &str,
+        line_start: usize,
+        show_code_change: DisplaySuggestion,
+        max_line_num_len: usize,
+        file_lines: &FileLines,
+        is_multiline: bool,
+    ) {
+        // Print the span column to avoid confusion
+        buffer.puts(*row_num, 0, &self.maybe_anonymized(line_start + line_pos), Style::LineNumber);
+        if let DisplaySuggestion::Diff = show_code_change {
+            // Add the line number for both addition and removal to drive the point home.
+            //
+            // N - fn foo<A: T>(bar: A) {
+            // N + fn foo(bar: impl T) {
+            buffer.puts(
+                *row_num - 1,
+                0,
+                &self.maybe_anonymized(line_start + line_pos),
+                Style::LineNumber,
+            );
+            buffer.puts(*row_num - 1, max_line_num_len + 1, "- ", Style::Removal);
+            buffer.puts(
+                *row_num - 1,
+                max_line_num_len + 3,
+                &normalize_whitespace(
+                    &*file_lines.file.get_line(file_lines.lines[line_pos].line_index).unwrap(),
+                ),
+                Style::NoStyle,
+            );
+            buffer.puts(*row_num, max_line_num_len + 1, "+ ", Style::Addition);
+        } else if is_multiline {
+            match &highlight_parts[..] {
+                [SubstitutionHighlight { start: 0, end }] if *end == line.len() => {
+                    buffer.puts(*row_num, max_line_num_len + 1, "+ ", Style::Addition);
+                }
+                [] => {
+                    draw_col_separator(buffer, *row_num, max_line_num_len + 1);
+                }
+                _ => {
+                    buffer.puts(*row_num, max_line_num_len + 1, "~ ", Style::Addition);
+                }
+            }
+        } else {
+            draw_col_separator(buffer, *row_num, max_line_num_len + 1);
+        }
+
+        // print the suggestion
+        buffer.append(*row_num, &normalize_whitespace(line), Style::NoStyle);
+
+        // Colorize addition/replacements with green.
+        for &SubstitutionHighlight { start, end } in highlight_parts {
+            // Account for tabs when highlighting (#87972).
+            let tabs: usize = line
+                .chars()
+                .take(start)
+                .map(|ch| match ch {
+                    '\t' => 3,
+                    _ => 0,
+                })
+                .sum();
+            buffer.set_style_range(
+                *row_num,
+                max_line_num_len + 3 + start + tabs,
+                max_line_num_len + 3 + end + tabs,
+                Style::Addition,
+                true,
+            );
+        }
+        *row_num += 1;
+    }
+}
+
+#[derive(Clone, Copy)]
+enum DisplaySuggestion {
+    Underline,
+    Diff,
+    None,
 }
 
 impl FileWithAnnotatedLines {