From 870fa5f2789a2c292927470e4c0b3ca15eeea1ee Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 5 Jan 2022 11:52:41 +0100 Subject: [PATCH] Serialize deferred operations --- 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(-) diff --git a/crates/language/src/buffer.rs b/crates/language/src/buffer.rs index 70a3542a67e7cd69bb802d9be2939df7debd54d3..624567397c393614862153d9a63a0a0c33c73583 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 6e2e30a10d6774445712673ca70067c21fc10532..6da6e6051b23ac8e786c7f8ae7debbbaa17fd0a6 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 ef99faf3e2314c66084ff6b4dc77821445a78318..a3f5b9b6bd71c61a186833f9c99d8a68bbb65b99 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 d802849f8569d3e7267957b18289c2d880d9b686..562bfe252f889d4c3b3aa327fc6d2fad7515fb6c 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();