Unnamed repository; edit this file 'description' to name the repository.
Add comment on replacements_are_disjoint method and better upmap syntax
bit-aloo 11 days ago
parent 06fa6f6 · commit e1ab771
-rw-r--r--crates/syntax/src/syntax_editor/edit_algo.rs3
-rw-r--r--crates/syntax/src/syntax_editor/mapping.rs7
2 files changed, 6 insertions, 4 deletions
diff --git a/crates/syntax/src/syntax_editor/edit_algo.rs b/crates/syntax/src/syntax_editor/edit_algo.rs
index 71b03784e9..d24d9b1334 100644
--- a/crates/syntax/src/syntax_editor/edit_algo.rs
+++ b/crates/syntax/src/syntax_editor/edit_algo.rs
@@ -200,6 +200,9 @@ impl EditPlan {
}
/// Checks that replacement at the same tree depth do not overlap
+ ///
+ /// `changes` is sorted by range start, so overlap is a single comparison against the
+ /// last range at that key, and `insert` can throw away the range it evicts.
fn replacements_are_disjoint(
changes: &[Change],
mut node_depth: impl FnMut(SyntaxNode) -> usize,
diff --git a/crates/syntax/src/syntax_editor/mapping.rs b/crates/syntax/src/syntax_editor/mapping.rs
index d6498a5ec9..17319368af 100644
--- a/crates/syntax/src/syntax_editor/mapping.rs
+++ b/crates/syntax/src/syntax_editor/mapping.rs
@@ -135,12 +135,11 @@ impl SyntaxMapping {
SyntaxElement::Node(node) => node.clone(),
SyntaxElement::Token(token) => token.parent().unwrap(),
};
- let Some(input_ancestor) =
- node.ancestors().find(|ancestor| self.upmap_node_single(ancestor).is_some())
- else {
+ let Some((input_ancestor, output_ancestor)) = node.ancestors().find_map(|ancestor| {
+ self.upmap_node_single(&ancestor).map(|output_ancestor| (ancestor, output_ancestor))
+ }) else {
return current;
};
- let output_ancestor = self.upmap_node_single(&input_ancestor).unwrap();
current = self
.upmap_child_element(&current, &input_ancestor, &output_ancestor.parent().unwrap())
.expect("the nearest mapped ancestor must map its descendants");