about summary refs log tree commit diff
path: root/src/libsyntax/errors/emitter.rs
diff options
context:
space:
mode:
authorNick Cameron <ncameron@mozilla.com>2015-12-18 16:15:53 +1300
committerNick Cameron <ncameron@mozilla.com>2015-12-30 14:27:59 +1300
commit253a1cefd8a9db926ca2d983dde5234504c86b4b (patch)
tree9db2e18b8c6999e05b63dbfd04dfeb338eaab6ee /src/libsyntax/errors/emitter.rs
parentc1035b3522e251d7639e7052936aa634752c5500 (diff)
downloadrust-253a1cefd8a9db926ca2d983dde5234504c86b4b.tar.gz
rust-253a1cefd8a9db926ca2d983dde5234504c86b4b.zip
Structured diagnostics
Diffstat (limited to 'src/libsyntax/errors/emitter.rs')
-rw-r--r--src/libsyntax/errors/emitter.rs18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/libsyntax/errors/emitter.rs b/src/libsyntax/errors/emitter.rs
index 7fef85a833e..990e4bb421d 100644
--- a/src/libsyntax/errors/emitter.rs
+++ b/src/libsyntax/errors/emitter.rs
@@ -13,7 +13,7 @@ use self::Destination::*;
 use codemap::{self, COMMAND_LINE_SP, COMMAND_LINE_EXPN, Pos, Span};
 use diagnostics;
 
-use errors::{Level, RenderSpan};
+use errors::{Level, RenderSpan, DiagnosticBuilder};
 use errors::RenderSpan::*;
 use errors::Level::*;
 
@@ -27,6 +27,17 @@ use term;
 pub trait Emitter {
     fn emit(&mut self, span: Option<Span>, msg: &str, code: Option<&str>, lvl: Level);
     fn custom_emit(&mut self, sp: RenderSpan, msg: &str, lvl: Level);
+
+    // Emit a structured diagnostic.
+    fn emit_struct(&mut self, db: &DiagnosticBuilder) {
+        self.emit(db.span, db.message, db.code.as_ref().map(|s| &**s), db.level);
+        for child in &db.children {
+            match child.render_span {
+                Some(ref sp) => self.custom_emit(sp.clone(), &child.message, child.level),
+                None => self.emit(child.span, &child.message, None, child.level),
+            }
+        }
+    }
 }
 
 /// maximum number of lines we will print for each error; arbitrary.
@@ -111,9 +122,8 @@ impl Emitter for EmitterWriter {
                    sp: RenderSpan,
                    msg: &str,
                    lvl: Level) {
-        match self.emit_(sp, msg, None, lvl) {
-            Ok(()) => {}
-            Err(e) => panic!("failed to print diagnostics: {:?}", e),
+        if let Err(e) = self.emit_(sp, msg, None, lvl) {
+            panic!("failed to print diagnostics: {:?}", e);
         }
     }
 }