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
| -rw-r--r-- | crates/ide-assists/src/handlers/unwrap_block.rs | 1 | ||||
| -rw-r--r-- | crates/syntax/src/syntax_editor/edit_algo.rs | 35 |
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(); + } } } } |