diff options
| author | DropDemBits <r3usrlnd@gmail.com> | 2024-09-02 20:45:57 -0400 |
|---|---|---|
| committer | DropDemBits <r3usrlnd@gmail.com> | 2024-09-02 20:45:57 -0400 |
| commit | f08299f9f8014ed9fb0f13f76afaebdb7cb9d2ab (patch) | |
| tree | 8ffba49c8051762a838b1699a8e2e881f089279f /src | |
| parent | 8104457a1197353f1ed276117a4603076f26e42f (diff) | |
| download | rust-f08299f9f8014ed9fb0f13f76afaebdb7cb9d2ab.tar.gz rust-f08299f9f8014ed9fb0f13f76afaebdb7cb9d2ab.zip | |
fix insert ranges not being excluded from disjointness
Diffstat (limited to 'src')
| -rw-r--r-- | src/tools/rust-analyzer/crates/syntax/src/syntax_editor/edit_algo.rs | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/src/tools/rust-analyzer/crates/syntax/src/syntax_editor/edit_algo.rs b/src/tools/rust-analyzer/crates/syntax/src/syntax_editor/edit_algo.rs index 4f0b30ed6ad..4d6cb01c01c 100644 --- a/src/tools/rust-analyzer/crates/syntax/src/syntax_editor/edit_algo.rs +++ b/src/tools/rust-analyzer/crates/syntax/src/syntax_editor/edit_algo.rs @@ -1,10 +1,10 @@ use std::{collections::VecDeque, ops::RangeInclusive}; use rowan::TextRange; -use rustc_hash::{FxHashMap, FxHashSet}; +use rustc_hash::FxHashMap; use crate::{ - syntax_editor::{mapping::MissingMapping, Change, ChangeKind, Position, PositionRepr}, + syntax_editor::{mapping::MissingMapping, Change, ChangeKind, PositionRepr}, SyntaxElement, SyntaxNode, SyntaxNodePtr, }; @@ -41,12 +41,17 @@ pub(super) fn apply_edits(editor: SyntaxEditor) -> SyntaxEdit { .then(a.change_kind().cmp(&b.change_kind())) }); - let disjoint_replaces_ranges = changes.iter().zip(changes.iter().skip(1)).all(|(l, r)| { - l.change_kind() == ChangeKind::Replace - && r.change_kind() == ChangeKind::Replace - && (l.target_parent() != r.target_parent() + let disjoint_replaces_ranges = changes + .iter() + .zip(changes.iter().skip(1)) + .filter(|(l, r)| { + // We only care about checking for disjoint replace ranges + l.change_kind() == ChangeKind::Replace && r.change_kind() == ChangeKind::Replace + }) + .all(|(l, r)| { + (l.target_parent() != r.target_parent() || l.target_range().intersect(r.target_range()).is_none()) - }); + }); if stdx::never!( !disjoint_replaces_ranges, |
