@@ -4,6 +4,7 @@ use std::mem;
4
4
5
5
use mbe:: { SyntheticToken , SyntheticTokenId , TokenMap } ;
6
6
use rustc_hash:: FxHashMap ;
7
+ use smallvec:: SmallVec ;
7
8
use syntax:: {
8
9
ast:: { self , AstNode , HasLoopBody } ,
9
10
match_ast, SyntaxElement , SyntaxKind , SyntaxNode , TextRange ,
@@ -292,21 +293,34 @@ pub(crate) fn reverse_fixups(
292
293
token_map : & TokenMap ,
293
294
undo_info : & SyntaxFixupUndoInfo ,
294
295
) {
295
- tt. token_trees . retain ( |tt| match tt {
296
- tt:: TokenTree :: Leaf ( leaf) => token_map. synthetic_token_id ( leaf. id ( ) ) != Some ( EMPTY_ID ) ,
297
- tt:: TokenTree :: Subtree ( st) => {
298
- st. delimiter . map_or ( true , |d| token_map. synthetic_token_id ( d. id ) != Some ( EMPTY_ID ) )
299
- }
300
- } ) ;
301
- tt. token_trees . iter_mut ( ) . for_each ( |tt| match tt {
302
- tt:: TokenTree :: Subtree ( tt) => reverse_fixups ( tt, token_map, undo_info) ,
303
- tt:: TokenTree :: Leaf ( leaf) => {
304
- if let Some ( id) = token_map. synthetic_token_id ( leaf. id ( ) ) {
305
- let original = & undo_info. original [ id. 0 as usize ] ;
306
- * tt = tt:: TokenTree :: Subtree ( original. clone ( ) ) ;
296
+ let tts = std:: mem:: take ( & mut tt. token_trees ) ;
297
+ tt. token_trees = tts
298
+ . into_iter ( )
299
+ . filter ( |tt| match tt {
300
+ tt:: TokenTree :: Leaf ( leaf) => token_map. synthetic_token_id ( leaf. id ( ) ) != Some ( EMPTY_ID ) ,
301
+ tt:: TokenTree :: Subtree ( st) => {
302
+ st. delimiter . map_or ( true , |d| token_map. synthetic_token_id ( d. id ) != Some ( EMPTY_ID ) )
307
303
}
308
- }
309
- } ) ;
304
+ } )
305
+ . flat_map ( |tt| match tt {
306
+ tt:: TokenTree :: Subtree ( mut tt) => {
307
+ reverse_fixups ( & mut tt, token_map, undo_info) ;
308
+ SmallVec :: from_const ( [ tt. into ( ) ] )
309
+ }
310
+ tt:: TokenTree :: Leaf ( leaf) => {
311
+ if let Some ( id) = token_map. synthetic_token_id ( leaf. id ( ) ) {
312
+ let original = undo_info. original [ id. 0 as usize ] . clone ( ) ;
313
+ if original. delimiter . is_none ( ) {
314
+ original. token_trees . into ( )
315
+ } else {
316
+ SmallVec :: from_const ( [ original. into ( ) ] )
317
+ }
318
+ } else {
319
+ SmallVec :: from_const ( [ leaf. into ( ) ] )
320
+ }
321
+ }
322
+ } )
323
+ . collect ( ) ;
310
324
}
311
325
312
326
#[ cfg( test) ]
0 commit comments