1use std::sync::RwLock;
2
3use swc_common::{
4 errors::{Diagnostic, DiagnosticBuilder, Emitter, Handler, HandlerFlags, SourceMapperDyn},
5 sync::Lrc,
6};
7
8pub(crate) fn new_handler(
10 _: Lrc<SourceMapperDyn>,
11 treat_err_as_bug: bool,
12) -> (Handler, BufferedError) {
13 let e = BufferedError::default();
14
15 let handler = Handler::with_emitter_and_flags(
16 Box::new(e.clone()),
17 HandlerFlags {
18 treat_err_as_bug,
19 can_emit_warnings: true,
20 ..Default::default()
21 },
22 );
23
24 (handler, e)
25}
26
27#[derive(Clone, Default)]
28pub(crate) struct BufferedError(Lrc<RwLock<Vec<Diagnostic>>>);
29
30impl Emitter for BufferedError {
31 fn emit(&mut self, db: &mut DiagnosticBuilder) {
32 self.0.write().unwrap().push(db.take());
33 }
34}
35
36impl From<BufferedError> for Vec<Diagnostic> {
37 fn from(buf: BufferedError) -> Self {
38 let s = buf.0.read().unwrap();
39
40 s.clone()
41 }
42}