Propagate wrap edits to block map when folding / unfolding

Max Brunsfeld and Nathan Sobo created

Co-Authored-By: Nathan Sobo <nathan@zed.dev>

Change summary

crates/editor/src/display_map.rs           | 16 ++++++++++++----
crates/editor/src/display_map/block_map.rs |  8 ++++----
2 files changed, 16 insertions(+), 8 deletions(-)

Detailed changes

crates/editor/src/display_map.rs 🔗

@@ -80,12 +80,16 @@ impl DisplayMap {
     ) {
         let (mut fold_map, snapshot, edits) = self.fold_map.write(cx);
         let (snapshot, edits) = self.tab_map.sync(snapshot, edits);
-        self.wrap_map
+        let (snapshot, edits) = self
+            .wrap_map
             .update(cx, |map, cx| map.sync(snapshot, edits, cx));
+        self.block_map.sync(&snapshot, edits, cx);
         let (snapshot, edits) = fold_map.fold(ranges, cx);
         let (snapshot, edits) = self.tab_map.sync(snapshot, edits);
-        self.wrap_map
+        let (snapshot, edits) = self
+            .wrap_map
             .update(cx, |map, cx| map.sync(snapshot, edits, cx));
+        self.block_map.sync(&snapshot, edits, cx);
     }
 
     pub fn unfold<T: ToOffset>(
@@ -95,12 +99,16 @@ impl DisplayMap {
     ) {
         let (mut fold_map, snapshot, edits) = self.fold_map.write(cx);
         let (snapshot, edits) = self.tab_map.sync(snapshot, edits);
-        self.wrap_map
+        let (snapshot, edits) = self
+            .wrap_map
             .update(cx, |map, cx| map.sync(snapshot, edits, cx));
+        self.block_map.sync(&snapshot, edits, cx);
         let (snapshot, edits) = fold_map.unfold(ranges, cx);
         let (snapshot, edits) = self.tab_map.sync(snapshot, edits);
-        self.wrap_map
+        let (snapshot, edits) = self
+            .wrap_map
             .update(cx, |map, cx| map.sync(snapshot, edits, cx));
+        self.block_map.sync(&snapshot, edits, cx);
     }
 
     pub fn insert_blocks<P, T>(

crates/editor/src/display_map/block_map.rs 🔗

@@ -113,7 +113,7 @@ impl BlockMap {
         edits: Vec<WrapEdit>,
         cx: &AppContext,
     ) -> BlockSnapshot {
-        self.apply_edits(&wrap_snapshot, edits, cx);
+        self.sync(&wrap_snapshot, edits, cx);
         *self.wrap_snapshot.lock() = wrap_snapshot.clone();
         BlockSnapshot {
             wrap_snapshot,
@@ -127,12 +127,12 @@ impl BlockMap {
         edits: Vec<WrapEdit>,
         cx: &AppContext,
     ) -> BlockMapWriter {
-        self.apply_edits(&wrap_snapshot, edits, cx);
+        self.sync(&wrap_snapshot, edits, cx);
         *self.wrap_snapshot.lock() = wrap_snapshot;
         BlockMapWriter(self)
     }
 
-    fn apply_edits(&self, wrap_snapshot: &WrapSnapshot, edits: Vec<WrapEdit>, cx: &AppContext) {
+    pub fn sync(&self, wrap_snapshot: &WrapSnapshot, edits: Vec<WrapEdit>, cx: &AppContext) {
         if edits.is_empty() {
             return;
         }
@@ -356,7 +356,7 @@ impl<'a> BlockMapWriter<'a> {
             }
         }
 
-        self.0.apply_edits(&*self.0.wrap_snapshot.lock(), edits, cx);
+        self.0.sync(&*self.0.wrap_snapshot.lock(), edits, cx);
         ids
     }