aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server/src/main_loop.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_lsp_server/src/main_loop.rs')
-rw-r--r--crates/ra_lsp_server/src/main_loop.rs29
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;
5use std::{error::Error, fmt, path::PathBuf, sync::Arc, time::Instant}; 5use std::{error::Error, fmt, path::PathBuf, sync::Arc, time::Instant};
6 6
7use crossbeam_channel::{select, unbounded, Receiver, RecvError, Sender}; 7use crossbeam_channel::{select, unbounded, Receiver, RecvError, Sender};
8use lsp_server::{handle_shutdown, ErrorCode, Message, Notification, Request, RequestId, Response}; 8use lsp_server::{Connection, ErrorCode, Message, Notification, Request, RequestId, Response};
9use lsp_types::{ClientCapabilities, NumberOrString}; 9use lsp_types::{ClientCapabilities, NumberOrString};
10use ra_ide_api::{Canceled, FeatureFlags, FileId, LibraryData}; 10use ra_ide_api::{Canceled, FeatureFlags, FileId, LibraryData};
11use ra_prof::profile; 11use 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
197fn main_loop_inner( 195fn 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;