Ignore span references from diagnostics.
The diagnostics are replayed at the correct place anyway.
This commit is contained in:
parent
40c8165395
commit
4719cb3036
3 changed files with 65 additions and 50 deletions
|
@ -10,6 +10,7 @@
|
|||
//! origin crate when the `TyCtxt` is not present in TLS.
|
||||
|
||||
use rustc_errors::{Diagnostic, TRACK_DIAGNOSTICS};
|
||||
use rustc_middle::dep_graph::TaskDepsRef;
|
||||
use rustc_middle::ty::tls;
|
||||
use std::fmt;
|
||||
|
||||
|
@ -26,14 +27,22 @@ fn track_span_parent(def_id: rustc_span::def_id::LocalDefId) {
|
|||
/// This is a callback from `rustc_ast` as it cannot access the implicit state
|
||||
/// in `rustc_middle` otherwise. It is used when diagnostic messages are
|
||||
/// emitted and stores them in the current query, if there is one.
|
||||
fn track_diagnostic(diagnostic: &Diagnostic) {
|
||||
fn track_diagnostic(diagnostic: &mut Diagnostic, f: &mut dyn FnMut(&mut Diagnostic)) {
|
||||
tls::with_context_opt(|icx| {
|
||||
if let Some(icx) = icx {
|
||||
if let Some(diagnostics) = icx.diagnostics {
|
||||
let mut diagnostics = diagnostics.lock();
|
||||
diagnostics.extend(Some(diagnostic.clone()));
|
||||
std::mem::drop(diagnostics);
|
||||
}
|
||||
|
||||
// Diagnostics are tracked, we can ignore the dependency.
|
||||
let icx = tls::ImplicitCtxt { task_deps: TaskDepsRef::Ignore, ..icx.clone() };
|
||||
return tls::enter_context(&icx, move |_| (*f)(diagnostic));
|
||||
}
|
||||
|
||||
// In any other case, invoke diagnostics anyway.
|
||||
(*f)(diagnostic);
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -55,5 +64,5 @@ fn def_id_debug(def_id: rustc_hir::def_id::DefId, f: &mut fmt::Formatter<'_>) ->
|
|||
pub fn setup_callbacks() {
|
||||
rustc_span::SPAN_TRACK.swap(&(track_span_parent as fn(_)));
|
||||
rustc_hir::def_id::DEF_ID_DEBUG.swap(&(def_id_debug as fn(_, &mut fmt::Formatter<'_>) -> _));
|
||||
TRACK_DIAGNOSTICS.swap(&(track_diagnostic as fn(&_)));
|
||||
TRACK_DIAGNOSTICS.swap(&(track_diagnostic as _));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue