WIP

Antonio Scandurra created

Change summary

crates/buffer/src/random_char_iter.rs      |  16 +-
crates/editor/src/display_map/block_map.rs | 104 ++++++++++++-----------
2 files changed, 63 insertions(+), 57 deletions(-)

Detailed changes

crates/buffer/src/random_char_iter.rs 🔗

@@ -14,14 +14,14 @@ impl<T: Rng> Iterator for RandomCharIter<T> {
     fn next(&mut self) -> Option<Self::Item> {
         match self.0.gen_range(0..100) {
             // whitespace
-            0..=19 => [' ', '\n', '\t'].choose(&mut self.0).copied(),
-            // two-byte greek letters
-            20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))),
-            // three-byte characters
-            33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(),
-            // four-byte characters
-            46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(),
-            // ascii letters
+            0..=4 => ['\n'].choose(&mut self.0).copied(),
+            // // two-byte greek letters
+            // 20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))),
+            // // three-byte characters
+            // 33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(),
+            // // four-byte characters
+            // 46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(),
+            // // ascii letters
             _ => Some(self.0.gen_range(b'a'..b'z' + 1).into()),
         }
     }

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

@@ -156,18 +156,24 @@ impl BlockMap {
             dbg!("collapsed edit", &edit);
             edit.new.start -= edit.old.start - transform_start_row;
             edit.old.start = transform_start_row;
+            let mut edit_follows_below_block = false;
 
             loop {
                 if edit.old.end > cursor.start().0.row {
                     cursor.seek(&WrapPoint::new(edit.old.end, 0), Bias::Left, &());
+                    // dbg!(cursor.start(), cursor.item());
                     if cursor.item().map_or(false, |t| t.is_isomorphic()) {
                         if let Some(prev_transform) = cursor.prev_item() {
-                            if prev_transform.block_disposition() != Some(BlockDisposition::Below)
-                                || edit.old.end > cursor.start().row() + 1
+                            if prev_transform.block_disposition() == Some(BlockDisposition::Below)
+                                && edit.old.end == cursor.start().row() + 1
                             {
+                                edit_follows_below_block = true;
+                            } else {
+                                edit_follows_below_block = false;
                                 cursor.next(&());
                             }
                         } else {
+                            edit_follows_below_block = false;
                             cursor.next(&());
                         }
                     }
@@ -225,8 +231,8 @@ impl BlockMap {
                     .iter()
                     .map(|block| (block.position.to_point(buffer).row, block)),
             );
-            blocks_in_edit.sort_unstable_by_key(|(row, block)| (*row, block.disposition));
-            dbg!(&blocks_in_edit);
+            blocks_in_edit.sort_unstable_by_key(|(row, block)| (*row, block.disposition, block.id));
+            // dbg!(&blocks_in_edit);
 
             for (block_row, block) in blocks_in_edit.iter().copied() {
                 let new_transforms_end = new_transforms.summary().input;
@@ -252,14 +258,16 @@ impl BlockMap {
                 new_transforms.push(Transform::block(block.clone()), &());
             }
 
-            let new_transforms_end = new_transforms.summary().input;
-            let edit_new_end_point =
-                cmp::min(Point::new(edit.new.end, 0), wrap_snapshot.max_point().0);
-            if new_transforms_end < edit_new_end_point {
-                new_transforms.push(
-                    Transform::isomorphic(edit_new_end_point - new_transforms_end),
-                    &(),
-                );
+            if !edit_follows_below_block {
+                let new_transforms_end = new_transforms.summary().input;
+                let edit_new_end_point =
+                    cmp::min(Point::new(edit.new.end, 0), wrap_snapshot.max_point().0);
+                if new_transforms_end < edit_new_end_point {
+                    new_transforms.push(
+                        Transform::isomorphic(edit_new_end_point - new_transforms_end),
+                        &(),
+                    );
+                }
             }
         }
         new_transforms.push_tree(cursor.suffix(&()), &());
@@ -309,13 +317,11 @@ impl<'a> BlockMapWriter<'a> {
             let position = buffer.anchor_before(block.position);
             let row = position.to_point(buffer).row;
 
-            let block_ix = match self.0.blocks.binary_search_by(|probe| {
-                probe
-                    .position
-                    .cmp(&position, buffer)
-                    .unwrap()
-                    .then_with(|| probe.id.cmp(&id))
-            }) {
+            let block_ix = match self
+                .0
+                .blocks
+                .binary_search_by(|probe| probe.position.cmp(&position, buffer).unwrap())
+            {
                 Ok(ix) | Err(ix) => ix,
             };
             let mut text = block.text.into();
@@ -741,7 +747,7 @@ mod tests {
             .map(|i| i.parse().expect("invalid `OPERATIONS` variable"))
             .unwrap_or(10);
 
-        let wrap_width = Some(rng.gen_range(0.0..=1000.0));
+        let wrap_width = None;
         let tab_size = 1;
         let family_id = cx.font_cache().load_family(&["Helvetica"]).unwrap();
         let font_id = cx
@@ -767,17 +773,17 @@ mod tests {
 
         for _ in 0..operations {
             match rng.gen_range(0..=100) {
-                0..=19 => {
-                    let wrap_width = if rng.gen_bool(0.2) {
-                        None
-                    } else {
-                        Some(rng.gen_range(0.0..=1000.0))
-                    };
-                    log::info!("Setting wrap width to {:?}", wrap_width);
-                    wrap_map.update(cx, |map, cx| map.set_wrap_width(wrap_width, cx));
-                }
+                // 0..=19 => {
+                //     let wrap_width = if rng.gen_bool(0.2) {
+                //         None
+                //     } else {
+                //         Some(rng.gen_range(0.0..=1000.0))
+                //     };
+                //     log::info!("Setting wrap width to {:?}", wrap_width);
+                //     wrap_map.update(cx, |map, cx| map.set_wrap_width(wrap_width, cx));
+                // }
                 20..=39 => {
-                    let block_count = rng.gen_range(1..=4);
+                    let block_count = rng.gen_range(1..=1);
                     let block_properties = (0..block_count)
                         .map(|_| {
                             let buffer = buffer.read(cx);
@@ -821,24 +827,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);
@@ -853,11 +859,11 @@ mod tests {
                 wrap_map.sync(tabs_snapshot, tab_edits, cx)
             });
             let mut blocks_snapshot = block_map.read(wraps_snapshot.clone(), wrap_edits, cx);
-            log::info!("blocks text: {:?}", blocks_snapshot.text());
             assert_eq!(
                 blocks_snapshot.transforms.summary().input,
                 wraps_snapshot.max_point().0
             );
+            log::info!("blocks text: {:?}", blocks_snapshot.text());
 
             let buffer = buffer.read(cx);
             let mut sorted_blocks = expected_blocks