mirror of
https://github.com/zed-industries/zed.git
synced 2025-02-10 04:09:37 +00:00
Don't report edits in Buffer::undo_or_redo
We will report them in public higher-level methods like `Buffer::undo` and `Buffer::redo`.
This commit is contained in:
parent
bf3a5d0a0d
commit
cba8730d5a
1 changed files with 28 additions and 45 deletions
|
@ -931,13 +931,7 @@ impl Buffer {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn undo_or_redo(
|
fn undo_or_redo(&mut self, edit_id: time::Local) -> Result<Operation> {
|
||||||
&mut self,
|
|
||||||
edit_id: time::Local,
|
|
||||||
ctx: Option<&mut ModelContext<Self>>,
|
|
||||||
) -> Result<Operation> {
|
|
||||||
let was_dirty = self.is_dirty();
|
|
||||||
let old_version = self.version.clone();
|
|
||||||
let undo = UndoOperation {
|
let undo = UndoOperation {
|
||||||
id: self.local_clock.tick(),
|
id: self.local_clock.tick(),
|
||||||
edit_id,
|
edit_id,
|
||||||
|
@ -946,14 +940,6 @@ impl Buffer {
|
||||||
self.apply_undo(undo)?;
|
self.apply_undo(undo)?;
|
||||||
self.version.observe(undo.id);
|
self.version.observe(undo.id);
|
||||||
|
|
||||||
if let Some(ctx) = ctx {
|
|
||||||
ctx.notify();
|
|
||||||
let changes = self.edits_since(old_version).collect::<Vec<_>>();
|
|
||||||
if !changes.is_empty() {
|
|
||||||
self.did_edit(changes, was_dirty, ctx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(Operation::Undo {
|
Ok(Operation::Undo {
|
||||||
undo,
|
undo,
|
||||||
lamport_timestamp: self.lamport_clock.tick(),
|
lamport_timestamp: self.lamport_clock.tick(),
|
||||||
|
@ -2281,7 +2267,7 @@ mod tests {
|
||||||
assert_eq!(buffer.text(), reference_string);
|
assert_eq!(buffer.text(), reference_string);
|
||||||
|
|
||||||
if rng.gen_bool(0.25) {
|
if rng.gen_bool(0.25) {
|
||||||
buffer.randomly_undo_redo(rng, None);
|
buffer.randomly_undo_redo(rng);
|
||||||
reference_string = buffer.text();
|
reference_string = buffer.text();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2817,32 +2803,33 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_undo_redo() -> Result<()> {
|
fn test_undo_redo() -> Result<()> {
|
||||||
let mut buffer = Buffer::new(0, "");
|
let mut buffer = Buffer::new(0, "1234");
|
||||||
|
|
||||||
let edit1 = buffer.edit(vec![0..0], "abx", None)?;
|
let edit1 = buffer.edit(vec![1..1], "abx", None)?;
|
||||||
let edit2 = buffer.edit(vec![2..3], "yzef", None)?;
|
let edit2 = buffer.edit(vec![3..4], "yzef", None)?;
|
||||||
let edit3 = buffer.edit(vec![2..4], "cd", None)?;
|
let edit3 = buffer.edit(vec![3..5], "cd", None)?;
|
||||||
|
assert_eq!(buffer.text(), "1abcdef234");
|
||||||
|
|
||||||
buffer.undo_or_redo(edit1[0].edit_id().unwrap(), None)?;
|
buffer.undo_or_redo(edit1[0].edit_id().unwrap())?;
|
||||||
assert_eq!(buffer.text(), "cdef");
|
assert_eq!(buffer.text(), "1cdef234");
|
||||||
buffer.undo_or_redo(edit1[0].edit_id().unwrap(), None)?;
|
buffer.undo_or_redo(edit1[0].edit_id().unwrap())?;
|
||||||
assert_eq!(buffer.text(), "abcdef");
|
assert_eq!(buffer.text(), "1abcdef234");
|
||||||
|
|
||||||
buffer.undo_or_redo(edit2[0].edit_id().unwrap(), None)?;
|
buffer.undo_or_redo(edit2[0].edit_id().unwrap())?;
|
||||||
assert_eq!(buffer.text(), "abcdx");
|
assert_eq!(buffer.text(), "1abcdx234");
|
||||||
buffer.undo_or_redo(edit3[0].edit_id().unwrap(), None)?;
|
buffer.undo_or_redo(edit3[0].edit_id().unwrap())?;
|
||||||
assert_eq!(buffer.text(), "abx");
|
assert_eq!(buffer.text(), "1abx234");
|
||||||
buffer.undo_or_redo(edit2[0].edit_id().unwrap(), None)?;
|
buffer.undo_or_redo(edit2[0].edit_id().unwrap())?;
|
||||||
assert_eq!(buffer.text(), "abyzef");
|
assert_eq!(buffer.text(), "1abyzef234");
|
||||||
buffer.undo_or_redo(edit3[0].edit_id().unwrap(), None)?;
|
buffer.undo_or_redo(edit3[0].edit_id().unwrap())?;
|
||||||
assert_eq!(buffer.text(), "abcdef");
|
assert_eq!(buffer.text(), "1abcdef234");
|
||||||
|
|
||||||
buffer.undo_or_redo(edit3[0].edit_id().unwrap(), None)?;
|
buffer.undo_or_redo(edit3[0].edit_id().unwrap())?;
|
||||||
assert_eq!(buffer.text(), "abyzef");
|
assert_eq!(buffer.text(), "1abyzef234");
|
||||||
buffer.undo_or_redo(edit1[0].edit_id().unwrap(), None)?;
|
buffer.undo_or_redo(edit1[0].edit_id().unwrap())?;
|
||||||
assert_eq!(buffer.text(), "yzef");
|
assert_eq!(buffer.text(), "1yzef234");
|
||||||
buffer.undo_or_redo(edit2[0].edit_id().unwrap(), None)?;
|
buffer.undo_or_redo(edit2[0].edit_id().unwrap())?;
|
||||||
assert_eq!(buffer.text(), "");
|
assert_eq!(buffer.text(), "1234");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -2884,7 +2871,7 @@ mod tests {
|
||||||
mutation_count -= 1;
|
mutation_count -= 1;
|
||||||
}
|
}
|
||||||
51..=70 if mutation_count != 0 => {
|
51..=70 if mutation_count != 0 => {
|
||||||
let ops = buffer.randomly_undo_redo(&mut rng, None);
|
let ops = buffer.randomly_undo_redo(&mut rng);
|
||||||
network.broadcast(replica_id, ops, &mut rng);
|
network.broadcast(replica_id, ops, &mut rng);
|
||||||
mutation_count -= 1;
|
mutation_count -= 1;
|
||||||
}
|
}
|
||||||
|
@ -2960,15 +2947,11 @@ mod tests {
|
||||||
(old_ranges, new_text, operations)
|
(old_ranges, new_text, operations)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn randomly_undo_redo(
|
pub fn randomly_undo_redo(&mut self, rng: &mut impl Rng) -> Vec<Operation> {
|
||||||
&mut self,
|
|
||||||
rng: &mut impl Rng,
|
|
||||||
mut ctx: Option<&mut ModelContext<Self>>,
|
|
||||||
) -> Vec<Operation> {
|
|
||||||
let mut ops = Vec::new();
|
let mut ops = Vec::new();
|
||||||
for _ in 0..rng.gen_range(1..5) {
|
for _ in 0..rng.gen_range(1..5) {
|
||||||
if let Some(edit_id) = self.edit_ops.keys().choose(rng).copied() {
|
if let Some(edit_id) = self.edit_ops.keys().choose(rng).copied() {
|
||||||
ops.push(self.undo_or_redo(edit_id, ctx.as_deref_mut()).unwrap());
|
ops.push(self.undo_or_redo(edit_id).unwrap());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ops
|
ops
|
||||||
|
|
Loading…
Reference in a new issue