@@ -3,7 +3,7 @@ use std::rc::Rc;
3
3
use std:: sync:: Arc ;
4
4
use std:: { iter, mem} ;
5
5
6
- use rustc_ast as ast;
6
+ use rustc_ast:: { self as ast, DUMMY_NODE_ID } ;
7
7
use rustc_ast:: mut_visit:: * ;
8
8
use rustc_ast:: ptr:: P ;
9
9
use rustc_ast:: tokenstream:: TokenStream ;
@@ -131,13 +131,9 @@ macro_rules! ast_fragments {
131
131
pub ( crate ) fn mut_visit_with<F : MutVisitor >( & mut self , vis: & mut F ) {
132
132
match self {
133
133
AstFragment :: OptExpr ( opt_expr) => {
134
- visit_clobber( opt_expr, |opt_expr| {
135
- if let Some ( expr) = opt_expr {
136
- vis. filter_map_expr( expr)
137
- } else {
138
- None
139
- }
140
- } ) ;
134
+ if let Some ( expr) = opt_expr. take( ) {
135
+ * opt_expr = vis. filter_map_expr( expr)
136
+ }
141
137
}
142
138
AstFragment :: MethodReceiverExpr ( expr) => vis. visit_method_receiver_expr( expr) ,
143
139
$( $( AstFragment :: $Kind( ast) => vis. $mut_visit_ast( ast) , ) ?) *
@@ -1782,11 +1778,7 @@ impl InvocationCollectorNode for AstNodeWrapper<P<ast::Expr>, OptExprTag> {
1782
1778
/// This struct is a hack to workaround unstable of `stmt_expr_attributes`.
1783
1779
/// It can be removed once that feature is stabilized.
1784
1780
struct MethodReceiverTag ;
1785
- impl DummyAstNode for MethodReceiverTag {
1786
- fn dummy ( ) -> MethodReceiverTag {
1787
- MethodReceiverTag
1788
- }
1789
- }
1781
+
1790
1782
impl InvocationCollectorNode for AstNodeWrapper < P < ast:: Expr > , MethodReceiverTag > {
1791
1783
type OutputTy = Self ;
1792
1784
const KIND : AstFragmentKind = AstFragmentKind :: MethodReceiverExpr ;
@@ -2135,42 +2127,40 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
2135
2127
}
2136
2128
}
2137
2129
2138
- fn visit_node < Node : InvocationCollectorNode < OutputTy = Node > + DummyAstNode > (
2130
+ fn visit_node < Node : InvocationCollectorNode < OutputTy = Node > > (
2139
2131
& mut self ,
2140
- node : & mut Node ,
2141
- ) {
2132
+ mut node : Node ,
2133
+ ) -> Node {
2142
2134
loop {
2143
- return match self . take_first_attr ( node) {
2135
+ return match self . take_first_attr ( & mut node) {
2144
2136
Some ( ( attr, pos, derives) ) => match attr. name ( ) {
2145
2137
Some ( sym:: cfg) => {
2146
2138
let span = attr. span ;
2147
- if self . expand_cfg_true ( node, attr, pos) . 0 {
2139
+ if self . expand_cfg_true ( & mut node, attr, pos) . 0 {
2148
2140
continue ;
2149
2141
}
2150
2142
2151
2143
node. expand_cfg_false ( self , pos, span) ;
2152
2144
continue ;
2153
2145
}
2154
2146
Some ( sym:: cfg_attr) => {
2155
- self . expand_cfg_attr ( node, & attr, pos) ;
2147
+ self . expand_cfg_attr ( & mut node, & attr, pos) ;
2156
2148
continue ;
2157
2149
}
2158
- _ => visit_clobber ( node , |node| {
2150
+ _ => {
2159
2151
self . collect_attr ( ( attr, pos, derives) , node. to_annotatable ( ) , Node :: KIND )
2160
- . make_ast :: < Node > ( )
2161
- } ) ,
2152
+ . make_ast :: < Node > ( )
2153
+ }
2162
2154
} ,
2163
2155
None if node. is_mac_call ( ) => {
2164
- visit_clobber ( node, |node| {
2165
- // Do not clobber unless it's actually a macro (uncommon case).
2166
- let ( mac, attrs, _) = node. take_mac_call ( ) ;
2167
- self . check_attributes ( & attrs, & mac) ;
2168
- self . collect_bang ( mac, Node :: KIND ) . make_ast :: < Node > ( )
2169
- } )
2156
+ let ( mac, attrs, _) = node. take_mac_call ( ) ;
2157
+ self . check_attributes ( & attrs, & mac) ;
2158
+ self . collect_bang ( mac, Node :: KIND ) . make_ast :: < Node > ( )
2170
2159
}
2171
2160
None if node. delegation ( ) . is_some ( ) => unreachable ! ( ) ,
2172
2161
None => {
2173
- assign_id ! ( self , node. node_id_mut( ) , || node. walk( self ) )
2162
+ assign_id ! ( self , node. node_id_mut( ) , || node. walk( self ) ) ;
2163
+ node
2174
2164
}
2175
2165
} ;
2176
2166
}
@@ -2273,31 +2263,61 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
2273
2263
}
2274
2264
2275
2265
fn visit_crate ( & mut self , node : & mut ast:: Crate ) {
2276
- self . visit_node ( node)
2266
+ let krate = mem:: replace ( node, ast:: Crate {
2267
+ attrs : Default :: default ( ) ,
2268
+ items : Default :: default ( ) ,
2269
+ spans : Default :: default ( ) ,
2270
+ id : DUMMY_NODE_ID ,
2271
+ is_placeholder : Default :: default ( ) ,
2272
+ } ) ;
2273
+ * node = self . visit_node ( krate) ;
2277
2274
}
2278
2275
2279
2276
fn visit_ty ( & mut self , node : & mut P < ast:: Ty > ) {
2280
- self . visit_node ( node)
2277
+ let ty = mem:: replace ( node, P ( ast:: Ty {
2278
+ id : DUMMY_NODE_ID ,
2279
+ kind : TyKind :: Dummy ,
2280
+ span : Default :: default ( ) ,
2281
+ tokens : Default :: default ( ) ,
2282
+ } ) ) ;
2283
+ * node = self . visit_node ( ty) ;
2281
2284
}
2282
2285
2283
2286
fn visit_pat ( & mut self , node : & mut P < ast:: Pat > ) {
2284
- self . visit_node ( node)
2287
+ let pat = mem:: replace ( node, P ( ast:: Pat {
2288
+ id : DUMMY_NODE_ID ,
2289
+ kind : PatKind :: Wild ,
2290
+ span : Default :: default ( ) ,
2291
+ tokens : Default :: default ( ) ,
2292
+ } ) ) ;
2293
+ * node = self . visit_node ( pat)
2285
2294
}
2286
2295
2287
2296
fn visit_expr ( & mut self , node : & mut P < ast:: Expr > ) {
2288
2297
// FIXME: Feature gating is performed inconsistently between `Expr` and `OptExpr`.
2289
2298
if let Some ( attr) = node. attrs . first ( ) {
2290
2299
self . cfg ( ) . maybe_emit_expr_attr_err ( attr) ;
2291
2300
}
2292
- self . visit_node ( node)
2301
+ let expr = mem:: replace ( node, P ( ast:: Expr {
2302
+ id : DUMMY_NODE_ID ,
2303
+ kind : ExprKind :: Dummy ,
2304
+ span : Default :: default ( ) ,
2305
+ attrs : Default :: default ( ) ,
2306
+ tokens : Default :: default ( ) ,
2307
+ } ) ) ;
2308
+ * node = self . visit_node ( expr) ;
2293
2309
}
2294
2310
2295
2311
fn visit_method_receiver_expr ( & mut self , node : & mut P < ast:: Expr > ) {
2296
- visit_clobber ( node, |node| {
2297
- let mut wrapper = AstNodeWrapper :: new ( node, MethodReceiverTag ) ;
2298
- self . visit_node ( & mut wrapper) ;
2299
- wrapper. wrapped
2300
- } )
2312
+ let expr = mem:: replace ( node, P ( ast:: Expr {
2313
+ id : DUMMY_NODE_ID ,
2314
+ kind : ExprKind :: Dummy ,
2315
+ span : Default :: default ( ) ,
2316
+ attrs : Default :: default ( ) ,
2317
+ tokens : Default :: default ( ) ,
2318
+ } ) ) ;
2319
+ let wrapper = AstNodeWrapper :: new ( expr, MethodReceiverTag ) ;
2320
+ * node = self . visit_node ( wrapper) . wrapped ;
2301
2321
}
2302
2322
2303
2323
fn filter_map_expr ( & mut self , node : P < ast:: Expr > ) -> Option < P < ast:: Expr > > {
0 commit comments