aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server/src
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_lsp_server/src')
-rw-r--r--crates/ra_lsp_server/src/main_loop.rs81
1 files changed, 42 insertions, 39 deletions
diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs
index ab22052d9..8f41937dc 100644
--- a/crates/ra_lsp_server/src/main_loop.rs
+++ b/crates/ra_lsp_server/src/main_loop.rs
@@ -225,27 +225,15 @@ fn main_loop_inner(
225 let resp = RawResponse::ok::<req::CollectGarbage>(id, &()); 225 let resp = RawResponse::ok::<req::CollectGarbage>(id, &());
226 msg_sender.send(resp.into()).unwrap() 226 msg_sender.send(resp.into()).unwrap()
227 } 227 }
228 Err(req) => { 228 Err(req) => on_request(
229 match on_request( 229 state,
230 state, 230 pending_requests,
231 pending_requests, 231 pool,
232 pool, 232 &task_sender,
233 &task_sender, 233 msg_sender,
234 loop_start, 234 loop_start,
235 req, 235 req,
236 )? { 236 )?,
237 None => (),
238 Some(req) => {
239 log::error!("unknown request: {:?}", req);
240 let resp = RawResponse::err(
241 req.id,
242 ErrorCode::MethodNotFound as i32,
243 "unknown request".to_string(),
244 );
245 msg_sender.send(resp.into()).unwrap()
246 }
247 }
248 }
249 } 237 }
250 } 238 }
251 RawMessage::Notification(not) => { 239 RawMessage::Notification(not) => {
@@ -320,12 +308,20 @@ fn on_request(
320 pending_requests: &mut PendingRequests, 308 pending_requests: &mut PendingRequests,
321 pool: &ThreadPool, 309 pool: &ThreadPool,
322 sender: &Sender<Task>, 310 sender: &Sender<Task>,
311 msg_sender: &Sender<RawMessage>,
323 request_received: Instant, 312 request_received: Instant,
324 req: RawRequest, 313 req: RawRequest,
325) -> Result<Option<RawRequest>> { 314) -> Result<()> {
326 let method = req.method.clone(); 315 let mut pool_dispatcher = PoolDispatcher {
327 let mut pool_dispatcher = PoolDispatcher { req: Some(req), res: None, pool, world, sender }; 316 req: Some(req),
328 let req = pool_dispatcher 317 pool,
318 world,
319 sender,
320 msg_sender,
321 pending_requests,
322 request_received,
323 };
324 pool_dispatcher
329 .on::<req::AnalyzerStatus>(handlers::handle_analyzer_status)? 325 .on::<req::AnalyzerStatus>(handlers::handle_analyzer_status)?
330 .on::<req::SyntaxTree>(handlers::handle_syntax_tree)? 326 .on::<req::SyntaxTree>(handlers::handle_syntax_tree)?
331 .on::<req::ExtendSelection>(handlers::handle_extend_selection)? 327 .on::<req::ExtendSelection>(handlers::handle_extend_selection)?
@@ -355,13 +351,7 @@ fn on_request(
355 .on::<req::Formatting>(handlers::handle_formatting)? 351 .on::<req::Formatting>(handlers::handle_formatting)?
356 .on::<req::DocumentHighlightRequest>(handlers::handle_document_highlight)? 352 .on::<req::DocumentHighlightRequest>(handlers::handle_document_highlight)?
357 .finish(); 353 .finish();
358 match req { 354 Ok(())
359 Ok(id) => {
360 pending_requests.start(PendingRequest { id, method, received: request_received });
361 Ok(None)
362 }
363 Err(req) => Ok(Some(req)),
364 }
365} 355}
366 356
367fn on_notification( 357fn on_notification(
@@ -435,10 +425,12 @@ fn on_notification(
435 425
436struct PoolDispatcher<'a> { 426struct PoolDispatcher<'a> {
437 req: Option<RawRequest>, 427 req: Option<RawRequest>,
438 res: Option<u64>,
439 pool: &'a ThreadPool, 428 pool: &'a ThreadPool,
440 world: &'a mut ServerWorldState, 429 world: &'a mut ServerWorldState,
430 pending_requests: &'a mut PendingRequests,
431 msg_sender: &'a Sender<RawMessage>,
441 sender: &'a Sender<Task>, 432 sender: &'a Sender<Task>,
433 request_received: Instant,
442} 434}
443 435
444impl<'a> PoolDispatcher<'a> { 436impl<'a> PoolDispatcher<'a> {
@@ -459,7 +451,11 @@ impl<'a> PoolDispatcher<'a> {
459 return Ok(self); 451 return Ok(self);
460 } 452 }
461 }; 453 };
462 self.res = Some(id); 454 self.pending_requests.start(PendingRequest {
455 id,
456 method: R::METHOD.to_string(),
457 received: self.request_received,
458 });
463 459
464 // Real time requests block user typing, so we should react quickly to them. 460 // Real time requests block user typing, so we should react quickly to them.
465 // Currently this means that we try to cancel background jobs if we don't have 461 // Currently this means that we try to cancel background jobs if we don't have
@@ -483,11 +479,18 @@ impl<'a> PoolDispatcher<'a> {
483 Ok(self) 479 Ok(self)
484 } 480 }
485 481
486 fn finish(&mut self) -> std::result::Result<u64, RawRequest> { 482 fn finish(&mut self) {
487 match (self.res.take(), self.req.take()) { 483 match self.req.take() {
488 (Some(res), None) => Ok(res), 484 None => (),
489 (None, Some(req)) => Err(req), 485 Some(req) => {
490 _ => unreachable!(), 486 log::error!("unknown request: {:?}", req);
487 let resp = RawResponse::err(
488 req.id,
489 ErrorCode::MethodNotFound as i32,
490 "unknown request".to_string(),
491 );
492 self.msg_sender.send(resp.into()).unwrap();
493 }
491 } 494 }
492 } 495 }
493} 496}