ass_core/parser/incremental/
range_adjust.rs1use alloc::string::String;
4use core::ops::Range;
5
6#[cfg(not(feature = "std"))]
7extern crate alloc;
8#[derive(Debug, Clone)]
10pub struct TextChange {
11 pub range: Range<usize>,
13 pub new_text: String,
15 pub line_range: Range<u32>,
17}
18
19#[must_use]
24pub fn adjust_range_for_change(original_range: Range<usize>, change: &TextChange) -> Range<usize> {
25 if change.range.end <= original_range.start {
27 let new_len = change.new_text.len();
28 let old_len = change.range.end - change.range.start;
29
30 if new_len >= old_len {
31 let offset = new_len - old_len;
32 return (original_range.start + offset)..(original_range.end + offset);
33 }
34 let offset = old_len - new_len;
35 return original_range.start.saturating_sub(offset)
36 ..original_range.end.saturating_sub(offset);
37 }
38
39 if change.range.start >= original_range.end {
41 return original_range;
42 }
43
44 let new_start = original_range.start.min(change.range.start);
47
48 let new_len = change.new_text.len();
50 let old_len = change.range.end - change.range.start;
51 let new_end = if change.range.end >= original_range.end {
52 change.range.start + new_len
54 } else {
55 if new_len >= old_len {
57 original_range.end + (new_len - old_len)
58 } else {
59 original_range.end.saturating_sub(old_len - new_len)
60 }
61 };
62
63 new_start..new_end
64}