Correctly store current chunk offset in `fold_map::HighlightedChunks`

Antonio Scandurra created

Change summary

zed/src/editor/display_map/fold_map.rs | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)

Detailed changes

zed/src/editor/display_map/fold_map.rs 🔗

@@ -741,7 +741,7 @@ impl<'a> Iterator for Chunks<'a> {
 pub struct HighlightedChunks<'a> {
     transform_cursor: Cursor<'a, Transform, DisplayOffset, TransformSummary>,
     buffer_chunks: buffer::HighlightedChunks<'a>,
-    buffer_chunk: Option<(&'a str, Option<usize>)>,
+    buffer_chunk: Option<(usize, &'a str, Option<usize>)>,
     buffer_offset: usize,
 }
 
@@ -771,14 +771,18 @@ impl<'a> Iterator for HighlightedChunks<'a> {
             return Some((display_text, None));
         }
 
-        // Retrieve a chunk from the current buffer cursor's location.
+        // Retrieve a chunk from the current location in the buffer.
         if self.buffer_chunk.is_none() {
-            self.buffer_chunk = self.buffer_chunks.next();
+            let chunk_offset = self.buffer_chunks.offset();
+            self.buffer_chunk = self
+                .buffer_chunks
+                .next()
+                .map(|(chunk, capture_ix)| (chunk_offset, chunk, capture_ix));
         }
 
         // Otherwise, take a chunk from the buffer's text.
-        if let Some((mut chunk, capture_ix)) = self.buffer_chunk {
-            let offset_in_chunk = self.buffer_offset - self.buffer_chunks.offset();
+        if let Some((chunk_offset, mut chunk, capture_ix)) = self.buffer_chunk {
+            let offset_in_chunk = self.buffer_offset - chunk_offset;
             chunk = &chunk[offset_in_chunk..];
 
             // Truncate the chunk so that it ends at the next fold.