Keep a separate diagnostic update count and parse count in MultiBuffer

This commit is contained in:
Antonio Scandurra 2021-12-14 11:32:49 +01:00
parent 9e15c57f91
commit 04ffca95c6

View file

@ -62,6 +62,8 @@ struct BufferState {
#[derive(Clone, Default)] #[derive(Clone, Default)]
pub struct MultiBufferSnapshot { pub struct MultiBufferSnapshot {
excerpts: SumTree<Excerpt>, excerpts: SumTree<Excerpt>,
parse_count: usize,
diagnostics_update_count: usize,
} }
pub struct ExcerptProperties<'a, T> { pub struct ExcerptProperties<'a, T> {
@ -473,20 +475,31 @@ impl MultiBuffer {
fn sync(&self, cx: &AppContext) { fn sync(&self, cx: &AppContext) {
let mut snapshot = self.snapshot.borrow_mut(); let mut snapshot = self.snapshot.borrow_mut();
let mut excerpts_to_edit = Vec::new(); let mut excerpts_to_edit = Vec::new();
let mut reparsed = false;
let mut diagnostics_updated = false;
for buffer_state in self.buffers.values() { for buffer_state in self.buffers.values() {
let buffer = buffer_state.buffer.read(cx); let buffer = buffer_state.buffer.read(cx);
let buffer_changed = buffer.version().gt(&buffer_state.last_version); let buffer_edited = buffer.version().gt(&buffer_state.last_version);
if buffer_changed let buffer_reparsed = buffer.parse_count() > buffer_state.last_parse_count;
|| buffer.parse_count() > buffer_state.last_parse_count let buffer_diagnostics_updated =
|| buffer.diagnostics_update_count() > buffer_state.last_diagnostics_update_count buffer.diagnostics_update_count() > buffer_state.last_diagnostics_update_count;
{ if buffer_edited || buffer_reparsed || buffer_diagnostics_updated {
excerpts_to_edit.extend( excerpts_to_edit.extend(
buffer_state buffer_state
.excerpts .excerpts
.iter() .iter()
.map(|excerpt_id| (excerpt_id, buffer_state, buffer_changed)), .map(|excerpt_id| (excerpt_id, buffer_state, buffer_edited)),
); );
} }
reparsed |= buffer_reparsed;
diagnostics_updated |= buffer_diagnostics_updated;
}
if reparsed {
snapshot.parse_count += 1;
}
if diagnostics_updated {
snapshot.diagnostics_update_count += 1;
} }
excerpts_to_edit.sort_unstable_by_key(|(excerpt_id, _, _)| *excerpt_id); excerpts_to_edit.sort_unstable_by_key(|(excerpt_id, _, _)| *excerpt_id);
@ -494,13 +507,13 @@ impl MultiBuffer {
let mut new_excerpts = SumTree::new(); let mut new_excerpts = SumTree::new();
let mut cursor = snapshot.excerpts.cursor::<(Option<&ExcerptId>, usize)>(); let mut cursor = snapshot.excerpts.cursor::<(Option<&ExcerptId>, usize)>();
for (id, buffer_state, buffer_changed) in excerpts_to_edit { for (id, buffer_state, buffer_edited) in excerpts_to_edit {
new_excerpts.push_tree(cursor.slice(&Some(id), Bias::Left, &()), &()); new_excerpts.push_tree(cursor.slice(&Some(id), Bias::Left, &()), &());
let old_excerpt = cursor.item().unwrap(); let old_excerpt = cursor.item().unwrap();
let buffer = buffer_state.buffer.read(cx); let buffer = buffer_state.buffer.read(cx);
let mut new_excerpt; let mut new_excerpt;
if buffer_changed { if buffer_edited {
edits.extend( edits.extend(
buffer buffer
.edits_since_in_range::<usize>( .edits_since_in_range::<usize>(
@ -1028,7 +1041,7 @@ impl MultiBufferSnapshot {
} }
pub fn parse_count(&self) -> usize { pub fn parse_count(&self) -> usize {
self.as_singleton().unwrap().parse_count() self.parse_count
} }
pub fn enclosing_bracket_ranges<T: ToOffset>( pub fn enclosing_bracket_ranges<T: ToOffset>(
@ -1040,7 +1053,7 @@ impl MultiBufferSnapshot {
} }
pub fn diagnostics_update_count(&self) -> usize { pub fn diagnostics_update_count(&self) -> usize {
self.as_singleton().unwrap().diagnostics_update_count() self.diagnostics_update_count
} }
pub fn language(&self) -> Option<&Arc<Language>> { pub fn language(&self) -> Option<&Arc<Language>> {