rustc_expand: Simplify span quoting in proc macro server
- The `Rustc::expn_id` field kept redundant information - `SyntaxContext` is no longer thrown away before `save_proc_macro_span` because it's thrown away during metadata encoding anyway
This commit is contained in:
parent
de897f5205
commit
ece6f68186
@ -14,7 +14,6 @@
|
|||||||
use rustc_parse::{nt_to_tokenstream, parse_stream_from_source_str};
|
use rustc_parse::{nt_to_tokenstream, parse_stream_from_source_str};
|
||||||
use rustc_session::parse::ParseSess;
|
use rustc_session::parse::ParseSess;
|
||||||
use rustc_span::def_id::CrateNum;
|
use rustc_span::def_id::CrateNum;
|
||||||
use rustc_span::hygiene::ExpnId;
|
|
||||||
use rustc_span::hygiene::ExpnKind;
|
use rustc_span::hygiene::ExpnKind;
|
||||||
use rustc_span::symbol::{self, kw, sym, Symbol};
|
use rustc_span::symbol::{self, kw, sym, Symbol};
|
||||||
use rustc_span::{BytePos, FileName, MultiSpan, Pos, RealFileName, SourceFile, Span};
|
use rustc_span::{BytePos, FileName, MultiSpan, Pos, RealFileName, SourceFile, Span};
|
||||||
@ -363,26 +362,20 @@ pub(crate) struct Rustc<'a> {
|
|||||||
mixed_site: Span,
|
mixed_site: Span,
|
||||||
span_debug: bool,
|
span_debug: bool,
|
||||||
krate: CrateNum,
|
krate: CrateNum,
|
||||||
expn_id: ExpnId,
|
|
||||||
rebased_spans: FxHashMap<usize, Span>,
|
rebased_spans: FxHashMap<usize, Span>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Rustc<'a> {
|
impl<'a> Rustc<'a> {
|
||||||
pub fn new(cx: &'a ExtCtxt<'_>) -> Self {
|
pub fn new(cx: &'a ExtCtxt<'_>) -> Self {
|
||||||
let expn_data = cx.current_expansion.id.expn_data();
|
let expn_data = cx.current_expansion.id.expn_data();
|
||||||
let def_site = cx.with_def_site_ctxt(expn_data.def_site);
|
|
||||||
let call_site = cx.with_call_site_ctxt(expn_data.call_site);
|
|
||||||
let mixed_site = cx.with_mixed_site_ctxt(expn_data.call_site);
|
|
||||||
let sess = cx.parse_sess();
|
|
||||||
Rustc {
|
Rustc {
|
||||||
resolver: cx.resolver,
|
resolver: cx.resolver,
|
||||||
sess,
|
sess: cx.parse_sess(),
|
||||||
def_site,
|
def_site: cx.with_def_site_ctxt(expn_data.def_site),
|
||||||
call_site,
|
call_site: cx.with_call_site_ctxt(expn_data.call_site),
|
||||||
mixed_site,
|
mixed_site: cx.with_mixed_site_ctxt(expn_data.call_site),
|
||||||
span_debug: cx.ecfg.span_debug,
|
span_debug: cx.ecfg.span_debug,
|
||||||
krate: expn_data.macro_def_id.unwrap().krate,
|
krate: expn_data.macro_def_id.unwrap().krate,
|
||||||
expn_id: cx.current_expansion.id,
|
|
||||||
rebased_spans: FxHashMap::default(),
|
rebased_spans: FxHashMap::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -782,25 +775,15 @@ fn source_text(&mut self, span: Self::Span) -> Option<String> {
|
|||||||
/// span from the metadata of `my_proc_macro` (which we have access to,
|
/// span from the metadata of `my_proc_macro` (which we have access to,
|
||||||
/// since we've loaded `my_proc_macro` from disk in order to execute it).
|
/// since we've loaded `my_proc_macro` from disk in order to execute it).
|
||||||
/// In this way, we have obtained a span pointing into `my_proc_macro`
|
/// In this way, we have obtained a span pointing into `my_proc_macro`
|
||||||
fn save_span(&mut self, mut span: Self::Span) -> usize {
|
fn save_span(&mut self, span: Self::Span) -> usize {
|
||||||
// Throw away the `SyntaxContext`, since we currently
|
|
||||||
// skip serializing `SyntaxContext`s for proc-macro crates
|
|
||||||
span = span.with_ctxt(rustc_span::SyntaxContext::root());
|
|
||||||
self.sess.save_proc_macro_span(span)
|
self.sess.save_proc_macro_span(span)
|
||||||
}
|
}
|
||||||
fn recover_proc_macro_span(&mut self, id: usize) -> Self::Span {
|
fn recover_proc_macro_span(&mut self, id: usize) -> Self::Span {
|
||||||
let resolver = self.resolver;
|
let (resolver, krate, def_site) = (self.resolver, self.krate, self.def_site);
|
||||||
let krate = self.krate;
|
|
||||||
let expn_id = self.expn_id;
|
|
||||||
*self.rebased_spans.entry(id).or_insert_with(|| {
|
*self.rebased_spans.entry(id).or_insert_with(|| {
|
||||||
let raw_span = resolver.get_proc_macro_quoted_span(krate, id);
|
// FIXME: `SyntaxContext` for spans from proc macro crates is lost during encoding,
|
||||||
// Ignore the deserialized `SyntaxContext` entirely.
|
// replace it with a def-site context until we are encoding it properly.
|
||||||
// FIXME: Preserve the macro backtrace from the serialized span
|
resolver.get_proc_macro_quoted_span(krate, id).with_ctxt(def_site.ctxt())
|
||||||
// For example, if a proc-macro crate has code like
|
|
||||||
// `macro_one!() -> macro_two!() -> quote!()`, we might
|
|
||||||
// want to 'concatenate' this backtrace with the backtrace from
|
|
||||||
// our current call site.
|
|
||||||
raw_span.with_def_site_ctxt(expn_id)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user