Get undo/redo tests passing

Max Brunsfeld created

Change summary

zed/src/editor/buffer.rs | 118 ++++++++++-------------------------------
1 file changed, 30 insertions(+), 88 deletions(-)

Detailed changes

zed/src/editor/buffer.rs 🔗

@@ -1346,44 +1346,55 @@ impl Buffer {
     }
 
     fn apply_undo(&mut self, undo: UndoOperation) -> Result<()> {
+        self.undo_map.insert(undo);
+        let edit = &self.history.ops[&undo.edit_id];
+        let version = Some(edit.version.clone());
+
         let mut old_fragments = self.fragments.cursor::<VersionedOffset, VersionedOffset>();
+        old_fragments.seek(&VersionedOffset::Offset(0), SeekBias::Left, &version);
 
         let mut new_fragments = SumTree::new();
         let mut new_ropes =
             RopeBuilder::new(self.visible_text.cursor(0), self.deleted_text.cursor(0));
 
-        self.undo_map.insert(undo);
-        let edit = &self.history.ops[&undo.edit_id];
+        let mut version_after_edit = edit.version.clone();
+        version_after_edit.observe(edit.id);
 
-        let version = Some(edit.version.clone());
         for range in &edit.ranges {
-            let preceding_fragments = old_fragments.slice(
-                &VersionedOffset::Offset(range.start),
-                SeekBias::Right,
-                &version,
-            );
-            new_ropes.push_tree(preceding_fragments.summary().text);
-            new_fragments.push_tree(preceding_fragments, &None);
+            let mut end_offset = old_fragments.end(&version).offset();
 
-            while old_fragments.end(&version).offset() < range.end {
+            if end_offset < range.start {
+                let preceding_fragments = old_fragments.slice(
+                    &VersionedOffset::Offset(range.start),
+                    SeekBias::Left,
+                    &version,
+                );
+                new_ropes.push_tree(preceding_fragments.summary().text);
+                new_fragments.push_tree(preceding_fragments, &None);
+            }
+
+            while end_offset <= range.end {
                 if let Some(fragment) = old_fragments.item() {
                     let mut fragment = fragment.clone();
                     let fragment_was_visible = fragment.visible;
-                    if edit.version.observed(fragment.insertion_id) {
+                    if version_after_edit.observed(fragment.insertion_id) {
                         fragment.visible = fragment.is_visible(&self.undo_map);
                         fragment.max_undos.observe(undo.id);
                     }
                     new_ropes.push_fragment(&fragment, fragment_was_visible);
                     new_fragments.push(fragment, &None);
 
+                    old_fragments.next(&version);
+                    end_offset = old_fragments.end(&version).offset();
+
                     // Skip over any fragments that were not present when the edit occurred.
-                    let newer_fragments = old_fragments.slice(
-                        &old_fragments.end(&version),
-                        SeekBias::Right,
-                        &version,
-                    );
-                    new_ropes.push_tree(newer_fragments.summary().text);
-                    new_fragments.push_tree(newer_fragments, &None);
+                    // let newer_fragments = old_fragments.slice(
+                    //     &old_fragments.end(&version),
+                    //     SeekBias::Right,
+                    //     &version,
+                    // );
+                    // new_ropes.push_tree(newer_fragments.summary().text);
+                    // new_fragments.push_tree(newer_fragments, &None);
                 } else {
                     break;
                 }
@@ -1399,73 +1410,6 @@ impl Buffer {
         self.fragments = new_fragments;
         self.visible_text = visible_text;
         self.deleted_text = deleted_text;
-
-        // if edit.start_id == edit.end_id && edit.start_offset == edit.end_offset {
-        //     let splits = &self.insertion_splits[&undo.edit_id];
-        //     let mut insertion_splits = splits.cursor::<(), ()>().map(|s| &s.fragment_id).peekable();
-
-        //     let first_split_id = insertion_splits.next().unwrap();
-        //     new_fragments =
-        //         fragments_cursor.slice(&FragmentIdRef::new(first_split_id), SeekBias::Left, &None);
-        //     new_ropes.push_tree(new_fragments.summary().text);
-
-        //     loop {
-        //         let mut fragment = fragments_cursor.item().unwrap().clone();
-        //         let was_visible = fragment.visible;
-        //         fragment.visible = fragment.is_visible(&self.undo_map);
-        //         fragment.max_undos.observe(undo.id);
-
-        //         new_ropes.push_fragment(&fragment, was_visible);
-        //         new_fragments.push(fragment.clone(), &None);
-
-        //         fragments_cursor.next(&None);
-        //         if let Some(split_id) = insertion_splits.next() {
-        //             let slice = fragments_cursor.slice(
-        //                 &FragmentIdRef::new(split_id),
-        //                 SeekBias::Left,
-        //                 &None,
-        //             );
-        //             new_ropes.push_tree(slice.summary().text);
-        //             new_fragments.push_tree(slice, &None);
-        //         } else {
-        //             break;
-        //         }
-        //     }
-        // } else {
-        //     new_fragments = fragments_cursor.slice(
-        //         &FragmentIdRef::new(&edit.),
-        //         SeekBias::Left,
-        //         &None,
-        //     );
-        //     new_ropes.push_tree(new_fragments.summary().text);
-
-        //     while let Some(fragment) = fragments_cursor.item() {
-        //         if fragment.id > end_fragment_id {
-        //             break;
-        //         } else {
-        //             let mut fragment = fragment.clone();
-        //             let fragment_was_visible = fragment.visible;
-        //             if edit.version_in_range.observed(fragment.insertion.id)
-        //                 || fragment.insertion.id == undo.edit_id
-        //             {
-        //                 fragment.visible = fragment.is_visible(&self.undo_map);
-        //                 fragment.max_undos.observe(undo.id);
-        //             }
-
-        //             new_ropes.push_fragment(&fragment, fragment_was_visible);
-        //             new_fragments.push(fragment, &None);
-        //             fragments_cursor.next(&None);
-        //         }
-        //     }
-        // }
-
-        // new_fragments.push_tree(fragments_cursor.suffix(&None), &None);
-        // let (visible_text, deleted_text) = new_ropes.finish();
-        // drop(fragments_cursor);
-        // self.fragments = new_fragments;
-        // self.visible_text = visible_text;
-        // self.deleted_text = deleted_text;
-
         Ok(())
     }
 
@@ -2259,8 +2203,6 @@ impl<'a> sum_tree::Dimension<'a, FragmentSummary> for VersionedOffset {
             {
                 *self = Self::InvalidVersion;
             }
-        } else {
-            unreachable!();
         }
     }
 }