about summary refs log tree commit diff
path: root/src/libsyntax/errors/json.rs
diff options
context:
space:
mode:
authorNick Cameron <ncameron@mozilla.com>2016-03-24 15:32:42 +1300
committerNick Cameron <ncameron@mozilla.com>2016-03-24 15:32:42 +1300
commit9757516f1206e127374b489c44d9ef26db7315b0 (patch)
tree1df2715bf4f3fbbc134fdde25706ff5d85169a9c /src/libsyntax/errors/json.rs
parentb76f818cad31c7910fb6f0fa5e628dbaf4db1108 (diff)
downloadrust-9757516f1206e127374b489c44d9ef26db7315b0.tar.gz
rust-9757516f1206e127374b489c44d9ef26db7315b0.zip
Include source text in JSON errors
Diffstat (limited to 'src/libsyntax/errors/json.rs')
-rw-r--r--src/libsyntax/errors/json.rs40
1 files changed, 39 insertions, 1 deletions
diff --git a/src/libsyntax/errors/json.rs b/src/libsyntax/errors/json.rs
index 5bb5f4757e0..212a54447a8 100644
--- a/src/libsyntax/errors/json.rs
+++ b/src/libsyntax/errors/json.rs
@@ -20,7 +20,7 @@
 // FIXME spec the JSON output properly.
 
 
-use codemap::{MultiSpan, CodeMap};
+use codemap::{Span, MultiSpan, CodeMap};
 use diagnostics::registry::Registry;
 use errors::{Level, DiagnosticBuilder, SubDiagnostic, RenderSpan, CodeSuggestion};
 use errors::emitter::Emitter;
@@ -99,6 +99,16 @@ struct DiagnosticSpan {
     /// 1-based, character offset.
     column_start: usize,
     column_end: usize,
+    /// Source text from the start of line_start to the end of line_end.
+    text: Vec<DiagnosticSpanLine>,
+}
+
+#[derive(RustcEncodable)]
+struct DiagnosticSpanLine {
+    text: String,
+    /// 1-based, character offset in self.text.
+    highlight_start: usize,
+    highlight_end: usize,
 }
 
 #[derive(RustcEncodable)]
@@ -180,6 +190,7 @@ impl DiagnosticSpan {
                 line_end: end.line,
                 column_start: start.col.0 + 1,
                 column_end: end.col.0 + 1,
+                text: DiagnosticSpanLine::from_span(span, je),
             }
         }).collect()
     }
@@ -202,6 +213,7 @@ impl DiagnosticSpan {
                         line_end: end.line,
                         column_start: 0,
                         column_end: end.col.0 + 1,
+                        text: DiagnosticSpanLine::from_span(span, je),
                     }
                 }).collect()
             }
@@ -217,6 +229,7 @@ impl DiagnosticSpan {
                         line_end: end.line,
                         column_start: 0,
                         column_end: 0,
+                        text: DiagnosticSpanLine::from_span(span, je),
                     }
                 }).collect()
             }
@@ -224,6 +237,31 @@ impl DiagnosticSpan {
     }
 }
 
+impl DiagnosticSpanLine {
+    fn from_span(span: &Span, je: &JsonEmitter) -> Vec<DiagnosticSpanLine> {
+        let lines = match je.cm.span_to_lines(*span) {
+            Ok(lines) => lines,
+            Err(_) => {
+                debug!("unprintable span");
+                return Vec::new();
+            }
+        };
+
+        let mut result = Vec::new();
+        let fm = &*lines.file;
+
+        for line in &lines.lines {
+            result.push(DiagnosticSpanLine {
+                text: fm.get_line(line.line_index).unwrap().to_owned(),
+                highlight_start: line.start_col.0 + 1,
+                highlight_end: line.end_col.0 + 1,
+            });
+        }
+
+        result
+    }
+}
+
 impl DiagnosticCode {
     fn map_opt_string(s: Option<String>, je: &JsonEmitter) -> Option<DiagnosticCode> {
         s.map(|s| {