2022-03-14 01:07:34 +03:00
|
|
|
//! This is actual code used by swc.
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
2023-03-30 11:06:02 +03:00
|
|
|
let wr = Box::<LockedWriter>::default();
|
2022-03-14 01:07:34 +03:00
|
|
|
|
|
|
|
let emitter = PrettyEmitter::new(
|
|
|
|
cm.clone(),
|
|
|
|
wr.clone(),
|
2022-11-28 18:56:47 +03:00
|
|
|
GraphicalReportHandler::new().with_context_lines(3),
|
2022-03-14 01:07:34 +03:00
|
|
|
PrettyEmitterConfig {
|
|
|
|
skip_filename: false,
|
|
|
|
},
|
|
|
|
);
|
|
|
|
// let e_wr = EmitterWriter::new(wr.clone(), Some(cm), false,
|
|
|
|
// true).skip_filename(skip_filename);
|
|
|
|
let handler = Handler::with_emitter(true, false, Box::new(emitter));
|
|
|
|
|
2022-11-28 18:56:47 +03:00
|
|
|
let fm1 = cm.new_source_file(
|
2024-07-09 04:24:45 +03:00
|
|
|
Lrc::new(FileName::Custom("foo.js".into())),
|
2022-11-28 18:56:47 +03:00
|
|
|
"13579\n12345\n13579".into(),
|
|
|
|
);
|
|
|
|
let fm2 = cm.new_source_file(
|
2024-07-09 04:24:45 +03:00
|
|
|
Lrc::new(FileName::Custom("bar.js".into())),
|
2022-11-28 18:56:47 +03:00
|
|
|
"02468\n12345\n02468".into(),
|
|
|
|
);
|
2022-03-14 01:07:34 +03:00
|
|
|
|
|
|
|
// This is a simple example.
|
|
|
|
handler
|
|
|
|
.struct_span_err(span(&fm1, 0, 3), "simple message")
|
|
|
|
.emit();
|
|
|
|
|
|
|
|
// We can show other file.
|
|
|
|
// This can be used to show configurable error with the config.
|
|
|
|
|
|
|
|
handler
|
2022-11-28 18:56:47 +03:00
|
|
|
.struct_span_err(span(&fm1, 6, 9), "constraint violation")
|
2022-03-14 01:07:34 +03:00
|
|
|
.span_note(span(&fm2, 0, 1), "this is your config")
|
|
|
|
.emit();
|
|
|
|
|
|
|
|
let s = &**wr.0.lock().unwrap();
|
|
|
|
|
|
|
|
println!("{}", s);
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Don't do this in your real app. You should use [Span] created by parser
|
|
|
|
fn span(base: &SourceFile, lo: u32, hi: u32) -> Span {
|
|
|
|
let lo = base.start_pos.0 + lo;
|
|
|
|
let hi = base.start_pos.0 + hi;
|
|
|
|
|
2024-07-09 04:24:45 +03:00
|
|
|
Span::new(BytePos(lo), BytePos(hi))
|
2022-03-14 01:07:34 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
#[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(())
|
|
|
|
}
|
|
|
|
}
|