use std::{
fmt,
sync::{Arc, Mutex},
};
use swc_common::{errors::Handler, sync::Lrc, BytePos, FileName, SourceFile, SourceMap, Span};
use swc_error_reporters::{GraphicalReportHandler, PrettyEmitter, PrettyEmitterConfig};
fn main() {
let cm = Lrc::<SourceMap>::default();
let wr = Box::<LockedWriter>::default();
let emitter = PrettyEmitter::new(
cm.clone(),
wr.clone(),
GraphicalReportHandler::new().with_context_lines(3),
PrettyEmitterConfig {
skip_filename: false,
},
);
let handler = Handler::with_emitter(true, false, Box::new(emitter));
let fm1 = cm.new_source_file(
Lrc::new(FileName::Custom("foo.js".into())),
"13579\n12345\n13579".into(),
);
let fm2 = cm.new_source_file(
Lrc::new(FileName::Custom("bar.js".into())),
"02468\n12345\n02468".into(),
);
handler
.struct_span_err(span(&fm1, 0, 3), "simple message")
.emit();
handler
.struct_span_err(span(&fm1, 6, 9), "constraint violation")
.span_note(span(&fm2, 0, 1), "this is your config")
.emit();
let s = &**wr.0.lock().unwrap();
println!("{}", s);
}
fn span(base: &SourceFile, lo: u32, hi: u32) -> Span {
let lo = base.start_pos.0 + lo;
let hi = base.start_pos.0 + hi;
Span::new(BytePos(lo), BytePos(hi))
}
#[derive(Clone, Default)]
struct LockedWriter(Arc<Mutex<String>>);
impl fmt::Write for LockedWriter {
fn write_str(&mut self, s: &str) -> fmt::Result {
self.0.lock().unwrap().push_str(s);
Ok(())
}
}