From 7099438e0c2f281629e11b63acfbcdefc22fef76 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 5 Apr 2021 20:49:00 +0300 Subject: internal: prepare to store OpQueue results in the queue itself --- crates/rust-analyzer/src/global_state.rs | 7 +++++-- crates/rust-analyzer/src/op_queue.rs | 26 +++++++++++++++++--------- crates/rust-analyzer/src/reload.rs | 4 ++-- 3 files changed, 24 insertions(+), 13 deletions(-) (limited to 'crates') diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs index 52c249713..8679c8599 100644 --- a/crates/rust-analyzer/src/global_state.rs +++ b/crates/rust-analyzer/src/global_state.rs @@ -81,10 +81,13 @@ pub(crate) struct GlobalState { pub(crate) status: Status, pub(crate) source_root_config: SourceRootConfig, pub(crate) proc_macro_client: Option, + pub(crate) workspaces: Arc>, - pub(crate) fetch_workspaces_queue: OpQueue<()>, + pub(crate) fetch_workspaces_queue: OpQueue<(), ()>, + pub(crate) workspace_build_data: Option, - pub(crate) fetch_build_data_queue: OpQueue, + pub(crate) fetch_build_data_queue: OpQueue, + latest_requests: Arc>, } diff --git a/crates/rust-analyzer/src/op_queue.rs b/crates/rust-analyzer/src/op_queue.rs index 761b9ad39..f71b718bc 100644 --- a/crates/rust-analyzer/src/op_queue.rs +++ b/crates/rust-analyzer/src/op_queue.rs @@ -1,29 +1,37 @@ -//! Bookkeeping to make sure only one long-running operation is executed. +//! Bookkeeping to make sure only one long-running operation is being executed +//! at a time. -pub(crate) struct OpQueue { - op_scheduled: Option, +pub(crate) struct OpQueue { + op_scheduled: Option, op_in_progress: bool, + last_op_result: Output, } -impl Default for OpQueue { +impl Default for OpQueue { fn default() -> Self { - Self { op_scheduled: None, op_in_progress: false } + Self { op_scheduled: None, op_in_progress: false, last_op_result: Default::default() } } } -impl OpQueue { - pub(crate) fn request_op(&mut self, data: D) { +impl OpQueue { + pub(crate) fn request_op(&mut self, data: Args) { self.op_scheduled = Some(data); } - pub(crate) fn should_start_op(&mut self) -> Option { + pub(crate) fn should_start_op(&mut self) -> Option { if self.op_in_progress { return None; } self.op_in_progress = self.op_scheduled.is_some(); self.op_scheduled.take() } - pub(crate) fn op_completed(&mut self) { + pub(crate) fn op_completed(&mut self, result: Output) { assert!(self.op_in_progress); self.op_in_progress = false; + self.last_op_result = result; + } + + #[allow(unused)] + pub(crate) fn last_op_result(&self) -> &Output { + &self.last_op_result } } diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs index 76fdbcddd..d12f891bb 100644 --- a/crates/rust-analyzer/src/reload.rs +++ b/crates/rust-analyzer/src/reload.rs @@ -140,7 +140,7 @@ impl GlobalState { }); } pub(crate) fn fetch_build_data_completed(&mut self) { - self.fetch_build_data_queue.op_completed() + self.fetch_build_data_queue.op_completed(()) } pub(crate) fn fetch_workspaces_request(&mut self) { @@ -195,7 +195,7 @@ impl GlobalState { }); } pub(crate) fn fetch_workspaces_completed(&mut self) { - self.fetch_workspaces_queue.op_completed() + self.fetch_workspaces_queue.op_completed(()) } pub(crate) fn switch_workspaces( -- cgit v1.2.3