diff options
Diffstat (limited to 'crates/ra_lsp_server/src/main_loop.rs')
-rw-r--r-- | crates/ra_lsp_server/src/main_loop.rs | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index fb357b36b..42ebb5cdf 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs | |||
@@ -5,7 +5,7 @@ pub(crate) mod pending_requests; | |||
5 | use std::{error::Error, fmt, path::PathBuf, sync::Arc, time::Instant}; | 5 | use std::{error::Error, fmt, path::PathBuf, sync::Arc, time::Instant}; |
6 | 6 | ||
7 | use crossbeam_channel::{select, unbounded, Receiver, RecvError, Sender}; | 7 | use crossbeam_channel::{select, unbounded, Receiver, RecvError, Sender}; |
8 | use lsp_server::{handle_shutdown, ErrorCode, Message, Notification, Request, RequestId, Response}; | 8 | use lsp_server::{Connection, ErrorCode, Message, Notification, Request, RequestId, Response}; |
9 | use lsp_types::{ClientCapabilities, NumberOrString}; | 9 | use lsp_types::{ClientCapabilities, NumberOrString}; |
10 | use ra_ide_api::{Canceled, FeatureFlags, FileId, LibraryData}; | 10 | use ra_ide_api::{Canceled, FeatureFlags, FileId, LibraryData}; |
11 | use ra_prof::profile; | 11 | use ra_prof::profile; |
@@ -51,8 +51,7 @@ pub fn main_loop( | |||
51 | ws_roots: Vec<PathBuf>, | 51 | ws_roots: Vec<PathBuf>, |
52 | client_caps: ClientCapabilities, | 52 | client_caps: ClientCapabilities, |
53 | config: ServerConfig, | 53 | config: ServerConfig, |
54 | msg_receiver: &Receiver<Message>, | 54 | connection: &Connection, |
55 | msg_sender: &Sender<Message>, | ||
56 | ) -> Result<()> { | 55 | ) -> Result<()> { |
57 | log::info!("server_config: {:#?}", config); | 56 | log::info!("server_config: {:#?}", config); |
58 | // FIXME: support dynamic workspace loading. | 57 | // FIXME: support dynamic workspace loading. |
@@ -69,7 +68,7 @@ pub fn main_loop( | |||
69 | show_message( | 68 | show_message( |
70 | req::MessageType::Error, | 69 | req::MessageType::Error, |
71 | format!("rust-analyzer failed to load workspace: {}", e), | 70 | format!("rust-analyzer failed to load workspace: {}", e), |
72 | msg_sender, | 71 | &connection.sender, |
73 | ); | 72 | ); |
74 | } | 73 | } |
75 | } | 74 | } |
@@ -89,7 +88,7 @@ pub fn main_loop( | |||
89 | show_message( | 88 | show_message( |
90 | req::MessageType::Error, | 89 | req::MessageType::Error, |
91 | format!("unknown feature flag: {:?}", flag), | 90 | format!("unknown feature flag: {:?}", flag), |
92 | msg_sender, | 91 | &connection.sender, |
93 | ); | 92 | ); |
94 | } | 93 | } |
95 | } | 94 | } |
@@ -119,8 +118,7 @@ pub fn main_loop( | |||
119 | log::info!("server initialized, serving requests"); | 118 | log::info!("server initialized, serving requests"); |
120 | let main_res = main_loop_inner( | 119 | let main_res = main_loop_inner( |
121 | &pool, | 120 | &pool, |
122 | msg_sender, | 121 | connection, |
123 | msg_receiver, | ||
124 | task_sender, | 122 | task_sender, |
125 | task_receiver.clone(), | 123 | task_receiver.clone(), |
126 | &mut state, | 124 | &mut state, |
@@ -130,7 +128,7 @@ pub fn main_loop( | |||
130 | log::info!("waiting for tasks to finish..."); | 128 | log::info!("waiting for tasks to finish..."); |
131 | task_receiver | 129 | task_receiver |
132 | .into_iter() | 130 | .into_iter() |
133 | .for_each(|task| on_task(task, msg_sender, &mut pending_requests, &mut state)); | 131 | .for_each(|task| on_task(task, &connection.sender, &mut pending_requests, &mut state)); |
134 | log::info!("...tasks have finished"); | 132 | log::info!("...tasks have finished"); |
135 | log::info!("joining threadpool..."); | 133 | log::info!("joining threadpool..."); |
136 | drop(pool); | 134 | drop(pool); |
@@ -196,8 +194,7 @@ impl fmt::Debug for Event { | |||
196 | 194 | ||
197 | fn main_loop_inner( | 195 | fn main_loop_inner( |
198 | pool: &ThreadPool, | 196 | pool: &ThreadPool, |
199 | msg_sender: &Sender<Message>, | 197 | connection: &Connection, |
200 | msg_receiver: &Receiver<Message>, | ||
201 | task_sender: Sender<Task>, | 198 | task_sender: Sender<Task>, |
202 | task_receiver: Receiver<Task>, | 199 | task_receiver: Receiver<Task>, |
203 | state: &mut WorldState, | 200 | state: &mut WorldState, |
@@ -214,7 +211,7 @@ fn main_loop_inner( | |||
214 | loop { | 211 | loop { |
215 | log::trace!("selecting"); | 212 | log::trace!("selecting"); |
216 | let event = select! { | 213 | let event = select! { |
217 | recv(msg_receiver) -> msg => match msg { | 214 | recv(&connection.receiver) -> msg => match msg { |
218 | Ok(msg) => Event::Msg(msg), | 215 | Ok(msg) => Event::Msg(msg), |
219 | Err(RecvError) => Err("client exited without shutdown")?, | 216 | Err(RecvError) => Err("client exited without shutdown")?, |
220 | }, | 217 | }, |
@@ -238,7 +235,7 @@ fn main_loop_inner( | |||
238 | let mut state_changed = false; | 235 | let mut state_changed = false; |
239 | match event { | 236 | match event { |
240 | Event::Task(task) => { | 237 | Event::Task(task) => { |
241 | on_task(task, msg_sender, pending_requests, state); | 238 | on_task(task, &connection.sender, pending_requests, state); |
242 | state.maybe_collect_garbage(); | 239 | state.maybe_collect_garbage(); |
243 | } | 240 | } |
244 | Event::Vfs(task) => { | 241 | Event::Vfs(task) => { |
@@ -252,7 +249,7 @@ fn main_loop_inner( | |||
252 | } | 249 | } |
253 | Event::Msg(msg) => match msg { | 250 | Event::Msg(msg) => match msg { |
254 | Message::Request(req) => { | 251 | Message::Request(req) => { |
255 | if handle_shutdown(&req, msg_sender) { | 252 | if connection.handle_shutdown(&req)? { |
256 | return Ok(()); | 253 | return Ok(()); |
257 | }; | 254 | }; |
258 | on_request( | 255 | on_request( |
@@ -260,13 +257,13 @@ fn main_loop_inner( | |||
260 | pending_requests, | 257 | pending_requests, |
261 | pool, | 258 | pool, |
262 | &task_sender, | 259 | &task_sender, |
263 | msg_sender, | 260 | &connection.sender, |
264 | loop_start, | 261 | loop_start, |
265 | req, | 262 | req, |
266 | )? | 263 | )? |
267 | } | 264 | } |
268 | Message::Notification(not) => { | 265 | Message::Notification(not) => { |
269 | on_notification(msg_sender, state, pending_requests, &mut subs, not)?; | 266 | on_notification(&connection.sender, state, pending_requests, &mut subs, not)?; |
270 | state_changed = true; | 267 | state_changed = true; |
271 | } | 268 | } |
272 | Message::Response(resp) => log::error!("unexpected response: {:?}", resp), | 269 | Message::Response(resp) => log::error!("unexpected response: {:?}", resp), |
@@ -294,7 +291,7 @@ fn main_loop_inner( | |||
294 | let n_packages: usize = state.workspaces.iter().map(|it| it.n_packages()).sum(); | 291 | let n_packages: usize = state.workspaces.iter().map(|it| it.n_packages()).sum(); |
295 | if state.feature_flags().get("notifications.workspace-loaded") { | 292 | if state.feature_flags().get("notifications.workspace-loaded") { |
296 | let msg = format!("workspace loaded, {} rust packages", n_packages); | 293 | let msg = format!("workspace loaded, {} rust packages", n_packages); |
297 | show_message(req::MessageType::Info, msg, msg_sender); | 294 | show_message(req::MessageType::Info, msg, &connection.sender); |
298 | } | 295 | } |
299 | // Only send the notification first time | 296 | // Only send the notification first time |
300 | send_workspace_notification = false; | 297 | send_workspace_notification = false; |