Rollup merge of #87779 - Aaron1011:stmt-ast-id, r=petrochenkov

Remove special case for statement `NodeId` assignment

We now let `noop_flat_map_stmt` assign `NodeId`s (via `visit_id`),
just as we do for other AST nodes.
This commit is contained in:
Yuki Okushi 2021-08-07 01:46:34 +09:00 committed by GitHub
commit a4262cc984
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 7 additions and 28 deletions

View file

@ -559,7 +559,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> {
self.cx.force_mode = orig_force_mode; self.cx.force_mode = orig_force_mode;
// Finally incorporate all the expanded macros into the input AST fragment. // Finally incorporate all the expanded macros into the input AST fragment.
let mut placeholder_expander = PlaceholderExpander::new(self.cx, self.monotonic); let mut placeholder_expander = PlaceholderExpander::default();
while let Some(expanded_fragments) = expanded_fragments.pop() { while let Some(expanded_fragments) = expanded_fragments.pop() {
for (expn_id, expanded_fragment) in expanded_fragments.into_iter().rev() { for (expn_id, expanded_fragment) in expanded_fragments.into_iter().rev() {
placeholder_expander placeholder_expander
@ -1341,14 +1341,9 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
} }
} }
// The placeholder expander gives ids to statements, so we avoid folding the id here.
// We don't use `assign_id!` - it will be called when we visit statement's contents // We don't use `assign_id!` - it will be called when we visit statement's contents
// (e.g. an expression, item, or local) // (e.g. an expression, item, or local)
let ast::Stmt { id, kind, span } = stmt; let res = noop_flat_map_stmt(stmt, self);
let res = noop_flat_map_stmt_kind(kind, self)
.into_iter()
.map(|kind| ast::Stmt { id, kind, span })
.collect();
self.cx.current_expansion.is_trailing_mac = false; self.cx.current_expansion.is_trailing_mac = false;
res res

View file

@ -7,6 +7,7 @@
#![feature(proc_macro_internals)] #![feature(proc_macro_internals)]
#![feature(proc_macro_span)] #![feature(proc_macro_span)]
#![feature(try_blocks)] #![feature(try_blocks)]
#![recursion_limit = "256"]
#[macro_use] #[macro_use]
extern crate rustc_macros; extern crate rustc_macros;

View file

@ -1,4 +1,3 @@
use crate::base::ExtCtxt;
use crate::expand::{AstFragment, AstFragmentKind}; use crate::expand::{AstFragment, AstFragmentKind};
use rustc_ast as ast; use rustc_ast as ast;
@ -175,17 +174,12 @@ pub fn placeholder(
} }
} }
pub struct PlaceholderExpander<'a, 'b> { #[derive(Default)]
pub struct PlaceholderExpander {
expanded_fragments: FxHashMap<ast::NodeId, AstFragment>, expanded_fragments: FxHashMap<ast::NodeId, AstFragment>,
cx: &'a mut ExtCtxt<'b>,
monotonic: bool,
} }
impl<'a, 'b> PlaceholderExpander<'a, 'b> { impl PlaceholderExpander {
pub fn new(cx: &'a mut ExtCtxt<'b>, monotonic: bool) -> Self {
PlaceholderExpander { cx, expanded_fragments: FxHashMap::default(), monotonic }
}
pub fn add(&mut self, id: ast::NodeId, mut fragment: AstFragment) { pub fn add(&mut self, id: ast::NodeId, mut fragment: AstFragment) {
fragment.mut_visit_with(self); fragment.mut_visit_with(self);
self.expanded_fragments.insert(id, fragment); self.expanded_fragments.insert(id, fragment);
@ -196,7 +190,7 @@ impl<'a, 'b> PlaceholderExpander<'a, 'b> {
} }
} }
impl<'a, 'b> MutVisitor for PlaceholderExpander<'a, 'b> { impl MutVisitor for PlaceholderExpander {
fn flat_map_arm(&mut self, arm: ast::Arm) -> SmallVec<[ast::Arm; 1]> { fn flat_map_arm(&mut self, arm: ast::Arm) -> SmallVec<[ast::Arm; 1]> {
if arm.is_placeholder { if arm.is_placeholder {
self.remove(arm.id).make_arms() self.remove(arm.id).make_arms()
@ -360,15 +354,4 @@ impl<'a, 'b> MutVisitor for PlaceholderExpander<'a, 'b> {
_ => noop_visit_ty(ty, self), _ => noop_visit_ty(ty, self),
} }
} }
fn visit_block(&mut self, block: &mut P<ast::Block>) {
noop_visit_block(block, self);
for stmt in block.stmts.iter_mut() {
if self.monotonic {
assert_eq!(stmt.id, ast::DUMMY_NODE_ID);
stmt.id = self.cx.resolver.next_node_id();
}
}
}
} }