Clear redo stack when pushing remote transaction or ending a local one

Antonio Scandurra created

Change summary

crates/text/src/tests.rs | 10 ++++++++++
crates/text/src/text.rs  |  2 ++
2 files changed, 12 insertions(+)

Detailed changes

crates/text/src/tests.rs 🔗

@@ -529,6 +529,16 @@ fn test_history() {
     assert!(buffer.end_transaction_at(now).is_none());
     buffer.undo();
     assert_eq!(buffer.text(), "12cde6");
+
+    // Redo stack gets cleared after performing an edit.
+    buffer.edit([(0..0, "X")]);
+    assert_eq!(buffer.text(), "X12cde6");
+    buffer.redo();
+    assert_eq!(buffer.text(), "X12cde6");
+    buffer.undo();
+    assert_eq!(buffer.text(), "12cde6");
+    buffer.undo();
+    assert_eq!(buffer.text(), "123456");
 }
 
 #[test]

crates/text/src/text.rs 🔗

@@ -216,6 +216,7 @@ impl History {
                 self.undo_stack.pop();
                 None
             } else {
+                self.redo_stack.clear();
                 let entry = self.undo_stack.last_mut().unwrap();
                 entry.last_edit_at = now;
                 Some(entry)
@@ -276,6 +277,7 @@ impl History {
             last_edit_at: now,
             suppress_grouping: false,
         });
+        self.redo_stack.clear();
     }
 
     fn push_undo(&mut self, op_id: clock::Local) {