testing/errors/
stderr.rs

1use swc_common::{
2    errors::{DiagnosticBuilder, Emitter},
3    sync::Lrc,
4    SourceMap,
5};
6use swc_error_reporters::{GraphicalReportHandler, ToPrettyDiagnostic};
7use tracing::{info, metadata::LevelFilter, Level};
8
9/// This emitter is controlled by the env var `RUST_LOG`.
10///
11/// This emitter will print to stderr if the logging level is higher than or
12/// equal to `debug`
13pub(crate) fn stderr_emitter(cm: Lrc<SourceMap>) -> Box<dyn Emitter> {
14    if LevelFilter::current() > Level::INFO {
15        info!("Diagnostics will be printed to stderr as logging level is trace or debug");
16
17        let reporter = GraphicalReportHandler::default();
18
19        let emitter = TestEmitter {
20            cm: cm.clone(),
21            reporter,
22        };
23
24        Box::new(emitter)
25    } else {
26        Box::new(NoopEmitter)
27    }
28}
29
30struct TestEmitter {
31    cm: Lrc<SourceMap>,
32    reporter: GraphicalReportHandler,
33}
34
35impl Emitter for TestEmitter {
36    fn emit(&mut self, db: &mut DiagnosticBuilder<'_>) {
37        let d = &**db;
38        let pretty_dignostic = &d.to_pretty_diagnostic(&self.cm, false);
39
40        eprint!("{}", pretty_dignostic.to_pretty_string(&self.reporter));
41    }
42}
43
44struct NoopEmitter;
45
46impl Emitter for NoopEmitter {
47    fn emit(&mut self, _: &mut DiagnosticBuilder<'_>) {}
48}