sum_tree: Store context on cursor (#34904)
This gets rid of the need to pass context to all cursor functions. In practice context is always immutable when interacting with cursors. A nicety of this is in the follow-up PR we will be able to implement Iterator for all Cursors/filter cursors (hell, we may be able to get rid of filter cursor altogether, as it is just a custom `filter` impl on iterator trait). Release Notes: - N/A
This commit is contained in:
parent
fa3e1ccc37
commit
64d0fec699
23 changed files with 749 additions and 876 deletions
|
@ -343,8 +343,7 @@ impl BufferDiffInner {
|
|||
..
|
||||
} in hunks.iter().cloned()
|
||||
{
|
||||
let preceding_pending_hunks =
|
||||
old_pending_hunks.slice(&buffer_range.start, Bias::Left, buffer);
|
||||
let preceding_pending_hunks = old_pending_hunks.slice(&buffer_range.start, Bias::Left);
|
||||
pending_hunks.append(preceding_pending_hunks, buffer);
|
||||
|
||||
// Skip all overlapping or adjacent old pending hunks
|
||||
|
@ -355,7 +354,7 @@ impl BufferDiffInner {
|
|||
.cmp(&buffer_range.end, buffer)
|
||||
.is_le()
|
||||
}) {
|
||||
old_pending_hunks.next(buffer);
|
||||
old_pending_hunks.next();
|
||||
}
|
||||
|
||||
if (stage && secondary_status == DiffHunkSecondaryStatus::NoSecondaryHunk)
|
||||
|
@ -379,10 +378,10 @@ impl BufferDiffInner {
|
|||
);
|
||||
}
|
||||
// append the remainder
|
||||
pending_hunks.append(old_pending_hunks.suffix(buffer), buffer);
|
||||
pending_hunks.append(old_pending_hunks.suffix(), buffer);
|
||||
|
||||
let mut unstaged_hunk_cursor = unstaged_diff.hunks.cursor::<DiffHunkSummary>(buffer);
|
||||
unstaged_hunk_cursor.next(buffer);
|
||||
unstaged_hunk_cursor.next();
|
||||
|
||||
// then, iterate over all pending hunks (both new ones and the existing ones) and compute the edits
|
||||
let mut prev_unstaged_hunk_buffer_end = 0;
|
||||
|
@ -397,8 +396,7 @@ impl BufferDiffInner {
|
|||
}) = pending_hunks_iter.next()
|
||||
{
|
||||
// Advance unstaged_hunk_cursor to skip unstaged hunks before current hunk
|
||||
let skipped_unstaged =
|
||||
unstaged_hunk_cursor.slice(&buffer_range.start, Bias::Left, buffer);
|
||||
let skipped_unstaged = unstaged_hunk_cursor.slice(&buffer_range.start, Bias::Left);
|
||||
|
||||
if let Some(unstaged_hunk) = skipped_unstaged.last() {
|
||||
prev_unstaged_hunk_base_text_end = unstaged_hunk.diff_base_byte_range.end;
|
||||
|
@ -425,7 +423,7 @@ impl BufferDiffInner {
|
|||
buffer_offset_range.end =
|
||||
buffer_offset_range.end.max(unstaged_hunk_offset_range.end);
|
||||
|
||||
unstaged_hunk_cursor.next(buffer);
|
||||
unstaged_hunk_cursor.next();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -514,7 +512,7 @@ impl BufferDiffInner {
|
|||
});
|
||||
|
||||
let anchor_iter = iter::from_fn(move || {
|
||||
cursor.next(buffer);
|
||||
cursor.next();
|
||||
cursor.item()
|
||||
})
|
||||
.flat_map(move |hunk| {
|
||||
|
@ -531,12 +529,12 @@ impl BufferDiffInner {
|
|||
});
|
||||
|
||||
let mut pending_hunks_cursor = self.pending_hunks.cursor::<DiffHunkSummary>(buffer);
|
||||
pending_hunks_cursor.next(buffer);
|
||||
pending_hunks_cursor.next();
|
||||
|
||||
let mut secondary_cursor = None;
|
||||
if let Some(secondary) = secondary.as_ref() {
|
||||
let mut cursor = secondary.hunks.cursor::<DiffHunkSummary>(buffer);
|
||||
cursor.next(buffer);
|
||||
cursor.next();
|
||||
secondary_cursor = Some(cursor);
|
||||
}
|
||||
|
||||
|
@ -564,7 +562,7 @@ impl BufferDiffInner {
|
|||
.cmp(&pending_hunks_cursor.start().buffer_range.start, buffer)
|
||||
.is_gt()
|
||||
{
|
||||
pending_hunks_cursor.seek_forward(&start_anchor, Bias::Left, buffer);
|
||||
pending_hunks_cursor.seek_forward(&start_anchor, Bias::Left);
|
||||
}
|
||||
|
||||
if let Some(pending_hunk) = pending_hunks_cursor.item() {
|
||||
|
@ -590,7 +588,7 @@ impl BufferDiffInner {
|
|||
.cmp(&secondary_cursor.start().buffer_range.start, buffer)
|
||||
.is_gt()
|
||||
{
|
||||
secondary_cursor.seek_forward(&start_anchor, Bias::Left, buffer);
|
||||
secondary_cursor.seek_forward(&start_anchor, Bias::Left);
|
||||
}
|
||||
|
||||
if let Some(secondary_hunk) = secondary_cursor.item() {
|
||||
|
@ -635,7 +633,7 @@ impl BufferDiffInner {
|
|||
});
|
||||
|
||||
iter::from_fn(move || {
|
||||
cursor.prev(buffer);
|
||||
cursor.prev();
|
||||
|
||||
let hunk = cursor.item()?;
|
||||
let range = hunk.buffer_range.to_point(buffer);
|
||||
|
@ -653,8 +651,8 @@ impl BufferDiffInner {
|
|||
fn compare(&self, old: &Self, new_snapshot: &text::BufferSnapshot) -> Option<Range<Anchor>> {
|
||||
let mut new_cursor = self.hunks.cursor::<()>(new_snapshot);
|
||||
let mut old_cursor = old.hunks.cursor::<()>(new_snapshot);
|
||||
old_cursor.next(new_snapshot);
|
||||
new_cursor.next(new_snapshot);
|
||||
old_cursor.next();
|
||||
new_cursor.next();
|
||||
let mut start = None;
|
||||
let mut end = None;
|
||||
|
||||
|
@ -669,7 +667,7 @@ impl BufferDiffInner {
|
|||
Ordering::Less => {
|
||||
start.get_or_insert(new_hunk.buffer_range.start);
|
||||
end.replace(new_hunk.buffer_range.end);
|
||||
new_cursor.next(new_snapshot);
|
||||
new_cursor.next();
|
||||
}
|
||||
Ordering::Equal => {
|
||||
if new_hunk != old_hunk {
|
||||
|
@ -686,25 +684,25 @@ impl BufferDiffInner {
|
|||
}
|
||||
}
|
||||
|
||||
new_cursor.next(new_snapshot);
|
||||
old_cursor.next(new_snapshot);
|
||||
new_cursor.next();
|
||||
old_cursor.next();
|
||||
}
|
||||
Ordering::Greater => {
|
||||
start.get_or_insert(old_hunk.buffer_range.start);
|
||||
end.replace(old_hunk.buffer_range.end);
|
||||
old_cursor.next(new_snapshot);
|
||||
old_cursor.next();
|
||||
}
|
||||
}
|
||||
}
|
||||
(Some(new_hunk), None) => {
|
||||
start.get_or_insert(new_hunk.buffer_range.start);
|
||||
end.replace(new_hunk.buffer_range.end);
|
||||
new_cursor.next(new_snapshot);
|
||||
new_cursor.next();
|
||||
}
|
||||
(None, Some(old_hunk)) => {
|
||||
start.get_or_insert(old_hunk.buffer_range.start);
|
||||
end.replace(old_hunk.buffer_range.end);
|
||||
old_cursor.next(new_snapshot);
|
||||
old_cursor.next();
|
||||
}
|
||||
(None, None) => break,
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue