Extract SilentEmitter

This commit is contained in:
Cameron Steffen
2025-06-19 13:05:01 -05:00
parent 316f63bc48
commit 3388d83785
5 changed files with 29 additions and 51 deletions

View File

@@ -748,34 +748,10 @@ impl DiagCtxt {
Self { inner: Lock::new(DiagCtxtInner::new(emitter)) }
}
pub fn make_silent(&self, fatal_note: Option<String>, emit_fatal_diagnostic: bool) {
// An empty type that implements `Emitter` to temporarily swap in place of the real one,
// which will be used in constructing its replacement.
struct FalseEmitter;
impl Emitter for FalseEmitter {
fn emit_diagnostic(&mut self, _: DiagInner, _: &Registry) {
unimplemented!("false emitter must only used during `make_silent`")
}
fn source_map(&self) -> Option<&SourceMap> {
unimplemented!("false emitter must only used during `make_silent`")
}
fn translator(&self) -> &translation::Translator {
unimplemented!("false emitter must only used during `make_silent`")
}
}
pub fn make_silent(&self) {
let mut inner = self.inner.borrow_mut();
let mut prev_emitter = Box::new(FalseEmitter) as Box<dyn Emitter + DynSend>;
std::mem::swap(&mut inner.emitter, &mut prev_emitter);
let new_emitter = Box::new(emitter::FatalOnlyEmitter {
fatal_emitter: prev_emitter,
fatal_note,
emit_fatal_diagnostic,
});
inner.emitter = new_emitter;
let translator = inner.emitter.translator().clone();
inner.emitter = Box::new(emitter::SilentEmitter { translator });
}
pub fn set_emitter(&self, emitter: Box<dyn Emitter + DynSend>) {