diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/rust-analyzer/src/config.rs | 2 | ||||
-rw-r--r-- | crates/rust-analyzer/src/global_state.rs | 1 | ||||
-rw-r--r-- | crates/rust-analyzer/src/lsp_ext.rs | 18 | ||||
-rw-r--r-- | crates/rust-analyzer/src/main_loop.rs | 18 |
4 files changed, 35 insertions, 4 deletions
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 6c311648a..21acfe644 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs | |||
@@ -130,6 +130,7 @@ pub struct ClientCapsConfig { | |||
130 | pub code_action_group: bool, | 130 | pub code_action_group: bool, |
131 | pub resolve_code_action: bool, | 131 | pub resolve_code_action: bool, |
132 | pub hover_actions: bool, | 132 | pub hover_actions: bool, |
133 | pub status_notification: bool, | ||
133 | } | 134 | } |
134 | 135 | ||
135 | impl Config { | 136 | impl Config { |
@@ -365,6 +366,7 @@ impl Config { | |||
365 | self.client_caps.code_action_group = get_bool("codeActionGroup"); | 366 | self.client_caps.code_action_group = get_bool("codeActionGroup"); |
366 | self.client_caps.resolve_code_action = get_bool("resolveCodeAction"); | 367 | self.client_caps.resolve_code_action = get_bool("resolveCodeAction"); |
367 | self.client_caps.hover_actions = get_bool("hoverActions"); | 368 | self.client_caps.hover_actions = get_bool("hoverActions"); |
369 | self.client_caps.status_notification = get_bool("statusNotification"); | ||
368 | } | 370 | } |
369 | } | 371 | } |
370 | } | 372 | } |
diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs index b7b4edf66..5e9cae3f8 100644 --- a/crates/rust-analyzer/src/global_state.rs +++ b/crates/rust-analyzer/src/global_state.rs | |||
@@ -31,6 +31,7 @@ use crate::{ | |||
31 | pub(crate) enum Status { | 31 | pub(crate) enum Status { |
32 | Loading, | 32 | Loading, |
33 | Ready, | 33 | Ready, |
34 | Invalid, | ||
34 | } | 35 | } |
35 | 36 | ||
36 | impl Default for Status { | 37 | impl Default for Status { |
diff --git a/crates/rust-analyzer/src/lsp_ext.rs b/crates/rust-analyzer/src/lsp_ext.rs index 82207bbb8..d225ad5ff 100644 --- a/crates/rust-analyzer/src/lsp_ext.rs +++ b/crates/rust-analyzer/src/lsp_ext.rs | |||
@@ -3,7 +3,7 @@ | |||
3 | use std::{collections::HashMap, path::PathBuf}; | 3 | use std::{collections::HashMap, path::PathBuf}; |
4 | 4 | ||
5 | use lsp_types::request::Request; | 5 | use lsp_types::request::Request; |
6 | use lsp_types::{Position, Range, TextDocumentIdentifier}; | 6 | use lsp_types::{notification::Notification, Position, Range, TextDocumentIdentifier}; |
7 | use serde::{Deserialize, Serialize}; | 7 | use serde::{Deserialize, Serialize}; |
8 | 8 | ||
9 | pub enum AnalyzerStatus {} | 9 | pub enum AnalyzerStatus {} |
@@ -208,6 +208,22 @@ pub struct SsrParams { | |||
208 | pub parse_only: bool, | 208 | pub parse_only: bool, |
209 | } | 209 | } |
210 | 210 | ||
211 | pub enum StatusNotification {} | ||
212 | |||
213 | #[serde(rename_all = "camelCase")] | ||
214 | #[derive(Serialize, Deserialize)] | ||
215 | pub enum Status { | ||
216 | Loading, | ||
217 | Ready, | ||
218 | NeedsReload, | ||
219 | Invalid, | ||
220 | } | ||
221 | |||
222 | impl Notification for StatusNotification { | ||
223 | type Params = Status; | ||
224 | const METHOD: &'static str = "rust-analyzer/status"; | ||
225 | } | ||
226 | |||
211 | pub enum CodeActionRequest {} | 227 | pub enum CodeActionRequest {} |
212 | 228 | ||
213 | impl Request for CodeActionRequest { | 229 | impl Request for CodeActionRequest { |
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index e03038b25..a5a8c17a0 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs | |||
@@ -169,16 +169,16 @@ impl GlobalState { | |||
169 | } | 169 | } |
170 | vfs::loader::Message::Progress { n_total, n_done } => { | 170 | vfs::loader::Message::Progress { n_total, n_done } => { |
171 | if n_total == 0 { | 171 | if n_total == 0 { |
172 | self.status = Status::Ready; | 172 | self.transition(Status::Invalid); |
173 | } else { | 173 | } else { |
174 | let state = if n_done == 0 { | 174 | let state = if n_done == 0 { |
175 | self.status = Status::Loading; | 175 | self.transition(Status::Loading); |
176 | Progress::Begin | 176 | Progress::Begin |
177 | } else if n_done < n_total { | 177 | } else if n_done < n_total { |
178 | Progress::Report | 178 | Progress::Report |
179 | } else { | 179 | } else { |
180 | assert_eq!(n_done, n_total); | 180 | assert_eq!(n_done, n_total); |
181 | self.status = Status::Ready; | 181 | self.transition(Status::Ready); |
182 | Progress::End | 182 | Progress::End |
183 | }; | 183 | }; |
184 | self.report_progress( | 184 | self.report_progress( |
@@ -274,6 +274,18 @@ impl GlobalState { | |||
274 | Ok(()) | 274 | Ok(()) |
275 | } | 275 | } |
276 | 276 | ||
277 | fn transition(&mut self, new_status: Status) { | ||
278 | self.status = Status::Ready; | ||
279 | if self.config.client_caps.status_notification { | ||
280 | let lsp_status = match new_status { | ||
281 | Status::Loading => lsp_ext::Status::Loading, | ||
282 | Status::Ready => lsp_ext::Status::Ready, | ||
283 | Status::Invalid => lsp_ext::Status::Invalid, | ||
284 | }; | ||
285 | self.send_notification::<lsp_ext::StatusNotification>(lsp_status); | ||
286 | } | ||
287 | } | ||
288 | |||
277 | fn on_request(&mut self, request_received: Instant, req: Request) -> Result<()> { | 289 | fn on_request(&mut self, request_received: Instant, req: Request) -> Result<()> { |
278 | self.register_request(&req, request_received); | 290 | self.register_request(&req, request_received); |
279 | 291 | ||