diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-01-13 17:03:51 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-01-13 22:07:55 -0800 |
| commit | d4e089e94bde9d136b67b40f7facb9ea68265356 (patch) | |
| tree | f504aa27c77c97af3aadb94a8e77068acca94438 /src | |
| parent | 889f6317bee10e990f43e889fd5b6cf3e4e7ed8e (diff) | |
| download | rust-d4e089e94bde9d136b67b40f7facb9ea68265356.tar.gz rust-d4e089e94bde9d136b67b40f7facb9ea68265356.zip | |
rustc: Add diagnostic::handler iface and default impl
This is for moving error handling logic out of the session
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp/driver/diagnostic.rs | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/comp/driver/diagnostic.rs b/src/comp/driver/diagnostic.rs index c3deede75bb..28818c38fa0 100644 --- a/src/comp/driver/diagnostic.rs +++ b/src/comp/driver/diagnostic.rs @@ -4,6 +4,83 @@ import syntax::codemap; import codemap::span; export emit_warning, emit_error, emit_note; +export handler, codemap_handler; + +iface handler { + fn span_fatal(sp: span, msg: str) -> !; + fn fatal(msg: str) -> !; + fn span_err(sp: span, msg: str); + fn err(msg: str); + fn has_errors() -> bool; + fn abort_if_errors(); + fn span_warn(sp: span, msg: str); + fn warn(msg: str); + fn span_note(sp: span, msg: str); + fn note(msg: str); + fn span_bug(sp: span, msg: str) -> !; + fn bug(msg: str) -> !; + fn span_unimpl(sp: span, msg: str) -> !; + fn unimpl(msg: str) -> !; +} + +type codemap_t = @{ + cm: codemap::codemap, + mutable err_count: uint +}; + +impl codemap_handler of handler for codemap_t { + fn span_fatal(sp: span, msg: str) -> ! { + emit_error(some((self.cm, sp)), msg); + fail; + } + fn fatal(msg: str) -> ! { + emit_error(none, msg); + fail; + } + fn span_err(sp: span, msg: str) { + emit_error(some((self.cm, sp)), msg); + self.err_count += 1u; + } + fn err(msg: str) { + emit_error(none, msg); + self.err_count += 1u; + } + fn has_errors() -> bool { self.err_count > 0u } + fn abort_if_errors() { + if self.err_count > 0u { + self.fatal("aborting due to previous errors"); + } + } + fn span_warn(sp: span, msg: str) { + emit_warning(some((self.cm, sp)), msg); + } + fn warn(msg: str) { + emit_warning(none, msg); + } + fn span_note(sp: span, msg: str) { + emit_note(some((self.cm, sp)), msg); + } + fn note(msg: str) { + emit_note(none, msg); + } + fn span_bug(sp: span, msg: str) -> ! { + self.span_fatal(sp, #fmt["internal compiler error %s", msg]); + } + fn bug(msg: str) -> ! { + self.fatal(#fmt["internal compiler error %s", msg]); + } + fn span_unimpl(sp: span, msg: str) -> ! { + self.span_bug(sp, "unimplemented " + msg); + } + fn unimpl(msg: str) -> ! { self.bug("unimplemented " + msg); } +} + +fn mk_codemap_handler(cm: codemap::codemap) -> handler { + @{ + cm: cm, + mutable err_count: 0u, + } as handler +} tag diagnostictype { warning; |
