Serialize deferred operations

Antonio Scandurra created

Change summary

crates/language/src/buffer.rs      | 17 +++++++++++++++++
crates/rpc/proto/zed.proto         |  1 +
crates/text/src/operation_queue.rs |  2 +-
crates/text/src/text.rs            |  4 ++++
4 files changed, 23 insertions(+), 1 deletion(-)

Detailed changes

crates/language/src/buffer.rs 🔗

@@ -327,6 +327,13 @@ impl Buffer {
             );
         }
 
+        let deferred_ops = message
+            .deferred_operations
+            .into_iter()
+            .map(proto::deserialize_operation)
+            .collect::<Result<Vec<_>>>()?;
+        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(),
         }
     }
 

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 {

crates/text/src/operation_queue.rs 🔗

@@ -53,7 +53,7 @@ impl<T: Operation> OperationQueue<T> {
     }
 
     pub fn iter(&self) -> impl Iterator<Item = &T> {
-        self.0.cursor::<()>().map(|i| &i.0)
+        self.0.iter().map(|i| &i.0)
     }
 }
 

crates/text/src/text.rs 🔗

@@ -1101,6 +1101,10 @@ impl Buffer {
         Ok(())
     }
 
+    pub fn deferred_ops(&self) -> impl Iterator<Item = &Operation> {
+        self.deferred_ops.iter()
+    }
+
     fn flush_deferred_ops(&mut self) -> Result<()> {
         self.deferred_replicas.clear();
         let mut deferred_ops = Vec::new();