Calculate an old_lines range in Edits iterator

This commit is contained in:
Antonio Scandurra
2021-07-15 10:11:24 +02:00
parent c2e7460fcd
commit be954872d0
3 changed files with 96 additions and 81 deletions
+25 -25
View File
@@ -106,8 +106,8 @@ impl FoldMap {
let fold = Fold(buffer.anchor_after(range.start)..buffer.anchor_before(range.end));
folds.push(fold);
edits.push(Edit {
old_range: range.clone(),
new_range: range.clone(),
old_bytes: range.clone(),
new_bytes: range.clone(),
..Default::default()
});
}
@@ -115,10 +115,10 @@ impl FoldMap {
folds.sort_unstable_by(|a, b| sum_tree::SeekDimension::cmp(a, b, buffer));
edits.sort_unstable_by(|a, b| {
a.old_range
a.old_bytes
.start
.cmp(&b.old_range.start)
.then_with(|| b.old_range.end.cmp(&a.old_range.end))
.cmp(&b.old_bytes.start)
.then_with(|| b.old_bytes.end.cmp(&a.old_bytes.end))
});
self.folds = {
@@ -151,8 +151,8 @@ impl FoldMap {
while let Some(fold) = folds_cursor.item() {
let offset_range = fold.0.start.to_offset(buffer)..fold.0.end.to_offset(buffer);
edits.push(Edit {
old_range: offset_range.clone(),
new_range: offset_range,
old_bytes: offset_range.clone(),
new_bytes: offset_range,
..Default::default()
});
fold_ixs_to_delete.push(*folds_cursor.start());
@@ -163,10 +163,10 @@ impl FoldMap {
fold_ixs_to_delete.sort_unstable();
fold_ixs_to_delete.dedup();
edits.sort_unstable_by(|a, b| {
a.old_range
a.old_bytes
.start
.cmp(&b.old_range.start)
.then_with(|| b.old_range.end.cmp(&a.old_range.end))
.cmp(&b.old_bytes.start)
.then_with(|| b.old_bytes.end.cmp(&a.old_bytes.end))
});
self.folds = {
@@ -278,28 +278,28 @@ impl FoldMap {
cursor.seek(&0, Bias::Right, &());
while let Some(mut edit) = edits.next() {
new_transforms.push_tree(cursor.slice(&edit.old_range.start, Bias::Left, &()), &());
edit.new_range.start -= edit.old_range.start - cursor.seek_start();
edit.old_range.start = *cursor.seek_start();
new_transforms.push_tree(cursor.slice(&edit.old_bytes.start, Bias::Left, &()), &());
edit.new_bytes.start -= edit.old_bytes.start - cursor.seek_start();
edit.old_bytes.start = *cursor.seek_start();
cursor.seek(&edit.old_range.end, Bias::Right, &());
cursor.seek(&edit.old_bytes.end, Bias::Right, &());
cursor.next(&());
let mut delta = edit.delta();
loop {
edit.old_range.end = *cursor.seek_start();
edit.old_bytes.end = *cursor.seek_start();
if let Some(next_edit) = edits.peek() {
if next_edit.old_range.start > edit.old_range.end {
if next_edit.old_bytes.start > edit.old_bytes.end {
break;
}
let next_edit = edits.next().unwrap();
delta += next_edit.delta();
if next_edit.old_range.end >= edit.old_range.end {
edit.old_range.end = next_edit.old_range.end;
cursor.seek(&edit.old_range.end, Bias::Right, &());
if next_edit.old_bytes.end >= edit.old_bytes.end {
edit.old_bytes.end = next_edit.old_bytes.end;
cursor.seek(&edit.old_bytes.end, Bias::Right, &());
cursor.next(&());
}
} else {
@@ -307,10 +307,10 @@ impl FoldMap {
}
}
edit.new_range.end =
((edit.new_range.start + edit.old_extent()) as isize + delta) as usize;
edit.new_bytes.end =
((edit.new_bytes.start + edit.deleted_bytes()) as isize + delta) as usize;
let anchor = buffer.anchor_before(edit.new_range.start);
let anchor = buffer.anchor_before(edit.new_bytes.start);
let mut folds_cursor = self.folds.cursor::<_, ()>();
folds_cursor.seek(&Fold(anchor..Anchor::max()), Bias::Left, buffer);
let mut folds = iter::from_fn(move || {
@@ -324,7 +324,7 @@ impl FoldMap {
while folds
.peek()
.map_or(false, |fold| fold.start < edit.new_range.end)
.map_or(false, |fold| fold.start < edit.new_bytes.end)
{
let mut fold = folds.next().unwrap();
let sum = new_transforms.summary();
@@ -380,9 +380,9 @@ impl FoldMap {
}
let sum = new_transforms.summary();
if sum.buffer.bytes < edit.new_range.end {
if sum.buffer.bytes < edit.new_bytes.end {
let text_summary =
buffer.text_summary_for_range(sum.buffer.bytes..edit.new_range.end);
buffer.text_summary_for_range(sum.buffer.bytes..edit.new_bytes.end);
new_transforms.push(
Transform {
summary: TransformSummary {
+1 -2
View File
@@ -117,9 +117,8 @@ impl BackgroundWrapper {
{
let mut old_cursor = self.snapshot.transforms.cursor::<Point, ()>();
for edit in buffer.edits_since(self.snapshot.version.clone()) {
// TODO: old lines gives us an extent but we really want to park ourselves at the start of the line.
new_transforms.push_tree(
old_cursor.slice(&Point::new(edit.old_lines.row, 0), Bias::Left, &()),
old_cursor.slice(&Point::new(edit.old_lines.start.row, 0), Bias::Left, &()),
&(),
);
}