From 037cf2c43649b7040befd38122c2f86db5968580 Mon Sep 17 00:00:00 2001 From: topecongiro Date: Sun, 24 Mar 2019 17:01:09 +0900 Subject: [PATCH] Discard every parsing error in silent_emitter `EmitterWriter` from rustc is wasting soooo much time constructing an error message that will never be emitted, instead we just implement our own `Emitter` that just discards every error message. --- src/formatting.rs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/formatting.rs b/src/formatting.rs index a23c312bd2a..2705bda72d1 100644 --- a/src/formatting.rs +++ b/src/formatting.rs @@ -7,7 +7,7 @@ use std::time::{Duration, Instant}; use syntax::ast; -use syntax::errors::emitter::{ColorConfig, EmitterWriter}; +use syntax::errors::emitter::{ColorConfig, Emitter}; use syntax::errors::{DiagnosticBuilder, Handler}; use syntax::parse::{self, ParseSess}; use syntax::source_map::{FilePathMapping, SourceMap, Span, DUMMY_SP}; @@ -89,7 +89,7 @@ fn format_project( timer = timer.done_parsing(); // Suppress error output if we have to do any further parsing. - let silent_emitter = silent_emitter(source_map); + let silent_emitter = silent_emitter(); parse_session.span_diagnostic = Handler::with_emitter(true, None, silent_emitter); let mut context = FormatContext::new(&krate, report, parse_session, config, handler); @@ -670,18 +670,20 @@ fn parse_crate( Err(ErrorKind::ParseError) } -fn silent_emitter(source_map: Rc) -> Box { - Box::new(EmitterWriter::new( - Box::new(Vec::new()), - Some(source_map), - false, - false, - )) +/// Emitter which discards every error. +struct SilentEmitter; + +impl Emitter for SilentEmitter { + fn emit(&mut self, _db: &DiagnosticBuilder<'_>) {} +} + +fn silent_emitter() -> Box { + Box::new(SilentEmitter {}) } fn make_parse_sess(source_map: Rc, config: &Config) -> ParseSess { let tty_handler = if config.hide_parse_errors() { - let silent_emitter = silent_emitter(source_map.clone()); + let silent_emitter = silent_emitter(); Handler::with_emitter(true, None, silent_emitter) } else { let supports_color = term::stderr().map_or(false, |term| term.supports_color()); -- 2.44.0