]> git.lizzy.rs Git - rust.git/commitdiff
internal: more visibility into why things happen
authorAleksey Kladov <aleksey.kladov@gmail.com>
Sat, 16 Apr 2022 12:16:58 +0000 (13:16 +0100)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Sat, 16 Apr 2022 12:17:27 +0000 (13:17 +0100)
crates/rust-analyzer/src/global_state.rs
crates/rust-analyzer/src/main_loop.rs
crates/rust-analyzer/src/op_queue.rs
crates/rust-analyzer/src/reload.rs

index 5118c9756ccde504e0bb2ec35183ae90431d3ea8..cfbd5f63bc1a37dcb19c8cc46ea89880354a27fa 100644 (file)
@@ -192,7 +192,8 @@ pub(crate) fn process_changes(&mut self) -> bool {
                 if let Some(path) = vfs.file_path(file.file_id).as_path() {
                     let path = path.to_path_buf();
                     if reload::should_refresh_for_change(&path, file.change_kind) {
-                        self.fetch_workspaces_queue.request_op();
+                        self.fetch_workspaces_queue
+                            .request_op(format!("vfs file change: {}", path.display()));
                     }
                     fs_changes.push((path, file.change_kind));
                     if file.is_created_or_deleted() {
index de44ba5e077d30144d188b8e334d67a4b2d33e52..e305fe408e63810117d805dc3b9b5ee76872c94c 100644 (file)
@@ -149,9 +149,9 @@ fn run(mut self, inbox: Receiver<lsp_server::Message>) -> Result<()> {
             );
         }
 
-        self.fetch_workspaces_queue.request_op();
-        if self.fetch_workspaces_queue.should_start_op() {
-            self.fetch_workspaces();
+        self.fetch_workspaces_queue.request_op("startup".to_string());
+        if let Some(cause) = self.fetch_workspaces_queue.should_start_op() {
+            self.fetch_workspaces(cause);
         }
 
         while let Some(event) = self.next_event(&inbox) {
@@ -240,7 +240,8 @@ fn handle_event(&mut self, event: Event) -> Result<()> {
                                     let workspaces_updated = !Arc::ptr_eq(&old, &self.workspaces);
 
                                     if self.config.run_build_scripts() && workspaces_updated {
-                                        self.fetch_build_data_queue.request_op()
+                                        self.fetch_build_data_queue
+                                            .request_op(format!("workspace updated"));
                                     }
 
                                     (Progress::End, None)
@@ -312,7 +313,8 @@ fn handle_event(&mut self, event: Event) -> Result<()> {
 
                             self.prime_caches_queue.op_completed(());
                             if cancelled {
-                                self.prime_caches_queue.request_op();
+                                self.prime_caches_queue
+                                    .request_op("restart after cancelation".to_string());
                             }
                         }
                     };
@@ -443,7 +445,7 @@ fn handle_event(&mut self, event: Event) -> Result<()> {
                     flycheck.update();
                 }
                 if self.config.prefill_caches() {
-                    self.prime_caches_queue.request_op();
+                    self.prime_caches_queue.request_op("became quiescent".to_string());
                 }
             }
 
@@ -493,14 +495,15 @@ fn handle_event(&mut self, event: Event) -> Result<()> {
         }
 
         if self.config.cargo_autoreload() {
-            if self.fetch_workspaces_queue.should_start_op() {
-                self.fetch_workspaces();
+            if let Some(cause) = self.fetch_workspaces_queue.should_start_op() {
+                self.fetch_workspaces(cause);
             }
         }
-        if self.fetch_build_data_queue.should_start_op() {
-            self.fetch_build_data();
+        if let Some(cause) = self.fetch_build_data_queue.should_start_op() {
+            self.fetch_build_data(cause);
         }
-        if self.prime_caches_queue.should_start_op() {
+        if let Some(cause) = self.prime_caches_queue.should_start_op() {
+            tracing::debug!(%cause, "will prime caches");
             let num_worker_threads = self.config.prime_caches_num_threads();
 
             self.task_pool.handle.spawn_with_sender({
@@ -569,7 +572,7 @@ fn on_request(&mut self, request_received: Instant, req: Request) -> Result<()>
 
         RequestDispatcher { req: Some(req), global_state: self }
             .on_sync_mut::<lsp_ext::ReloadWorkspace>(|s, ()| {
-                s.fetch_workspaces_queue.request_op();
+                s.fetch_workspaces_queue.request_op("reload workspace request".to_string());
                 Ok(())
             })?
             .on_sync_mut::<lsp_types::request::Shutdown>(|s, ()| {
@@ -714,7 +717,7 @@ fn on_notification(&mut self, not: Notification) -> Result<()> {
                 }
                 if let Ok(abs_path) = from_proto::abs_path(&params.text_document.uri) {
                     if reload::should_refresh_for_change(&abs_path, ChangeKind::Modify) {
-                        this.fetch_workspaces_queue.request_op();
+                        this.fetch_workspaces_queue.request_op(format!("DidSaveTextDocument {}", abs_path.display()));
                     }
                 }
                 Ok(())
index e2894b3ff2c05710b185f1d74ce58befb99bcef3..97aca0161873e491ff3f2abad85cf3ac49b1200d 100644 (file)
@@ -1,29 +1,30 @@
 //! Bookkeeping to make sure only one long-running operation is being executed
 //! at a time.
 
+pub(crate) type Cause = String;
+
 pub(crate) struct OpQueue<Output> {
-    op_requested: bool,
+    op_requested: Option<Cause>,
     op_in_progress: bool,
     last_op_result: Output,
 }
 
 impl<Output: Default> Default for OpQueue<Output> {
     fn default() -> Self {
-        Self { op_requested: false, op_in_progress: false, last_op_result: Default::default() }
+        Self { op_requested: None, op_in_progress: false, last_op_result: Default::default() }
     }
 }
 
 impl<Output> OpQueue<Output> {
-    pub(crate) fn request_op(&mut self) {
-        self.op_requested = true;
+    pub(crate) fn request_op(&mut self, reason: Cause) {
+        self.op_requested = Some(reason);
     }
-    pub(crate) fn should_start_op(&mut self) -> bool {
+    pub(crate) fn should_start_op(&mut self) -> Option<Cause> {
         if self.op_in_progress {
-            return false;
+            return None;
         }
-        self.op_in_progress = self.op_requested;
-        self.op_requested = false;
-        self.op_in_progress
+        self.op_in_progress = self.op_requested.is_some();
+        self.op_requested.take()
     }
     pub(crate) fn op_completed(&mut self, result: Output) {
         assert!(self.op_in_progress);
@@ -38,6 +39,6 @@ pub(crate) fn op_in_progress(&self) -> bool {
         self.op_in_progress
     }
     pub(crate) fn op_requested(&self) -> bool {
-        self.op_requested
+        self.op_requested.is_some()
     }
 }
index 5189d94eae988eba54b215a9cdf9da286dd029aa..d4e40d807d0939cb2412aec1c408ee4c8929dbe6 100644 (file)
@@ -18,6 +18,7 @@
     global_state::GlobalState,
     lsp_ext,
     main_loop::Task,
+    op_queue::Cause,
 };
 
 #[derive(Debug)]
@@ -49,7 +50,7 @@ pub(crate) fn update_configuration(&mut self, config: Config) {
             self.analysis_host.update_lru_capacity(self.config.lru_capacity());
         }
         if self.config.linked_projects() != old_config.linked_projects() {
-            self.fetch_workspaces_queue.request_op()
+            self.fetch_workspaces_queue.request_op("linked projects changed".to_string())
         } else if self.config.flycheck() != old_config.flycheck() {
             self.reload_flycheck();
         }
@@ -92,8 +93,8 @@ pub(crate) fn current_status(&self) -> lsp_ext::ServerStatusParams {
         status
     }
 
-    pub(crate) fn fetch_workspaces(&mut self) {
-        tracing::info!("will fetch workspaces");
+    pub(crate) fn fetch_workspaces(&mut self, cause: Cause) {
+        tracing::info!(%cause, "will fetch workspaces");
 
         self.task_pool.handle.spawn_with_sender({
             let linked_projects = self.config.linked_projects();
@@ -144,7 +145,8 @@ pub(crate) fn fetch_workspaces(&mut self) {
         });
     }
 
-    pub(crate) fn fetch_build_data(&mut self) {
+    pub(crate) fn fetch_build_data(&mut self, cause: Cause) {
+        tracing::debug!(%cause, "will fetch build data");
         let workspaces = Arc::clone(&self.workspaces);
         let config = self.config.cargo();
         self.task_pool.handle.spawn_with_sender(move |sender| {