diff options
Diffstat (limited to 'crates/ra_lsp_server/src/main_loop/mod.rs')
-rw-r--r-- | crates/ra_lsp_server/src/main_loop/mod.rs | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/crates/ra_lsp_server/src/main_loop/mod.rs b/crates/ra_lsp_server/src/main_loop/mod.rs index a11baf4aa..b35ebd38b 100644 --- a/crates/ra_lsp_server/src/main_loop/mod.rs +++ b/crates/ra_lsp_server/src/main_loop/mod.rs | |||
@@ -8,9 +8,9 @@ use gen_lsp_server::{ | |||
8 | handle_shutdown, ErrorCode, RawMessage, RawNotification, RawRequest, RawResponse, | 8 | handle_shutdown, ErrorCode, RawMessage, RawNotification, RawRequest, RawResponse, |
9 | }; | 9 | }; |
10 | use languageserver_types::NumberOrString; | 10 | use languageserver_types::NumberOrString; |
11 | use ra_analysis::{FileId, JobHandle, JobToken, LibraryData}; | 11 | use ra_analysis::{FileId, LibraryData}; |
12 | use rayon::{self, ThreadPool}; | 12 | use rayon::{self, ThreadPool}; |
13 | use rustc_hash::FxHashMap; | 13 | use rustc_hash::FxHashSet; |
14 | use serde::{de::DeserializeOwned, Serialize}; | 14 | use serde::{de::DeserializeOwned, Serialize}; |
15 | 15 | ||
16 | use crate::{ | 16 | use crate::{ |
@@ -47,7 +47,7 @@ pub fn main_loop( | |||
47 | info!("server initialized, serving requests"); | 47 | info!("server initialized, serving requests"); |
48 | let mut state = ServerWorldState::new(); | 48 | let mut state = ServerWorldState::new(); |
49 | 49 | ||
50 | let mut pending_requests = FxHashMap::default(); | 50 | let mut pending_requests = FxHashSet::default(); |
51 | let mut subs = Subscriptions::new(); | 51 | let mut subs = Subscriptions::new(); |
52 | let main_res = main_loop_inner( | 52 | let main_res = main_loop_inner( |
53 | internal_mode, | 53 | internal_mode, |
@@ -92,7 +92,7 @@ fn main_loop_inner( | |||
92 | fs_worker: Worker<PathBuf, (PathBuf, Vec<FileEvent>)>, | 92 | fs_worker: Worker<PathBuf, (PathBuf, Vec<FileEvent>)>, |
93 | ws_worker: Worker<PathBuf, Result<CargoWorkspace>>, | 93 | ws_worker: Worker<PathBuf, Result<CargoWorkspace>>, |
94 | state: &mut ServerWorldState, | 94 | state: &mut ServerWorldState, |
95 | pending_requests: &mut FxHashMap<u64, JobHandle>, | 95 | pending_requests: &mut FxHashSet<u64>, |
96 | subs: &mut Subscriptions, | 96 | subs: &mut Subscriptions, |
97 | ) -> Result<()> { | 97 | ) -> Result<()> { |
98 | let (libdata_sender, libdata_receiver) = unbounded(); | 98 | let (libdata_sender, libdata_receiver) = unbounded(); |
@@ -204,14 +204,13 @@ fn main_loop_inner( | |||
204 | fn on_task( | 204 | fn on_task( |
205 | task: Task, | 205 | task: Task, |
206 | msg_sender: &Sender<RawMessage>, | 206 | msg_sender: &Sender<RawMessage>, |
207 | pending_requests: &mut FxHashMap<u64, JobHandle>, | 207 | pending_requests: &mut FxHashSet<u64>, |
208 | ) { | 208 | ) { |
209 | match task { | 209 | match task { |
210 | Task::Respond(response) => { | 210 | Task::Respond(response) => { |
211 | if let Some(handle) = pending_requests.remove(&response.id) { | 211 | if pending_requests.remove(&response.id) { |
212 | assert!(handle.has_completed()); | 212 | msg_sender.send(RawMessage::Response(response)) |
213 | } | 213 | } |
214 | msg_sender.send(RawMessage::Response(response)) | ||
215 | } | 214 | } |
216 | Task::Notify(n) => msg_sender.send(RawMessage::Notification(n)), | 215 | Task::Notify(n) => msg_sender.send(RawMessage::Notification(n)), |
217 | } | 216 | } |
@@ -219,7 +218,7 @@ fn on_task( | |||
219 | 218 | ||
220 | fn on_request( | 219 | fn on_request( |
221 | world: &mut ServerWorldState, | 220 | world: &mut ServerWorldState, |
222 | pending_requests: &mut FxHashMap<u64, JobHandle>, | 221 | pending_requests: &mut FxHashSet<u64>, |
223 | pool: &ThreadPool, | 222 | pool: &ThreadPool, |
224 | sender: &Sender<Task>, | 223 | sender: &Sender<Task>, |
225 | req: RawRequest, | 224 | req: RawRequest, |
@@ -248,10 +247,13 @@ fn on_request( | |||
248 | .on::<req::CodeActionRequest>(handlers::handle_code_action)? | 247 | .on::<req::CodeActionRequest>(handlers::handle_code_action)? |
249 | .on::<req::FoldingRangeRequest>(handlers::handle_folding_range)? | 248 | .on::<req::FoldingRangeRequest>(handlers::handle_folding_range)? |
250 | .on::<req::SignatureHelpRequest>(handlers::handle_signature_help)? | 249 | .on::<req::SignatureHelpRequest>(handlers::handle_signature_help)? |
250 | .on::<req::PrepareRenameRequest>(handlers::handle_prepare_rename)? | ||
251 | .on::<req::Rename>(handlers::handle_rename)? | ||
252 | .on::<req::References>(handlers::handle_references)? | ||
251 | .finish(); | 253 | .finish(); |
252 | match req { | 254 | match req { |
253 | Ok((id, handle)) => { | 255 | Ok(id) => { |
254 | let inserted = pending_requests.insert(id, handle).is_none(); | 256 | let inserted = pending_requests.insert(id); |
255 | assert!(inserted, "duplicate request: {}", id); | 257 | assert!(inserted, "duplicate request: {}", id); |
256 | Ok(None) | 258 | Ok(None) |
257 | } | 259 | } |
@@ -262,7 +264,7 @@ fn on_request( | |||
262 | fn on_notification( | 264 | fn on_notification( |
263 | msg_sender: &Sender<RawMessage>, | 265 | msg_sender: &Sender<RawMessage>, |
264 | state: &mut ServerWorldState, | 266 | state: &mut ServerWorldState, |
265 | pending_requests: &mut FxHashMap<u64, JobHandle>, | 267 | pending_requests: &mut FxHashSet<u64>, |
266 | subs: &mut Subscriptions, | 268 | subs: &mut Subscriptions, |
267 | not: RawNotification, | 269 | not: RawNotification, |
268 | ) -> Result<()> { | 270 | ) -> Result<()> { |
@@ -274,9 +276,7 @@ fn on_notification( | |||
274 | panic!("string id's not supported: {:?}", id); | 276 | panic!("string id's not supported: {:?}", id); |
275 | } | 277 | } |
276 | }; | 278 | }; |
277 | if let Some(handle) = pending_requests.remove(&id) { | 279 | pending_requests.remove(&id); |
278 | handle.cancel(); | ||
279 | } | ||
280 | return Ok(()); | 280 | return Ok(()); |
281 | } | 281 | } |
282 | Err(not) => not, | 282 | Err(not) => not, |
@@ -333,7 +333,7 @@ fn on_notification( | |||
333 | 333 | ||
334 | struct PoolDispatcher<'a> { | 334 | struct PoolDispatcher<'a> { |
335 | req: Option<RawRequest>, | 335 | req: Option<RawRequest>, |
336 | res: Option<(u64, JobHandle)>, | 336 | res: Option<u64>, |
337 | pool: &'a ThreadPool, | 337 | pool: &'a ThreadPool, |
338 | world: &'a ServerWorldState, | 338 | world: &'a ServerWorldState, |
339 | sender: &'a Sender<Task>, | 339 | sender: &'a Sender<Task>, |
@@ -342,7 +342,7 @@ struct PoolDispatcher<'a> { | |||
342 | impl<'a> PoolDispatcher<'a> { | 342 | impl<'a> PoolDispatcher<'a> { |
343 | fn on<'b, R>( | 343 | fn on<'b, R>( |
344 | &'b mut self, | 344 | &'b mut self, |
345 | f: fn(ServerWorld, R::Params, JobToken) -> Result<R::Result>, | 345 | f: fn(ServerWorld, R::Params) -> Result<R::Result>, |
346 | ) -> Result<&'b mut Self> | 346 | ) -> Result<&'b mut Self> |
347 | where | 347 | where |
348 | R: req::Request, | 348 | R: req::Request, |
@@ -355,11 +355,10 @@ impl<'a> PoolDispatcher<'a> { | |||
355 | }; | 355 | }; |
356 | match req.cast::<R>() { | 356 | match req.cast::<R>() { |
357 | Ok((id, params)) => { | 357 | Ok((id, params)) => { |
358 | let (handle, token) = JobHandle::new(); | ||
359 | let world = self.world.snapshot(); | 358 | let world = self.world.snapshot(); |
360 | let sender = self.sender.clone(); | 359 | let sender = self.sender.clone(); |
361 | self.pool.spawn(move || { | 360 | self.pool.spawn(move || { |
362 | let resp = match f(world, params, token) { | 361 | let resp = match f(world, params) { |
363 | Ok(resp) => RawResponse::ok::<R>(id, &resp), | 362 | Ok(resp) => RawResponse::ok::<R>(id, &resp), |
364 | Err(e) => { | 363 | Err(e) => { |
365 | RawResponse::err(id, ErrorCode::InternalError as i32, e.to_string()) | 364 | RawResponse::err(id, ErrorCode::InternalError as i32, e.to_string()) |
@@ -368,14 +367,14 @@ impl<'a> PoolDispatcher<'a> { | |||
368 | let task = Task::Respond(resp); | 367 | let task = Task::Respond(resp); |
369 | sender.send(task); | 368 | sender.send(task); |
370 | }); | 369 | }); |
371 | self.res = Some((id, handle)); | 370 | self.res = Some(id); |
372 | } | 371 | } |
373 | Err(req) => self.req = Some(req), | 372 | Err(req) => self.req = Some(req), |
374 | } | 373 | } |
375 | Ok(self) | 374 | Ok(self) |
376 | } | 375 | } |
377 | 376 | ||
378 | fn finish(&mut self) -> ::std::result::Result<(u64, JobHandle), RawRequest> { | 377 | fn finish(&mut self) -> ::std::result::Result<u64, RawRequest> { |
379 | match (self.res.take(), self.req.take()) { | 378 | match (self.res.take(), self.req.take()) { |
380 | (Some(res), None) => Ok(res), | 379 | (Some(res), None) => Ok(res), |
381 | (None, Some(req)) => Err(req), | 380 | (None, Some(req)) => Err(req), |