fix: panic which occured if ranges overlapped

This commit is contained in:
Nikita Revenco 2024-11-13 22:49:52 +00:00
parent 3633c8cd0f
commit 7f9e7611b6
2 changed files with 18 additions and 1 deletions

View File

@ -615,7 +615,6 @@ pub fn change<I>(doc: &Rope, changes: I) -> Self
let mut last = 0;
for (from, to, tendril) in changes {
// Verify ranges are ordered and not overlapping
dbg!(last, from);
debug_assert!(last <= from);
// Verify ranges are correct
debug_assert!(

View File

@ -5865,6 +5865,24 @@ fn surround_delete(cx: &mut Context) {
return;
}
};
let mut ranges: SmallVec<[Range; 1]> = change_pos
.iter()
.flat_map(|&((opening_tag_range, closing_tag_range), _)| {
vec![opening_tag_range, closing_tag_range]
})
.collect();
ranges.sort_by(|a, b| a.from().cmp(&b.from()));
let has_overlaps = ranges
.windows(2)
.any(|window| window[0].to() > window[1].from());
if has_overlaps {
cx.editor
.set_error("Cursors overlap for a single surround pair range");
return;
}
let transaction = Transaction::change(
doc.text(),
change_pos.iter().flat_map(|(pos, _)| {