diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 70a3542a67..624567397c 100644 --- a/crates/language/src/buffer.rs +++ b/crates/language/src/buffer.rs @@ -327,6 +327,13 @@ impl Buffer { ); } + let deferred_ops = message + .deferred_operations + .into_iter() + .map(proto::deserialize_operation) + .collect::>>()?; + this.apply_ops(deferred_ops, cx)?; + Ok(this) } @@ -362,6 +369,16 @@ impl Buffer { proto::serialize_diagnostic_set(set.provider_name().to_string(), set.iter()) }) .collect(), + deferred_operations: self + .deferred_ops + .iter() + .map(proto::serialize_operation) + .chain( + self.text + .deferred_ops() + .map(|op| proto::serialize_operation(&Operation::Buffer(op.clone()))), + ) + .collect(), } } diff --git a/crates/rpc/proto/zed.proto b/crates/rpc/proto/zed.proto index 6e2e30a10d..6da6e6051b 100644 --- a/crates/rpc/proto/zed.proto +++ b/crates/rpc/proto/zed.proto @@ -270,6 +270,7 @@ message Buffer { repeated SelectionSet selections = 7; repeated DiagnosticSet diagnostic_sets = 8; uint32 lamport_timestamp = 9; + repeated Operation deferred_operations = 10; } message BufferFragment { diff --git a/crates/text/src/operation_queue.rs b/crates/text/src/operation_queue.rs index ef99faf3e2..a3f5b9b6bd 100644 --- a/crates/text/src/operation_queue.rs +++ b/crates/text/src/operation_queue.rs @@ -53,7 +53,7 @@ impl OperationQueue { } pub fn iter(&self) -> impl Iterator { - self.0.cursor::<()>().map(|i| &i.0) + self.0.iter().map(|i| &i.0) } } diff --git a/crates/text/src/text.rs b/crates/text/src/text.rs index d802849f85..562bfe252f 100644 --- a/crates/text/src/text.rs +++ b/crates/text/src/text.rs @@ -1101,6 +1101,10 @@ impl Buffer { Ok(()) } + pub fn deferred_ops(&self) -> impl Iterator { + self.deferred_ops.iter() + } + fn flush_deferred_ops(&mut self) -> Result<()> { self.deferred_replicas.clear(); let mut deferred_ops = Vec::new();