WIP

Antonio Scandurra created

Change summary

crates/editor/src/display_map/block_map.rs | 193 +++++++----------------
1 file changed, 63 insertions(+), 130 deletions(-)

Detailed changes

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

@@ -142,7 +142,9 @@ impl BlockMap {
 
         for edit in edits {
             let old_start = WrapPoint::new(edit.old.start, 0);
-            new_transforms.push_tree(cursor.slice(&old_start, Bias::Left, &()), &());
+            if old_start > *cursor.start() {
+                new_transforms.push_tree(cursor.slice(&old_start, Bias::Left, &()), &());
+            }
 
             let overshoot = old_start.0 - cursor.start().0;
             if !overshoot.is_zero() {
@@ -151,138 +153,69 @@ impl BlockMap {
 
             let old_end = WrapPoint::new(edit.old.end, 0);
             cursor.seek(&old_end, Bias::Left, &());
+            cursor.next(&());
+
+            let start_anchor = buffer.anchor_before(Point::new(edit.new.start, 0));
+            let start_block_ix = match self.blocks[last_block_ix..].binary_search_by(|probe| {
+                probe
+                    .position
+                    .cmp(&start_anchor, buffer)
+                    .unwrap()
+                    .then(Ordering::Greater)
+            }) {
+                Ok(ix) | Err(ix) => last_block_ix + ix,
+            };
+            let end_block_ix = if edit.new.end > wrap_snapshot.max_point().row() {
+                self.blocks.len()
+            } else {
+                let end_anchor = buffer.anchor_before(Point::new(edit.new.end, 0));
+                match self.blocks[start_block_ix..].binary_search_by(|probe| {
+                    probe
+                        .position
+                        .cmp(&end_anchor, buffer)
+                        .unwrap()
+                        .then(Ordering::Greater)
+                }) {
+                    Ok(ix) | Err(ix) => start_block_ix + ix,
+                }
+            };
+            last_block_ix = end_block_ix;
+
+            blocks_in_edit.clear();
+            blocks_in_edit.extend(
+                self.blocks[start_block_ix..end_block_ix]
+                    .iter()
+                    .map(|block| (block.position.to_point(buffer).row, block)),
+            );
+            blocks_in_edit.sort_unstable_by_key(|(row, block)| (*row, block.disposition, block.id));
+
+            for (block_row, block) in blocks_in_edit.iter().copied() {
+                let new_transforms_end = new_transforms.summary().input;
+                if block.disposition.is_above() {
+                    if block_row > new_transforms_end.row {
+                        new_transforms.push(
+                            Transform::isomorphic(Point::new(block_row, 0) - new_transforms_end),
+                            &(),
+                        );
+                    }
+                } else {
+                    if block_row >= new_transforms_end.row {
+                        new_transforms.push(
+                            Transform::isomorphic(
+                                Point::new(block_row, wrap_snapshot.line_len(block_row))
+                                    - new_transforms_end,
+                            ),
+                            &(),
+                        );
+                    }
+                }
+
+                new_transforms.push(Transform::block(block.clone()), &());
+            }
         }
 
-        // while let Some(mut edit) = edits.next() {
-        //     new_transforms.push_tree(
-        //         cursor.slice(&WrapPoint::new(edit.old.start, 0), Bias::Left, &()),
-        //         &(),
-        //     );
-
-        //     let mut transform_start_row = cursor.start().row();
-        //     if cursor.prev_item().map_or(false, |t| {
-        //         t.block_disposition() == Some(BlockDisposition::Below)
-        //     }) {
-        //         transform_start_row += 1;
-        //     }
-        //     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
-        //                     {
-        //                         edit_follows_below_block = true;
-        //                     } else {
-        //                         edit_follows_below_block = false;
-        //                         cursor.next(&());
-        //                     }
-        //                 } else {
-        //                     edit_follows_below_block = false;
-        //                     cursor.next(&());
-        //                 }
-        //             }
-
-        //             let transform_end_row = cursor.start().row() + 1;
-        //             cursor.seek(&WrapPoint::new(transform_end_row, 0), Bias::Left, &());
-        //             edit.new.end += transform_end_row - edit.old.end;
-        //             edit.old.end = transform_end_row;
-        //         }
-
-        //         if let Some(next_edit) = edits.peek() {
-        //             if edit.old.end >= next_edit.old.start {
-        //                 let delta = next_edit.new.len() as i32 - next_edit.old.len() as i32;
-        //                 edit.old.end = cmp::max(next_edit.old.end, edit.old.end);
-        //                 edit.new.end = (edit.new.end as i32 + delta) as u32;
-        //                 edits.next();
-        //             } else {
-        //                 break;
-        //             }
-        //         } else {
-        //             break;
-        //         }
-        //     }
-
-        //     dbg!("expanded edit", &edit);
-        //     let start_anchor = buffer.anchor_before(Point::new(edit.new.start, 0));
-        //     let start_block_ix = match self.blocks[last_block_ix..].binary_search_by(|probe| {
-        //         probe
-        //             .position
-        //             .cmp(&start_anchor, buffer)
-        //             .unwrap()
-        //             .then(Ordering::Greater)
-        //     }) {
-        //         Ok(ix) | Err(ix) => last_block_ix + ix,
-        //     };
-        //     let end_block_ix = if edit.new.end > wrap_snapshot.max_point().row() {
-        //         self.blocks.len()
-        //     } else {
-        //         let end_anchor = buffer.anchor_before(Point::new(edit.new.end, 0));
-        //         match self.blocks[start_block_ix..].binary_search_by(|probe| {
-        //             probe
-        //                 .position
-        //                 .cmp(&end_anchor, buffer)
-        //                 .unwrap()
-        //                 .then(Ordering::Greater)
-        //         }) {
-        //             Ok(ix) | Err(ix) => start_block_ix + ix,
-        //         }
-        //     };
-        //     last_block_ix = end_block_ix;
-
-        //     blocks_in_edit.clear();
-        //     blocks_in_edit.extend(
-        //         self.blocks[start_block_ix..end_block_ix]
-        //             .iter()
-        //             .map(|block| (block.position.to_point(buffer).row, block)),
-        //     );
-        //     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;
-        //         if block.disposition.is_above() {
-        //             if block_row > new_transforms_end.row {
-        //                 new_transforms.push(
-        //                     Transform::isomorphic(Point::new(block_row, 0) - new_transforms_end),
-        //                     &(),
-        //                 );
-        //             }
-        //         } else {
-        //             if block_row >= new_transforms_end.row {
-        //                 new_transforms.push(
-        //                     Transform::isomorphic(
-        //                         Point::new(block_row, wrap_snapshot.line_len(block_row))
-        //                             - new_transforms_end,
-        //                     ),
-        //                     &(),
-        //                 );
-        //             }
-        //         }
-
-        //         new_transforms.push(Transform::block(block.clone()), &());
-        //     }
-
-        //     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(&()), &());
+
         drop(cursor);
         *transforms = new_transforms;
     }