Make Emitter::emit_diagnostic
consuming.
All the other `emit`/`emit_diagnostic` methods were recently made consuming (e.g. #119606), but this one wasn't. But it makes sense to. Much of this is straightforward, and lots of `clone` calls are avoided. There are a couple of tricky bits. - `Emitter::primary_span_formatted` no longer takes a `Diagnostic` and returns a pair. Instead it takes the two fields from `Diagnostic` that it used (`span` and `suggestions`) as `&mut`, and modifies them. This is necessary to avoid the cloning of `diag.children` in two emitters. - `from_errors_diagnostic` is rearranged so various uses of `diag` occur before the consuming `emit_diagnostic` call.
This commit is contained in:
parent
a0958082b3
commit
18f51f79f3
@ -47,7 +47,7 @@ fn source_map(&self) -> Option<&Lrc<SourceMap>> {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_diagnostic(&mut self, _db: &Diagnostic) {}
|
fn emit_diagnostic(&mut self, _db: Diagnostic) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn silent_emitter() -> Box<DynEmitter> {
|
fn silent_emitter() -> Box<DynEmitter> {
|
||||||
@ -64,7 +64,7 @@ struct SilentOnIgnoredFilesEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl SilentOnIgnoredFilesEmitter {
|
impl SilentOnIgnoredFilesEmitter {
|
||||||
fn handle_non_ignoreable_error(&mut self, db: &Diagnostic) {
|
fn handle_non_ignoreable_error(&mut self, db: Diagnostic) {
|
||||||
self.has_non_ignorable_parser_errors = true;
|
self.has_non_ignorable_parser_errors = true;
|
||||||
self.can_reset.store(false, Ordering::Release);
|
self.can_reset.store(false, Ordering::Release);
|
||||||
self.emitter.emit_diagnostic(db);
|
self.emitter.emit_diagnostic(db);
|
||||||
@ -86,7 +86,7 @@ fn source_map(&self) -> Option<&Lrc<SourceMap>> {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_diagnostic(&mut self, db: &Diagnostic) {
|
fn emit_diagnostic(&mut self, db: Diagnostic) {
|
||||||
if db.level() == DiagnosticLevel::Fatal {
|
if db.level() == DiagnosticLevel::Fatal {
|
||||||
return self.handle_non_ignoreable_error(db);
|
return self.handle_non_ignoreable_error(db);
|
||||||
}
|
}
|
||||||
@ -365,7 +365,7 @@ fn source_map(&self) -> Option<&Lrc<SourceMap>> {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_diagnostic(&mut self, _db: &Diagnostic) {
|
fn emit_diagnostic(&mut self, _db: Diagnostic) {
|
||||||
self.num_emitted_errors.fetch_add(1, Ordering::Release);
|
self.num_emitted_errors.fetch_add(1, Ordering::Release);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -424,7 +424,7 @@ fn handles_fatal_parse_error_in_ignored_file() {
|
|||||||
);
|
);
|
||||||
let span = MultiSpan::from_span(mk_sp(BytePos(0), BytePos(1)));
|
let span = MultiSpan::from_span(mk_sp(BytePos(0), BytePos(1)));
|
||||||
let fatal_diagnostic = build_diagnostic(DiagnosticLevel::Fatal, Some(span));
|
let fatal_diagnostic = build_diagnostic(DiagnosticLevel::Fatal, Some(span));
|
||||||
emitter.emit_diagnostic(&fatal_diagnostic);
|
emitter.emit_diagnostic(fatal_diagnostic);
|
||||||
assert_eq!(num_emitted_errors.load(Ordering::Acquire), 1);
|
assert_eq!(num_emitted_errors.load(Ordering::Acquire), 1);
|
||||||
assert_eq!(can_reset_errors.load(Ordering::Acquire), false);
|
assert_eq!(can_reset_errors.load(Ordering::Acquire), false);
|
||||||
}
|
}
|
||||||
@ -449,7 +449,7 @@ fn handles_recoverable_parse_error_in_ignored_file() {
|
|||||||
);
|
);
|
||||||
let span = MultiSpan::from_span(mk_sp(BytePos(0), BytePos(1)));
|
let span = MultiSpan::from_span(mk_sp(BytePos(0), BytePos(1)));
|
||||||
let non_fatal_diagnostic = build_diagnostic(DiagnosticLevel::Warning, Some(span));
|
let non_fatal_diagnostic = build_diagnostic(DiagnosticLevel::Warning, Some(span));
|
||||||
emitter.emit_diagnostic(&non_fatal_diagnostic);
|
emitter.emit_diagnostic(non_fatal_diagnostic);
|
||||||
assert_eq!(num_emitted_errors.load(Ordering::Acquire), 0);
|
assert_eq!(num_emitted_errors.load(Ordering::Acquire), 0);
|
||||||
assert_eq!(can_reset_errors.load(Ordering::Acquire), true);
|
assert_eq!(can_reset_errors.load(Ordering::Acquire), true);
|
||||||
}
|
}
|
||||||
@ -473,7 +473,7 @@ fn handles_recoverable_parse_error_in_non_ignored_file() {
|
|||||||
);
|
);
|
||||||
let span = MultiSpan::from_span(mk_sp(BytePos(0), BytePos(1)));
|
let span = MultiSpan::from_span(mk_sp(BytePos(0), BytePos(1)));
|
||||||
let non_fatal_diagnostic = build_diagnostic(DiagnosticLevel::Warning, Some(span));
|
let non_fatal_diagnostic = build_diagnostic(DiagnosticLevel::Warning, Some(span));
|
||||||
emitter.emit_diagnostic(&non_fatal_diagnostic);
|
emitter.emit_diagnostic(non_fatal_diagnostic);
|
||||||
assert_eq!(num_emitted_errors.load(Ordering::Acquire), 1);
|
assert_eq!(num_emitted_errors.load(Ordering::Acquire), 1);
|
||||||
assert_eq!(can_reset_errors.load(Ordering::Acquire), false);
|
assert_eq!(can_reset_errors.load(Ordering::Acquire), false);
|
||||||
}
|
}
|
||||||
@ -512,9 +512,9 @@ fn handles_mix_of_recoverable_parse_error() {
|
|||||||
let bar_diagnostic = build_diagnostic(DiagnosticLevel::Warning, Some(bar_span));
|
let bar_diagnostic = build_diagnostic(DiagnosticLevel::Warning, Some(bar_span));
|
||||||
let foo_diagnostic = build_diagnostic(DiagnosticLevel::Warning, Some(foo_span));
|
let foo_diagnostic = build_diagnostic(DiagnosticLevel::Warning, Some(foo_span));
|
||||||
let fatal_diagnostic = build_diagnostic(DiagnosticLevel::Fatal, None);
|
let fatal_diagnostic = build_diagnostic(DiagnosticLevel::Fatal, None);
|
||||||
emitter.emit_diagnostic(&bar_diagnostic);
|
emitter.emit_diagnostic(bar_diagnostic);
|
||||||
emitter.emit_diagnostic(&foo_diagnostic);
|
emitter.emit_diagnostic(foo_diagnostic);
|
||||||
emitter.emit_diagnostic(&fatal_diagnostic);
|
emitter.emit_diagnostic(fatal_diagnostic);
|
||||||
assert_eq!(num_emitted_errors.load(Ordering::Acquire), 2);
|
assert_eq!(num_emitted_errors.load(Ordering::Acquire), 2);
|
||||||
assert_eq!(can_reset_errors.load(Ordering::Acquire), false);
|
assert_eq!(can_reset_errors.load(Ordering::Acquire), false);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user