diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index f1cb22002a681a9e6dbd9bf17412f7071ef13131..186f1672e5884f213b9223191985c20fee330e82 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -1529,6 +1529,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); @@ -1970,7 +1971,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) { @@ -2270,12 +2276,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); @@ -2387,7 +2394,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