@@ -4,6 +4,7 @@ use std::mem;
44
55use mbe:: { SyntheticToken , SyntheticTokenId , TokenMap } ;
66use rustc_hash:: FxHashMap ;
7+ use smallvec:: SmallVec ;
78use syntax:: {
89 ast:: { self , AstNode , HasLoopBody } ,
910 match_ast, SyntaxElement , SyntaxKind , SyntaxNode , TextRange ,
@@ -292,21 +293,34 @@ pub(crate) fn reverse_fixups(
292293 token_map : & TokenMap ,
293294 undo_info : & SyntaxFixupUndoInfo ,
294295) {
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 ) )
307303 }
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 ( ) ;
310324}
311325
312326#[ cfg( test) ]
0 commit comments