testing/errors/
stderr.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use swc_common::{
    errors::{DiagnosticBuilder, Emitter},
    sync::Lrc,
    SourceMap,
};
use swc_error_reporters::{GraphicalReportHandler, ToPrettyDiagnostic};
use tracing::{info, metadata::LevelFilter, Level};

/// This emitter is controlled by the env var `RUST_LOG`.
///
/// This emitter will print to stderr if the logging level is higher than or
/// equal to `debug`
pub(crate) fn stderr_emitter(cm: Lrc<SourceMap>) -> Box<dyn Emitter> {
    if LevelFilter::current() > Level::INFO {
        info!("Diagnostics will be printed to stderr as logging level is trace or debug");

        let reporter = GraphicalReportHandler::default();

        let emitter = TestEmitter {
            cm: cm.clone(),
            reporter,
        };

        Box::new(emitter)
    } else {
        Box::new(NoopEmitter)
    }
}

struct TestEmitter {
    cm: Lrc<SourceMap>,
    reporter: GraphicalReportHandler,
}

impl Emitter for TestEmitter {
    fn emit(&mut self, db: &mut DiagnosticBuilder<'_>) {
        let d = &**db;
        let pretty_dignostic = &d.to_pretty_diagnostic(&self.cm, false);

        eprint!("{}", pretty_dignostic.to_pretty_string(&self.reporter));
    }
}

struct NoopEmitter;

impl Emitter for NoopEmitter {
    fn emit(&mut self, _: &mut DiagnosticBuilder<'_>) {}
}