diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 98c4cc5e649a97..10b519b18c4cfd 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1527,6 +1527,7 @@ impl Buffer { } fn did_finish_parsing(&mut self, syntax_snapshot: SyntaxSnapshot, cx: &mut Context) { + self.was_changed(); self.non_text_state_update_count += 1; self.syntax_map.lock().did_parse(syntax_snapshot); self.request_autoindent(cx); @@ -1968,7 +1969,12 @@ impl Buffer { /// This allows downstream code to check if the buffer's text has changed without /// waiting for an effect cycle, which would be required if using eents. pub fn record_changes(&mut self, bit: rc::Weak>) { - self.change_bits.push(bit); + if let Err(ix) = self + .change_bits + .binary_search_by_key(&rc::Weak::as_ptr(&bit), rc::Weak::as_ptr) + { + self.change_bits.insert(ix, bit); + } } fn was_changed(&mut self) { @@ -2273,12 +2279,13 @@ impl Buffer { } fn did_edit(&mut self, old_version: &clock::Global, was_dirty: bool, cx: &mut Context) { + self.was_changed(); + if self.edits_since::(old_version).next().is_none() { return; } self.reparse(cx); - cx.emit(BufferEvent::Edited); if was_dirty != self.is_dirty() { cx.emit(BufferEvent::DirtyChanged); @@ -2390,7 +2397,6 @@ impl Buffer { } self.text.apply_ops(buffer_ops); self.deferred_ops.insert(deferred_ops); - self.was_changed(); self.flush_deferred_ops(cx); self.did_edit(&old_version, was_dirty, cx); // Notify independently of whether the buffer was edited as the operations could include a