Fix anchor comparison in multi buffer after expanding excerpts (#28828)

Release Notes:

- Fixed incorrect excerpt comparison when replacing them

Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
Co-authored-by: Conrad Irwin <conrad@zed.dev>
This commit is contained in:
Kirill Bulatov 2025-04-15 21:30:11 -06:00 committed by GitHub
parent b486e32f05
commit 41cffa64b0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 10 additions and 6 deletions

View file

@ -61,11 +61,14 @@ impl Anchor {
return Ordering::Equal; return Ordering::Equal;
} }
let excerpt_id_cmp = self.excerpt_id.cmp(&other.excerpt_id, snapshot); let self_excerpt_id = snapshot.latest_excerpt_id(self.excerpt_id);
let other_excerpt_id = snapshot.latest_excerpt_id(other.excerpt_id);
let excerpt_id_cmp = self_excerpt_id.cmp(&other_excerpt_id, snapshot);
if excerpt_id_cmp.is_ne() { if excerpt_id_cmp.is_ne() {
return excerpt_id_cmp; return excerpt_id_cmp;
} }
if self.excerpt_id == ExcerptId::min() || self.excerpt_id == ExcerptId::max() { if self_excerpt_id == ExcerptId::min() || self_excerpt_id == ExcerptId::max() {
return Ordering::Equal; return Ordering::Equal;
} }
if let Some(excerpt) = snapshot.excerpt(self.excerpt_id) { if let Some(excerpt) = snapshot.excerpt(self.excerpt_id) {

View file

@ -746,19 +746,20 @@ fn test_expand_excerpts(cx: &mut App) {
drop(snapshot); drop(snapshot);
multibuffer.update(cx, |multibuffer, cx| { multibuffer.update(cx, |multibuffer, cx| {
let line_zero = multibuffer.snapshot(cx).anchor_before(Point::new(0, 0));
multibuffer.expand_excerpts( multibuffer.expand_excerpts(
multibuffer.excerpt_ids(), multibuffer.excerpt_ids(),
1, 1,
ExpandExcerptDirection::UpAndDown, ExpandExcerptDirection::UpAndDown,
cx, cx,
) );
let snapshot = multibuffer.snapshot(cx);
let line_two = snapshot.anchor_before(Point::new(2, 0));
assert_eq!(line_two.cmp(&line_zero, &snapshot), cmp::Ordering::Greater);
}); });
let snapshot = multibuffer.read(cx).snapshot(cx); let snapshot = multibuffer.read(cx).snapshot(cx);
// Expanding context lines causes the line containing 'fff' to appear in two different excerpts.
// We don't attempt to merge them, because removing the excerpt could create inconsistency with other layers
// that are tracking excerpt ids.
assert_eq!( assert_eq!(
snapshot.text(), snapshot.text(),
concat!( concat!(