Implement BlockMapWriter::remove

Nathan Sobo and Max Brunsfeld created

Co-Authored-By: Max Brunsfeld <maxbrunsfeld@gmail.com>

Change summary

crates/editor/src/display_map/block_map.rs | 69 +++++++++++++++++------
1 file changed, 49 insertions(+), 20 deletions(-)

Detailed changes

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

@@ -381,8 +381,37 @@ impl<'a> BlockMapWriter<'a> {
         ids
     }
 
-    pub fn remove(&mut self, _: HashSet<BlockId>, _: &AppContext) {
-        todo!()
+    pub fn remove(&mut self, block_ids: HashSet<BlockId>, cx: &AppContext) {
+        let buffer = self.0.buffer.read(cx);
+        let wrap_snapshot = &*self.0.wrap_snapshot.lock();
+        let mut edits = Vec::new();
+        let mut last_block_buffer_row = None;
+        self.0.blocks.retain(|block| {
+            if block_ids.contains(&block.id) {
+                let buffer_row = block.position.to_point(buffer).row;
+                if last_block_buffer_row != Some(buffer_row) {
+                    last_block_buffer_row = Some(buffer_row);
+                    let start_row = wrap_snapshot
+                        .from_point(Point::new(buffer_row, 0), Bias::Left)
+                        .row();
+                    let end_row = wrap_snapshot
+                        .from_point(
+                            Point::new(buffer_row, buffer.line_len(buffer_row)),
+                            Bias::Left,
+                        )
+                        .row()
+                        + 1;
+                    edits.push(Edit {
+                        old: start_row..end_row,
+                        new: start_row..end_row,
+                    })
+                }
+                false
+            } else {
+                true
+            }
+        });
+        self.0.sync(wrap_snapshot, edits, cx);
     }
 }
 
@@ -895,24 +924,24 @@ mod tests {
                         expected_blocks.push((block_id, props));
                     }
                 }
-                // 40..=59 if !expected_blocks.is_empty() => {
-                //     let block_count = rng.gen_range(1..=4.min(expected_blocks.len()));
-                //     let block_ids_to_remove = (0..block_count)
-                //         .map(|_| {
-                //             expected_blocks
-                //                 .remove(rng.gen_range(0..expected_blocks.len()))
-                //                 .0
-                //         })
-                //         .collect();
-
-                //     let (folds_snapshot, fold_edits) = fold_map.read(cx);
-                //     let (tabs_snapshot, tab_edits) = tab_map.sync(folds_snapshot, fold_edits);
-                //     let (wraps_snapshot, wrap_edits) = wrap_map.update(cx, |wrap_map, cx| {
-                //         wrap_map.sync(tabs_snapshot, tab_edits, cx)
-                //     });
-                //     let mut block_map = block_map.write(wraps_snapshot, wrap_edits, cx);
-                //     block_map.remove(block_ids_to_remove, cx);
-                // }
+                40..=59 if !expected_blocks.is_empty() => {
+                    let block_count = rng.gen_range(1..=4.min(expected_blocks.len()));
+                    let block_ids_to_remove = (0..block_count)
+                        .map(|_| {
+                            expected_blocks
+                                .remove(rng.gen_range(0..expected_blocks.len()))
+                                .0
+                        })
+                        .collect();
+
+                    let (folds_snapshot, fold_edits) = fold_map.read(cx);
+                    let (tabs_snapshot, tab_edits) = tab_map.sync(folds_snapshot, fold_edits);
+                    let (wraps_snapshot, wrap_edits) = wrap_map.update(cx, |wrap_map, cx| {
+                        wrap_map.sync(tabs_snapshot, tab_edits, cx)
+                    });
+                    let mut block_map = block_map.write(wraps_snapshot, wrap_edits, cx);
+                    block_map.remove(block_ids_to_remove, cx);
+                }
                 _ => {
                     buffer.update(cx, |buffer, _| {
                         buffer.randomly_edit(&mut rng, 1);