Improve with_source_map
.
Rename `with_source_map` as `set_source_map`. Because `with` functions (e.g. `with_session_globals`, `scoped_tls::ScopedKey::with`) are for *getting* a value for the duration of a closure, and `set` functions (e.g. `set_session_globals_then` `scoped_tls::ScopedKey::with`) are for *setting* a value for the duration of a closure. Also fix up the comment, which is wrong: - The bit about `TyCtxt` is wrong. - `span_debug1` doesn't exist any more. - There's only one level of fallback, not two. (This is effectively a follow-up to the changes in #93936.) Also add a comment explaining that `SessionGlobals::source_map` should only be used when absolutely necessary.
This commit is contained in:
parent
f049d5df10
commit
4e63ab6fc1
2 changed files with 14 additions and 11 deletions
|
@ -292,7 +292,7 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
|
||||||
override_queries: config.override_queries,
|
override_queries: config.override_queries,
|
||||||
};
|
};
|
||||||
|
|
||||||
rustc_span::with_source_map(compiler.sess.parse_sess.clone_source_map(), move || {
|
rustc_span::set_source_map(compiler.sess.parse_sess.clone_source_map(), move || {
|
||||||
let r = {
|
let r = {
|
||||||
let _sess_abort_error = OnDrop(|| {
|
let _sess_abort_error = OnDrop(|| {
|
||||||
compiler.sess.finish_diagnostics(registry);
|
compiler.sess.finish_diagnostics(registry);
|
||||||
|
|
|
@ -87,6 +87,14 @@ pub struct SessionGlobals {
|
||||||
symbol_interner: symbol::Interner,
|
symbol_interner: symbol::Interner,
|
||||||
span_interner: Lock<span_encoding::SpanInterner>,
|
span_interner: Lock<span_encoding::SpanInterner>,
|
||||||
hygiene_data: Lock<hygiene::HygieneData>,
|
hygiene_data: Lock<hygiene::HygieneData>,
|
||||||
|
|
||||||
|
/// A reference to the source map in the `Session`. It's an `Option`
|
||||||
|
/// because it can't be initialized until `Session` is created, which
|
||||||
|
/// happens after `SessionGlobals`. `set_source_map` does the
|
||||||
|
/// initialization.
|
||||||
|
///
|
||||||
|
/// This field should only be used in places where the `Session` is truly
|
||||||
|
/// not available, such as `<Span as Debug>::fmt`.
|
||||||
source_map: Lock<Option<Lrc<SourceMap>>>,
|
source_map: Lock<Option<Lrc<SourceMap>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1013,16 +1021,9 @@ impl<D: Decoder> Decodable<D> for Span {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Calls the provided closure, using the provided `SourceMap` to format
|
/// Insert `source_map` into the session globals for the duration of the
|
||||||
/// any spans that are debug-printed during the closure's execution.
|
/// closure's execution.
|
||||||
///
|
pub fn set_source_map<T, F: FnOnce() -> T>(source_map: Lrc<SourceMap>, f: F) -> T {
|
||||||
/// Normally, the global `TyCtxt` is used to retrieve the `SourceMap`
|
|
||||||
/// (see `rustc_interface::callbacks::span_debug1`). However, some parts
|
|
||||||
/// of the compiler (e.g. `rustc_parse`) may debug-print `Span`s before
|
|
||||||
/// a `TyCtxt` is available. In this case, we fall back to
|
|
||||||
/// the `SourceMap` provided to this function. If that is not available,
|
|
||||||
/// we fall back to printing the raw `Span` field values.
|
|
||||||
pub fn with_source_map<T, F: FnOnce() -> T>(source_map: Lrc<SourceMap>, f: F) -> T {
|
|
||||||
with_session_globals(|session_globals| {
|
with_session_globals(|session_globals| {
|
||||||
*session_globals.source_map.borrow_mut() = Some(source_map);
|
*session_globals.source_map.borrow_mut() = Some(source_map);
|
||||||
});
|
});
|
||||||
|
@ -1041,6 +1042,8 @@ pub fn with_source_map<T, F: FnOnce() -> T>(source_map: Lrc<SourceMap>, f: F) ->
|
||||||
|
|
||||||
impl fmt::Debug for Span {
|
impl fmt::Debug for Span {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
// Use the global `SourceMap` to print the span. If that's not
|
||||||
|
// available, fall back to printing the raw values.
|
||||||
with_session_globals(|session_globals| {
|
with_session_globals(|session_globals| {
|
||||||
if let Some(source_map) = &*session_globals.source_map.borrow() {
|
if let Some(source_map) = &*session_globals.source_map.borrow() {
|
||||||
write!(f, "{} ({:?})", source_map.span_to_diagnostic_string(*self), self.ctxt())
|
write!(f, "{} ({:?})", source_map.span_to_diagnostic_string(*self), self.ctxt())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue