Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #21975 from Shourya742/2026-04-06-handle-token-mutability-in-edit-flow-as-well
Handle token mutability in edit flow as well
Chayim Refael Friedman 6 weeks ago
parent 512db74 · parent c5e5bd8 · commit 12e079e
-rw-r--r--crates/ide-assists/src/handlers/unwrap_block.rs1
-rw-r--r--crates/syntax/src/syntax_editor/edit_algo.rs35
2 files changed, 30 insertions, 6 deletions
diff --git a/crates/ide-assists/src/handlers/unwrap_block.rs b/crates/ide-assists/src/handlers/unwrap_block.rs
index c7e0394ce1..5593ca3eb8 100644
--- a/crates/ide-assists/src/handlers/unwrap_block.rs
+++ b/crates/ide-assists/src/handlers/unwrap_block.rs
@@ -104,7 +104,6 @@ fn wrap_let(assign: &ast::LetStmt, replacement: ast::BlockExpr) -> ast::BlockExp
let try_wrap_assign = || {
let initializer = assign.initializer()?.syntax().syntax_element();
let (mut edit, replacement) = SyntaxEditor::with_ast_node(&replacement);
- let assign = assign.clone_for_update();
let tail_expr = replacement.tail_expr()?;
let before =
assign.syntax().children_with_tokens().take_while(|it| *it != initializer).collect();
diff --git a/crates/syntax/src/syntax_editor/edit_algo.rs b/crates/syntax/src/syntax_editor/edit_algo.rs
index f6bd992f23..78e7083f97 100644
--- a/crates/syntax/src/syntax_editor/edit_algo.rs
+++ b/crates/syntax/src/syntax_editor/edit_algo.rs
@@ -215,15 +215,40 @@ pub(super) fn apply_edits(editor: SyntaxEditor) -> SyntaxEdit {
*node = node.clone_for_update();
}
}
+ Change::Insert(_, SyntaxElement::Token(token))
+ | Change::Replace(_, Some(SyntaxElement::Token(token))) => {
+ if let Some(parent) = token.parent() {
+ let idx = token.index();
+ let new_parent = parent.clone_subtree().clone_for_update();
+ *token = new_parent
+ .children_with_tokens()
+ .nth(idx)
+ .and_then(SyntaxElement::into_token)
+ .unwrap();
+ }
+ }
Change::InsertAll(_, elements)
| Change::ReplaceWithMany(_, elements)
| Change::ReplaceAll(_, elements) => {
for element in elements {
- if let SyntaxElement::Node(node) = element {
- if node.parent().is_some() {
- *node = node.clone_subtree().clone_for_update();
- } else if !node.is_mutable() {
- *node = node.clone_for_update();
+ match element {
+ SyntaxElement::Node(node) => {
+ if node.parent().is_some() {
+ *node = node.clone_subtree().clone_for_update();
+ } else if !node.is_mutable() {
+ *node = node.clone_for_update();
+ }
+ }
+ SyntaxElement::Token(token) => {
+ if let Some(parent) = token.parent() {
+ let idx = token.index();
+ let new_parent = parent.clone_subtree().clone_for_update();
+ *token = new_parent
+ .children_with_tokens()
+ .nth(idx)
+ .and_then(SyntaxElement::into_token)
+ .unwrap();
+ }
}
}
}