Keep a separate diagnostic update count and parse count in MultiBuffer
This commit is contained in:
parent
9e15c57f91
commit
04ffca95c6
1 changed files with 23 additions and 10 deletions
|
@ -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>> {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue