Unnamed repository; edit this file 'description' to name the repository.
Add comment on replacements_are_disjoint method and better upmap syntax
| -rw-r--r-- | crates/syntax/src/syntax_editor/edit_algo.rs | 3 | ||||
| -rw-r--r-- | crates/syntax/src/syntax_editor/mapping.rs | 7 |
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(¤t, &input_ancestor, &output_ancestor.parent().unwrap()) .expect("the nearest mapped ancestor must map its descendants"); |