multi_buffer: Remap excerpt ids to latest excerpt in excerpt fetching (#44229)

Closes #ISSUE

Release Notes:

- N/A *or* Added/Fixed/Improved ...

Co-authored by: Cole Miller <cole@zed.dev>
This commit is contained in:
Lukas Wirth
2025-12-05 18:20:29 +00:00
committed by GitHub
parent d76dd86272
commit 37b0cdf94b
3 changed files with 16 additions and 7 deletions
+12 -4
View File
@@ -419,22 +419,30 @@ impl SelectionsCollection {
mutable_collection.disjoint.iter().for_each(|selection| {
assert!(
snapshot.can_resolve(&selection.start),
"disjoint selection start is not resolvable for the given snapshot:\n{selection:?}",
"disjoint selection start is not resolvable for the given snapshot:\n{selection:?}, {excerpt:?}",
excerpt = snapshot.buffer_for_excerpt(selection.start.excerpt_id).map(|snapshot| snapshot.remote_id()),
);
assert!(
snapshot.can_resolve(&selection.end),
"disjoint selection end is not resolvable for the given snapshot: {selection:?}",
"disjoint selection end is not resolvable for the given snapshot: {selection:?}, {excerpt:?}",
excerpt = snapshot.buffer_for_excerpt(selection.end.excerpt_id).map(|snapshot| snapshot.remote_id()),
);
});
if let Some(pending) = &mutable_collection.pending {
let selection = &pending.selection;
assert!(
snapshot.can_resolve(&selection.start),
"pending selection start is not resolvable for the given snapshot: {pending:?}",
"pending selection start is not resolvable for the given snapshot: {pending:?}, {excerpt:?}",
excerpt = snapshot
.buffer_for_excerpt(selection.start.excerpt_id)
.map(|snapshot| snapshot.remote_id()),
);
assert!(
snapshot.can_resolve(&selection.end),
"pending selection end is not resolvable for the given snapshot: {pending:?}",
"pending selection end is not resolvable for the given snapshot: {pending:?}, {excerpt:?}",
excerpt = snapshot
.buffer_for_excerpt(selection.end.excerpt_id)
.map(|snapshot| snapshot.remote_id()),
);
}
}
+3 -2
View File
@@ -6457,12 +6457,13 @@ impl MultiBufferSnapshot {
}
/// Returns the excerpt for the given id. The returned excerpt is guaranteed
/// to have the same excerpt id as the one passed in, with the exception of
/// `ExcerptId::max()`.
/// to have the latest excerpt id for the one passed in and will also remap
/// `ExcerptId::max()` to the corresponding excertp ID.
///
/// Callers of this function should generally use the resulting excerpt's `id` field
/// afterwards.
fn excerpt(&self, excerpt_id: ExcerptId) -> Option<&Excerpt> {
let excerpt_id = self.latest_excerpt_id(excerpt_id);
let mut cursor = self.excerpts.cursor::<Option<&Locator>>(());
let locator = self.excerpt_locator_for_id(excerpt_id);
cursor.seek(&Some(locator), Bias::Left);
+1 -1
View File
@@ -305,7 +305,7 @@ impl MultiBuffer {
let snapshot = self.snapshot(cx);
let mut next_excerpt_id =
// is this right? What if we remove the last excerpt, then we might reallocate with a wrong mapping?
// todo(lw): is this right? What if we remove the last excerpt, then we might reallocate with a wrong mapping?
if let Some(last_entry) = self.snapshot.borrow().excerpt_ids.last() {
last_entry.id.0 + 1
} else {