@@ -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()),
);
}
}
@@ -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);
@@ -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 {