Skip to content

Commit 12e079e

Browse files
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
2 parents 512db74 + c5e5bd8 commit 12e079e

2 files changed

Lines changed: 30 additions & 6 deletions

File tree

crates/ide-assists/src/handlers/unwrap_block.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ fn wrap_let(assign: &ast::LetStmt, replacement: ast::BlockExpr) -> ast::BlockExp
104104
let try_wrap_assign = || {
105105
let initializer = assign.initializer()?.syntax().syntax_element();
106106
let (mut edit, replacement) = SyntaxEditor::with_ast_node(&replacement);
107-
let assign = assign.clone_for_update();
108107
let tail_expr = replacement.tail_expr()?;
109108
let before =
110109
assign.syntax().children_with_tokens().take_while(|it| *it != initializer).collect();

crates/syntax/src/syntax_editor/edit_algo.rs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,15 +215,40 @@ pub(super) fn apply_edits(editor: SyntaxEditor) -> SyntaxEdit {
215215
*node = node.clone_for_update();
216216
}
217217
}
218+
Change::Insert(_, SyntaxElement::Token(token))
219+
| Change::Replace(_, Some(SyntaxElement::Token(token))) => {
220+
if let Some(parent) = token.parent() {
221+
let idx = token.index();
222+
let new_parent = parent.clone_subtree().clone_for_update();
223+
*token = new_parent
224+
.children_with_tokens()
225+
.nth(idx)
226+
.and_then(SyntaxElement::into_token)
227+
.unwrap();
228+
}
229+
}
218230
Change::InsertAll(_, elements)
219231
| Change::ReplaceWithMany(_, elements)
220232
| Change::ReplaceAll(_, elements) => {
221233
for element in elements {
222-
if let SyntaxElement::Node(node) = element {
223-
if node.parent().is_some() {
224-
*node = node.clone_subtree().clone_for_update();
225-
} else if !node.is_mutable() {
226-
*node = node.clone_for_update();
234+
match element {
235+
SyntaxElement::Node(node) => {
236+
if node.parent().is_some() {
237+
*node = node.clone_subtree().clone_for_update();
238+
} else if !node.is_mutable() {
239+
*node = node.clone_for_update();
240+
}
241+
}
242+
SyntaxElement::Token(token) => {
243+
if let Some(parent) = token.parent() {
244+
let idx = token.index();
245+
let new_parent = parent.clone_subtree().clone_for_update();
246+
*token = new_parent
247+
.children_with_tokens()
248+
.nth(idx)
249+
.and_then(SyntaxElement::into_token)
250+
.unwrap();
251+
}
227252
}
228253
}
229254
}

0 commit comments

Comments
 (0)