diff options
Diffstat (limited to 'src/libsyntax/diagnostic.rs')
| -rw-r--r-- | src/libsyntax/diagnostic.rs | 74 |
1 files changed, 43 insertions, 31 deletions
diff --git a/src/libsyntax/diagnostic.rs b/src/libsyntax/diagnostic.rs index 5e9714ca5b2..6f066218b7c 100644 --- a/src/libsyntax/diagnostic.rs +++ b/src/libsyntax/diagnostic.rs @@ -15,9 +15,12 @@ use std::io; use std::local_data; use extra::term; -pub type Emitter = @fn(cmsp: Option<(@codemap::CodeMap, Span)>, - msg: &str, - lvl: level); +pub trait Emitter { + fn emit(&self, + cmsp: Option<(@codemap::CodeMap, Span)>, + msg: &str, + lvl: level); +} // a handler deals with errors; certain errors // (fatal, bug, unimpl) may cause immediate exit, @@ -55,7 +58,7 @@ pub trait span_handler { struct HandlerT { err_count: uint, - emit: Emitter, + emit: @Emitter, } struct CodemapT { @@ -91,11 +94,11 @@ impl span_handler for CodemapT { impl handler for HandlerT { fn fatal(@mut self, msg: &str) -> ! { - (self.emit)(None, msg, fatal); + self.emit.emit(None, msg, fatal); fail!(); } fn err(@mut self, msg: &str) { - (self.emit)(None, msg, error); + self.emit.emit(None, msg, error); self.bump_err_count(); } fn bump_err_count(@mut self) { @@ -120,10 +123,10 @@ impl handler for HandlerT { self.fatal(s); } fn warn(@mut self, msg: &str) { - (self.emit)(None, msg, warning); + self.emit.emit(None, msg, warning); } fn note(@mut self, msg: &str) { - (self.emit)(None, msg, note); + self.emit.emit(None, msg, note); } fn bug(@mut self, msg: &str) -> ! { self.fatal(ice_msg(msg)); @@ -135,7 +138,7 @@ impl handler for HandlerT { cmsp: Option<(@codemap::CodeMap, Span)>, msg: &str, lvl: level) { - (self.emit)(cmsp, msg, lvl); + self.emit.emit(cmsp, msg, lvl); } } @@ -145,19 +148,22 @@ pub fn ice_msg(msg: &str) -> ~str { pub fn mk_span_handler(handler: @mut handler, cm: @codemap::CodeMap) -> @mut span_handler { - @mut CodemapT { handler: handler, cm: cm } as @mut span_handler + @mut CodemapT { + handler: handler, + cm: cm, + } as @mut span_handler } -pub fn mk_handler(emitter: Option<Emitter>) -> @mut handler { - let emit: Emitter = match emitter { +pub fn mk_handler(emitter: Option<@Emitter>) -> @mut handler { + let emit: @Emitter = match emitter { Some(e) => e, - None => { - let emit: Emitter = |cmsp, msg, t| emit(cmsp, msg, t); - emit - } + None => @DefaultEmitter as @Emitter }; - @mut HandlerT { err_count: 0, emit: emit } as @mut handler + @mut HandlerT { + err_count: 0, + emit: emit, + } as @mut handler } #[deriving(Eq)] @@ -237,24 +243,30 @@ pub fn collect(messages: @mut ~[~str]) f } -pub fn emit(cmsp: Option<(@codemap::CodeMap, Span)>, msg: &str, lvl: level) { - match cmsp { - Some((cm, sp)) => { - let sp = cm.adjust_span(sp); - let ss = cm.span_to_str(sp); - let lines = cm.span_to_lines(sp); - print_diagnostic(ss, lvl, msg); - highlight_lines(cm, sp, lvl, lines); - print_macro_backtrace(cm, sp); - } - None => { - print_diagnostic("", lvl, msg); - } +pub struct DefaultEmitter; + +impl Emitter for DefaultEmitter { + fn emit(&self, + cmsp: Option<(@codemap::CodeMap, Span)>, + msg: &str, + lvl: level) { + match cmsp { + Some((cm, sp)) => { + let sp = cm.adjust_span(sp); + let ss = cm.span_to_str(sp); + let lines = cm.span_to_lines(sp); + print_diagnostic(ss, lvl, msg); + highlight_lines(cm, sp, lvl, lines); + print_macro_backtrace(cm, sp); + } + None => print_diagnostic("", lvl, msg), + } } } fn highlight_lines(cm: @codemap::CodeMap, - sp: Span, lvl: level, + sp: Span, + lvl: level, lines: @codemap::FileLines) { let fm = lines.file; |
