Skip to content

Commit 4f415fc

Browse files
committed
Ignore outermost non-delimited Subtree when reversing fixups
1 parent 41b0c54 commit 4f415fc

File tree

1 file changed

+28
-14
lines changed

1 file changed

+28
-14
lines changed

crates/hir-expand/src/fixup.rs

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::mem;
44

55
use mbe::{SyntheticToken, SyntheticTokenId, TokenMap};
66
use rustc_hash::FxHashMap;
7+
use smallvec::SmallVec;
78
use 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

Comments
 (0)