Record call_site parent for macros.
This commit is contained in:
parent
5e026eacb1
commit
2e37ed87fc
4 changed files with 27 additions and 3 deletions
|
@ -15,7 +15,7 @@ use rustc_lint_defs::builtin::PROC_MACRO_BACK_COMPAT;
|
||||||
use rustc_lint_defs::BuiltinLintDiagnostics;
|
use rustc_lint_defs::BuiltinLintDiagnostics;
|
||||||
use rustc_parse::{self, nt_to_tokenstream, parser, MACRO_ARGUMENTS};
|
use rustc_parse::{self, nt_to_tokenstream, parser, MACRO_ARGUMENTS};
|
||||||
use rustc_session::{parse::ParseSess, Limit, Session};
|
use rustc_session::{parse::ParseSess, Limit, Session};
|
||||||
use rustc_span::def_id::{CrateNum, DefId};
|
use rustc_span::def_id::{CrateNum, DefId, LocalDefId};
|
||||||
use rustc_span::edition::Edition;
|
use rustc_span::edition::Edition;
|
||||||
use rustc_span::hygiene::{AstPass, ExpnData, ExpnKind, LocalExpnId};
|
use rustc_span::hygiene::{AstPass, ExpnData, ExpnKind, LocalExpnId};
|
||||||
use rustc_span::source_map::SourceMap;
|
use rustc_span::source_map::SourceMap;
|
||||||
|
@ -843,6 +843,7 @@ pub type DeriveResolutions = Vec<(ast::Path, Annotatable, Option<Lrc<SyntaxExten
|
||||||
|
|
||||||
pub trait ResolverExpand {
|
pub trait ResolverExpand {
|
||||||
fn next_node_id(&mut self) -> NodeId;
|
fn next_node_id(&mut self) -> NodeId;
|
||||||
|
fn invocation_parent(&self, id: LocalExpnId) -> LocalDefId;
|
||||||
|
|
||||||
fn resolve_dollar_crates(&mut self);
|
fn resolve_dollar_crates(&mut self);
|
||||||
fn visit_ast_fragment_with_placeholders(
|
fn visit_ast_fragment_with_placeholders(
|
||||||
|
|
|
@ -588,7 +588,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
||||||
// Resolve `$crate`s in the fragment for pretty-printing.
|
// Resolve `$crate`s in the fragment for pretty-printing.
|
||||||
self.cx.resolver.resolve_dollar_crates();
|
self.cx.resolver.resolve_dollar_crates();
|
||||||
|
|
||||||
let invocations = {
|
let mut invocations = {
|
||||||
let mut collector = InvocationCollector {
|
let mut collector = InvocationCollector {
|
||||||
// Non-derive macro invocations cannot see the results of cfg expansion - they
|
// Non-derive macro invocations cannot see the results of cfg expansion - they
|
||||||
// will either be removed along with the item, or invoked before the cfg/cfg_attr
|
// will either be removed along with the item, or invoked before the cfg/cfg_attr
|
||||||
|
@ -613,6 +613,19 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
|
||||||
self.cx
|
self.cx
|
||||||
.resolver
|
.resolver
|
||||||
.visit_ast_fragment_with_placeholders(self.cx.current_expansion.id, &fragment);
|
.visit_ast_fragment_with_placeholders(self.cx.current_expansion.id, &fragment);
|
||||||
|
|
||||||
|
if self.cx.sess.opts.debugging_opts.incremental_relative_spans {
|
||||||
|
for (invoc, _) in invocations.iter_mut() {
|
||||||
|
let expn_id = invoc.expansion_data.id;
|
||||||
|
let parent_def = self.cx.resolver.invocation_parent(expn_id);
|
||||||
|
let span = match &mut invoc.kind {
|
||||||
|
InvocationKind::Bang { ref mut span, .. } => span,
|
||||||
|
InvocationKind::Attr { attr, .. } => &mut attr.span,
|
||||||
|
InvocationKind::Derive { path, .. } => &mut path.span,
|
||||||
|
};
|
||||||
|
*span = span.with_parent(Some(parent_def));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(fragment, invocations)
|
(fragment, invocations)
|
||||||
|
|
|
@ -32,7 +32,13 @@ impl<'a, 'b> DefCollector<'a, 'b> {
|
||||||
fn create_def(&mut self, node_id: NodeId, data: DefPathData, span: Span) -> LocalDefId {
|
fn create_def(&mut self, node_id: NodeId, data: DefPathData, span: Span) -> LocalDefId {
|
||||||
let parent_def = self.parent_def;
|
let parent_def = self.parent_def;
|
||||||
debug!("create_def(node_id={:?}, data={:?}, parent_def={:?})", node_id, data, parent_def);
|
debug!("create_def(node_id={:?}, data={:?}, parent_def={:?})", node_id, data, parent_def);
|
||||||
self.resolver.create_def(parent_def, node_id, data, self.expansion.to_expn_id(), span)
|
self.resolver.create_def(
|
||||||
|
parent_def,
|
||||||
|
node_id,
|
||||||
|
data,
|
||||||
|
self.expansion.to_expn_id(),
|
||||||
|
span.with_parent(None),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_parent<F: FnOnce(&mut Self)>(&mut self, parent_def: LocalDefId, f: F) {
|
fn with_parent<F: FnOnce(&mut Self)>(&mut self, parent_def: LocalDefId, f: F) {
|
||||||
|
|
|
@ -180,6 +180,10 @@ impl<'a> ResolverExpand for Resolver<'a> {
|
||||||
self.next_node_id()
|
self.next_node_id()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn invocation_parent(&self, id: LocalExpnId) -> LocalDefId {
|
||||||
|
self.invocation_parents[&id].0
|
||||||
|
}
|
||||||
|
|
||||||
fn resolve_dollar_crates(&mut self) {
|
fn resolve_dollar_crates(&mut self) {
|
||||||
hygiene::update_dollar_crate_names(|ctxt| {
|
hygiene::update_dollar_crate_names(|ctxt| {
|
||||||
let ident = Ident::new(kw::DollarCrate, DUMMY_SP.with_ctxt(ctxt));
|
let ident = Ident::new(kw::DollarCrate, DUMMY_SP.with_ctxt(ctxt));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue