WIP - maintain foldmap with Buffer::edits_since

Co-Authored-By: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
Max Brunsfeld 2021-11-30 17:23:02 -08:00
parent 2463077b2d
commit faba276fdc
11 changed files with 279 additions and 163 deletions

View file

@ -107,12 +107,13 @@ pub enum Operation {
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Event {
Edited,
Edited(Patch<usize>),
Dirtied,
Saved,
FileHandleChanged,
Reloaded,
Reparsed,
DiagnosticsUpdated,
Closed,
}
@ -805,6 +806,7 @@ impl Buffer {
self.diagnostics_update_count += 1;
cx.notify();
cx.emit(Event::DiagnosticsUpdated);
Ok(Operation::UpdateDiagnostics(self.diagnostics.clone()))
}
@ -1316,14 +1318,16 @@ impl Buffer {
was_dirty: bool,
cx: &mut ModelContext<Self>,
) {
if self.edits_since::<usize>(old_version).next().is_none() {
let patch =
unsafe { Patch::new_unchecked(self.edits_since::<usize>(old_version).collect()) };
if patch.is_empty() {
return;
}
self.reparse(cx);
self.update_language_server();
cx.emit(Event::Edited);
cx.emit(Event::Edited(patch));
if !was_dirty {
cx.emit(Event::Dirtied);
}

View file

@ -110,11 +110,34 @@ fn test_edit_events(cx: &mut gpui::MutableAppContext) {
let buffer_1_events = buffer_1_events.borrow();
assert_eq!(
*buffer_1_events,
vec![Event::Edited, Event::Dirtied, Event::Edited, Event::Edited]
vec![
Event::Edited(Patch::new(vec![Edit {
old: 2..4,
new: 2..5
}])),
Event::Dirtied,
Event::Edited(Patch::new(vec![Edit {
old: 5..5,
new: 5..7
}])),
Event::Edited(Patch::new(vec![Edit {
old: 5..7,
new: 5..5,
}]))
]
);
let buffer_2_events = buffer_2_events.borrow();
assert_eq!(*buffer_2_events, vec![Event::Edited, Event::Dirtied]);
assert_eq!(
*buffer_2_events,
vec![
Event::Edited(Patch::new(vec![Edit {
old: 2..4,
new: 2..5
}])),
Event::Dirtied
]
);
}
#[gpui::test]