From c0bf4a5bfd09911ee51eb67557b5b5c2562b40ed Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 18 May 2022 10:13:18 +0200 Subject: [PATCH] Bump FoldSnapshot version if excerpt gets edited outside of its bounds This will cause layers above `FoldMap` to grab a fresh snapshot of the `FoldMap` and, as a result, of the underlying `MultiBufferSnapshot`. It is a necessary change because, even though the coordinate space is not affected, a buffer edit taking place *before* an excerpt range could cause the excerpt buffer rows to change, e.g. if lines were added or removed. This manifested itself in a randomized test. --- crates/editor/src/display_map/fold_map.rs | 3 ++- crates/editor/src/multi_buffer.rs | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/editor/src/display_map/fold_map.rs b/crates/editor/src/display_map/fold_map.rs index 8fa107a8b5..3f9be8ad2d 100644 --- a/crates/editor/src/display_map/fold_map.rs +++ b/crates/editor/src/display_map/fold_map.rs @@ -271,7 +271,8 @@ impl FoldMap { ) -> Vec { if buffer_edits.is_empty() { let mut buffer = self.buffer.lock(); - if buffer.parse_count() != new_buffer.parse_count() + if buffer.edit_count() != new_buffer.edit_count() + || buffer.parse_count() != new_buffer.parse_count() || buffer.diagnostics_update_count() != new_buffer.diagnostics_update_count() || buffer.trailing_excerpt_update_count() != new_buffer.trailing_excerpt_update_count() diff --git a/crates/editor/src/multi_buffer.rs b/crates/editor/src/multi_buffer.rs index a8e3363cac..c679615948 100644 --- a/crates/editor/src/multi_buffer.rs +++ b/crates/editor/src/multi_buffer.rs @@ -93,6 +93,7 @@ pub struct MultiBufferSnapshot { parse_count: usize, diagnostics_update_count: usize, trailing_excerpt_update_count: usize, + edit_count: usize, is_dirty: bool, has_conflict: bool, } @@ -1151,6 +1152,7 @@ impl MultiBuffer { let mut diagnostics_updated = false; let mut is_dirty = false; let mut has_conflict = false; + let mut edited = false; let mut buffers = self.buffers.borrow_mut(); for buffer_state in buffers.values_mut() { let buffer = buffer_state.buffer.read(cx); @@ -1186,11 +1188,15 @@ impl MultiBuffer { ); } + edited |= buffer_edited; reparsed |= buffer_reparsed; diagnostics_updated |= buffer_diagnostics_updated; is_dirty |= buffer.is_dirty(); has_conflict |= buffer.has_conflict(); } + if edited { + snapshot.edit_count += 1; + } if reparsed { snapshot.parse_count += 1; } @@ -2172,6 +2178,10 @@ impl MultiBufferSnapshot { }) } + pub fn edit_count(&self) -> usize { + self.edit_count + } + pub fn parse_count(&self) -> usize { self.parse_count }