diff options
-rw-r--r-- | crates/rust-analyzer/src/global_state.rs | 10 | ||||
-rw-r--r-- | crates/rust-analyzer/src/lib.rs | 22 | ||||
-rw-r--r-- | crates/rust-analyzer/src/main_loop.rs | 37 |
3 files changed, 29 insertions, 40 deletions
diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs index ad5f94e87..0b42b88ac 100644 --- a/crates/rust-analyzer/src/global_state.rs +++ b/crates/rust-analyzer/src/global_state.rs | |||
@@ -167,7 +167,7 @@ impl GlobalState { | |||
167 | res | 167 | res |
168 | } | 168 | } |
169 | 169 | ||
170 | pub fn update_configuration(&mut self, config: Config) { | 170 | pub(crate) fn update_configuration(&mut self, config: Config) { |
171 | self.analysis_host.update_lru_capacity(config.lru_capacity); | 171 | self.analysis_host.update_lru_capacity(config.lru_capacity); |
172 | if config.check != self.config.check { | 172 | if config.check != self.config.check { |
173 | self.flycheck = | 173 | self.flycheck = |
@@ -177,7 +177,7 @@ impl GlobalState { | |||
177 | self.config = config; | 177 | self.config = config; |
178 | } | 178 | } |
179 | 179 | ||
180 | pub fn process_changes(&mut self) -> bool { | 180 | pub(crate) fn process_changes(&mut self) -> bool { |
181 | let change = { | 181 | let change = { |
182 | let mut change = AnalysisChange::new(); | 182 | let mut change = AnalysisChange::new(); |
183 | let (vfs, line_endings_map) = &mut *self.vfs.write(); | 183 | let (vfs, line_endings_map) = &mut *self.vfs.write(); |
@@ -215,7 +215,7 @@ impl GlobalState { | |||
215 | true | 215 | true |
216 | } | 216 | } |
217 | 217 | ||
218 | pub fn snapshot(&self) -> GlobalStateSnapshot { | 218 | pub(crate) fn snapshot(&self) -> GlobalStateSnapshot { |
219 | GlobalStateSnapshot { | 219 | GlobalStateSnapshot { |
220 | config: self.config.clone(), | 220 | config: self.config.clone(), |
221 | workspaces: Arc::clone(&self.workspaces), | 221 | workspaces: Arc::clone(&self.workspaces), |
@@ -226,11 +226,11 @@ impl GlobalState { | |||
226 | } | 226 | } |
227 | } | 227 | } |
228 | 228 | ||
229 | pub fn maybe_collect_garbage(&mut self) { | 229 | pub(crate) fn maybe_collect_garbage(&mut self) { |
230 | self.analysis_host.maybe_collect_garbage() | 230 | self.analysis_host.maybe_collect_garbage() |
231 | } | 231 | } |
232 | 232 | ||
233 | pub fn collect_garbage(&mut self) { | 233 | pub(crate) fn collect_garbage(&mut self) { |
234 | self.analysis_host.collect_garbage() | 234 | self.analysis_host.collect_garbage() |
235 | } | 235 | } |
236 | 236 | ||
diff --git a/crates/rust-analyzer/src/lib.rs b/crates/rust-analyzer/src/lib.rs index 9757a16a3..d6cd04303 100644 --- a/crates/rust-analyzer/src/lib.rs +++ b/crates/rust-analyzer/src/lib.rs | |||
@@ -37,12 +37,32 @@ use serde::de::DeserializeOwned; | |||
37 | pub type Result<T, E = Box<dyn std::error::Error + Send + Sync>> = std::result::Result<T, E>; | 37 | pub type Result<T, E = Box<dyn std::error::Error + Send + Sync>> = std::result::Result<T, E>; |
38 | pub use crate::{ | 38 | pub use crate::{ |
39 | caps::server_capabilities, | 39 | caps::server_capabilities, |
40 | main_loop::LspError, | ||
41 | main_loop::{main_loop, show_message}, | 40 | main_loop::{main_loop, show_message}, |
42 | }; | 41 | }; |
42 | use std::fmt; | ||
43 | 43 | ||
44 | pub fn from_json<T: DeserializeOwned>(what: &'static str, json: serde_json::Value) -> Result<T> { | 44 | pub fn from_json<T: DeserializeOwned>(what: &'static str, json: serde_json::Value) -> Result<T> { |
45 | let res = T::deserialize(&json) | 45 | let res = T::deserialize(&json) |
46 | .map_err(|e| format!("Failed to deserialize {}: {}; {}", what, e, json))?; | 46 | .map_err(|e| format!("Failed to deserialize {}: {}; {}", what, e, json))?; |
47 | Ok(res) | 47 | Ok(res) |
48 | } | 48 | } |
49 | |||
50 | #[derive(Debug)] | ||
51 | struct LspError { | ||
52 | code: i32, | ||
53 | message: String, | ||
54 | } | ||
55 | |||
56 | impl LspError { | ||
57 | fn new(code: i32, message: String) -> LspError { | ||
58 | LspError { code, message } | ||
59 | } | ||
60 | } | ||
61 | |||
62 | impl fmt::Display for LspError { | ||
63 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
64 | write!(f, "Language Server request failed with {}. ({})", self.code, self.message) | ||
65 | } | ||
66 | } | ||
67 | |||
68 | impl std::error::Error for LspError {} | ||
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index 02e188b02..1787e8c16 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs | |||
@@ -1,9 +1,7 @@ | |||
1 | //! The main loop of `rust-analyzer` responsible for dispatching LSP | 1 | //! The main loop of `rust-analyzer` responsible for dispatching LSP |
2 | //! requests/replies and notifications back to the client. | 2 | //! requests/replies and notifications back to the client. |
3 | use std::{ | 3 | use std::{ |
4 | env, | 4 | env, fmt, |
5 | error::Error, | ||
6 | fmt, | ||
7 | ops::Range, | 5 | ops::Range, |
8 | panic, | 6 | panic, |
9 | sync::Arc, | 7 | sync::Arc, |
@@ -28,31 +26,9 @@ use crate::{ | |||
28 | global_state::{file_id_to_url, GlobalState, GlobalStateSnapshot, Status}, | 26 | global_state::{file_id_to_url, GlobalState, GlobalStateSnapshot, Status}, |
29 | handlers, lsp_ext, | 27 | handlers, lsp_ext, |
30 | request_metrics::RequestMetrics, | 28 | request_metrics::RequestMetrics, |
31 | Result, | 29 | LspError, Result, |
32 | }; | 30 | }; |
33 | 31 | ||
34 | #[derive(Debug)] | ||
35 | pub struct LspError { | ||
36 | pub code: i32, | ||
37 | pub message: String, | ||
38 | } | ||
39 | |||
40 | impl LspError { | ||
41 | pub const UNKNOWN_FILE: i32 = -32900; | ||
42 | |||
43 | pub fn new(code: i32, message: String) -> LspError { | ||
44 | LspError { code, message } | ||
45 | } | ||
46 | } | ||
47 | |||
48 | impl fmt::Display for LspError { | ||
49 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
50 | write!(f, "Language Server request failed with {}. ({})", self.code, self.message) | ||
51 | } | ||
52 | } | ||
53 | |||
54 | impl Error for LspError {} | ||
55 | |||
56 | pub fn main_loop(config: Config, connection: Connection) -> Result<()> { | 32 | pub fn main_loop(config: Config, connection: Connection) -> Result<()> { |
57 | log::info!("initial config: {:#?}", config); | 33 | log::info!("initial config: {:#?}", config); |
58 | 34 | ||
@@ -848,14 +824,7 @@ where | |||
848 | let response = match result { | 824 | let response = match result { |
849 | Ok(resp) => Response::new_ok(id, &resp), | 825 | Ok(resp) => Response::new_ok(id, &resp), |
850 | Err(e) => match e.downcast::<LspError>() { | 826 | Err(e) => match e.downcast::<LspError>() { |
851 | Ok(lsp_error) => { | 827 | Ok(lsp_error) => Response::new_err(id, lsp_error.code, lsp_error.message), |
852 | if lsp_error.code == LspError::UNKNOWN_FILE { | ||
853 | // Work-around for https://github.com/rust-analyzer/rust-analyzer/issues/1521 | ||
854 | Response::new_ok(id, ()) | ||
855 | } else { | ||
856 | Response::new_err(id, lsp_error.code, lsp_error.message) | ||
857 | } | ||
858 | } | ||
859 | Err(e) => { | 828 | Err(e) => { |
860 | if is_canceled(&e) { | 829 | if is_canceled(&e) { |
861 | Response::new_err( | 830 | Response::new_err( |