Skip to content

Commit 8737171

Browse files
committed
internal: remove more of the SyntaxRewriter
1 parent 0650f77 commit 8737171

File tree

1 file changed

+31
-29
lines changed

1 file changed

+31
-29
lines changed

crates/syntax/src/ast/edit.rs

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::{
1515
make::{self, tokens},
1616
AstNode, GenericParamsOwner, NameOwner, TypeBoundsOwner,
1717
},
18-
AstToken, Direction, InsertPosition, SmolStr, SyntaxElement, SyntaxKind,
18+
ted, AstToken, Direction, InsertPosition, NodeOrToken, SmolStr, SyntaxElement, SyntaxKind,
1919
SyntaxKind::{ATTR, COMMENT, WHITESPACE},
2020
SyntaxNode, SyntaxToken, T,
2121
};
@@ -588,37 +588,39 @@ impl IndentLevel {
588588
/// ```
589589
/// if you indent the block, the `{` token would stay put.
590590
fn increase_indent(self, node: SyntaxNode) -> SyntaxNode {
591-
let mut rewriter = SyntaxRewriter::default();
592-
node.descendants_with_tokens()
593-
.filter_map(|el| el.into_token())
594-
.filter_map(ast::Whitespace::cast)
595-
.filter(|ws| {
596-
let text = ws.syntax().text();
597-
text.contains('\n')
598-
})
599-
.for_each(|ws| {
600-
let new_ws = make::tokens::whitespace(&format!("{}{}", ws.syntax(), self,));
601-
rewriter.replace(ws.syntax(), &new_ws)
602-
});
603-
rewriter.rewrite(&node)
591+
let res = node.clone_subtree().clone_for_update();
592+
let tokens = res.preorder_with_tokens().filter_map(|event| match event {
593+
rowan::WalkEvent::Leave(NodeOrToken::Token(it)) => Some(it),
594+
_ => None,
595+
});
596+
for token in tokens {
597+
if let Some(ws) = ast::Whitespace::cast(token) {
598+
if ws.text().contains('\n') {
599+
let new_ws = make::tokens::whitespace(&format!("{}{}", ws.syntax(), self));
600+
ted::replace(ws.syntax(), &new_ws)
601+
}
602+
}
603+
}
604+
res.clone_subtree()
604605
}
605606

606607
fn decrease_indent(self, node: SyntaxNode) -> SyntaxNode {
607-
let mut rewriter = SyntaxRewriter::default();
608-
node.descendants_with_tokens()
609-
.filter_map(|el| el.into_token())
610-
.filter_map(ast::Whitespace::cast)
611-
.filter(|ws| {
612-
let text = ws.syntax().text();
613-
text.contains('\n')
614-
})
615-
.for_each(|ws| {
616-
let new_ws = make::tokens::whitespace(
617-
&ws.syntax().text().replace(&format!("\n{}", self), "\n"),
618-
);
619-
rewriter.replace(ws.syntax(), &new_ws)
620-
});
621-
rewriter.rewrite(&node)
608+
let res = node.clone_subtree().clone_for_update();
609+
let tokens = res.preorder_with_tokens().filter_map(|event| match event {
610+
rowan::WalkEvent::Leave(NodeOrToken::Token(it)) => Some(it),
611+
_ => None,
612+
});
613+
for token in tokens {
614+
if let Some(ws) = ast::Whitespace::cast(token) {
615+
if ws.text().contains('\n') {
616+
let new_ws = make::tokens::whitespace(
617+
&ws.syntax().text().replace(&format!("\n{}", self), "\n"),
618+
);
619+
ted::replace(ws.syntax(), &new_ws)
620+
}
621+
}
622+
}
623+
res.clone_subtree()
622624
}
623625
}
624626

0 commit comments

Comments
 (0)