Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #21931 from Shourya742/2026-04-02-deep-clone-during-edit
Move mutability responsibility from caller to edit_algo
Chayim Refael Friedman 7 weeks ago
parent 69774d5 · parent c8fad0e · commit 8f20499
-rw-r--r--Cargo.lock4
-rw-r--r--Cargo.toml2
-rw-r--r--crates/ide-assists/src/handlers/inline_type_alias.rs19
-rw-r--r--crates/syntax/src/syntax_editor/edit_algo.rs30
4 files changed, 37 insertions, 18 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 5370127ddc..3b354afe82 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2283,9 +2283,9 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
[[package]]
name = "rowan"
-version = "0.15.17"
+version = "0.15.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4f1e4a001f863f41ea8d0e6a0c34b356d5b733db50dadab3efef640bafb779b"
+checksum = "62f509095fc8cc0c8c8564016771d458079c11a8d857e65861f045145c0d3208"
dependencies = [
"countme",
"hashbrown 0.14.5",
diff --git a/Cargo.toml b/Cargo.toml
index 9f31e1903a..3b3929df0d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -132,7 +132,7 @@ process-wrap = { version = "8.2.1", features = ["std"] }
pulldown-cmark-to-cmark = "10.0.4"
pulldown-cmark = { version = "0.9.6", default-features = false }
rayon = "1.10.0"
-rowan = "=0.15.17"
+rowan = "=0.15.18"
# Ideally we'd not enable the macros feature but unfortunately the `tracked` attribute does not work
# on impls without it
salsa = { version = "0.25.2", default-features = false, features = [
diff --git a/crates/ide-assists/src/handlers/inline_type_alias.rs b/crates/ide-assists/src/handlers/inline_type_alias.rs
index f3ebe61078..f5b5b228f3 100644
--- a/crates/ide-assists/src/handlers/inline_type_alias.rs
+++ b/crates/ide-assists/src/handlers/inline_type_alias.rs
@@ -170,7 +170,7 @@ impl Replacement {
Replacement::Generic { lifetime_map, const_and_type_map } => {
create_replacement(lifetime_map, const_and_type_map, concrete_type)
}
- Replacement::Plain => concrete_type.syntax().clone_subtree().clone_for_update(),
+ Replacement::Plain => concrete_type.syntax().clone(),
}
}
}
@@ -361,7 +361,7 @@ fn create_replacement(
continue;
}
- replacements.push((syntax.clone(), new_lifetime.syntax().clone_for_update()));
+ replacements.push((syntax.clone(), new_lifetime.syntax().clone()));
}
} else if let Some(name_ref) = ast::NameRef::cast(syntax.clone()) {
let Some(replacement_syntax) = const_and_type_map.0.get(&name_ref.to_string()) else {
@@ -449,15 +449,12 @@ impl ConstOrTypeGeneric {
}
fn replacement_value(&self) -> Option<SyntaxNode> {
- Some(
- match self {
- ConstOrTypeGeneric::ConstArg(ca) => ca.expr()?.syntax().clone(),
- ConstOrTypeGeneric::TypeArg(ta) => ta.syntax().clone(),
- ConstOrTypeGeneric::ConstParam(cp) => cp.default_val()?.syntax().clone(),
- ConstOrTypeGeneric::TypeParam(tp) => tp.default_type()?.syntax().clone(),
- }
- .clone_for_update(),
- )
+ Some(match self {
+ ConstOrTypeGeneric::ConstArg(ca) => ca.expr()?.syntax().clone(),
+ ConstOrTypeGeneric::TypeArg(ta) => ta.syntax().clone(),
+ ConstOrTypeGeneric::ConstParam(cp) => cp.default_val()?.syntax().clone(),
+ ConstOrTypeGeneric::TypeParam(tp) => tp.default_type()?.syntax().clone(),
+ })
}
}
diff --git a/crates/syntax/src/syntax_editor/edit_algo.rs b/crates/syntax/src/syntax_editor/edit_algo.rs
index e697d97061..f6bd992f23 100644
--- a/crates/syntax/src/syntax_editor/edit_algo.rs
+++ b/crates/syntax/src/syntax_editor/edit_algo.rs
@@ -192,11 +192,8 @@ pub(super) fn apply_edits(editor: SyntaxEditor) -> SyntaxEdit {
}
};
}
- Change::Replace(SyntaxElement::Node(target), Some(SyntaxElement::Node(new_target))) => {
+ Change::Replace(SyntaxElement::Node(target), Some(SyntaxElement::Node(_))) => {
*target = tree_mutator.make_syntax_mut(target);
- if new_target.ancestors().any(|node| node == tree_mutator.immutable) {
- *new_target = new_target.clone_for_update();
- }
}
Change::Replace(target, _) | Change::ReplaceWithMany(target, _) => {
*target = tree_mutator.make_element_mut(target);
@@ -210,6 +207,31 @@ pub(super) fn apply_edits(editor: SyntaxEditor) -> SyntaxEdit {
}
match &mut changes[index as usize] {
+ Change::Insert(_, SyntaxElement::Node(node))
+ | Change::Replace(_, Some(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();
+ }
+ }
+ 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 &mut changes[index as usize] {
Change::Insert(_, element) | Change::Replace(_, Some(element)) => {
deduplicate_node(element);
}