From 2d2585e03feeaa4a83d59a7ea2cdfbe948526840 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 29 Jan 2020 10:46:56 +0100 Subject: Don't compute diagnostics on the main thread closes #2909 --- crates/ra_lsp_server/src/main_loop.rs | 56 +++++++++++++++++------------------ 1 file changed, 28 insertions(+), 28 deletions(-) (limited to 'crates') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 15bf519c9..52c7e2bdb 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -9,7 +9,7 @@ use std::{error::Error, fmt, panic, path::PathBuf, sync::Arc, time::Instant}; use crossbeam_channel::{select, unbounded, RecvError, Sender}; use lsp_server::{Connection, ErrorCode, Message, Notification, Request, RequestId, Response}; -use lsp_types::{ClientCapabilities, NumberOrString, Url}; +use lsp_types::{ClientCapabilities, NumberOrString}; use ra_cargo_watch::{CheckOptions, CheckTask}; use ra_ide::{Canceled, FeatureFlags, FileId, LibraryData, SourceRootId}; use ra_prof::profile; @@ -352,7 +352,7 @@ fn loop_turn( world_state.maybe_collect_garbage(); loop_state.in_flight_libraries -= 1; } - Event::CheckWatcher(task) => on_check_task(task, world_state, task_sender)?, + Event::CheckWatcher(task) => on_check_task(pool, task, world_state, task_sender)?, Event::Msg(msg) => match msg { Message::Request(req) => on_request( world_state, @@ -602,31 +602,23 @@ fn on_notification( } fn on_check_task( + pool: &ThreadPool, task: CheckTask, world_state: &mut WorldState, task_sender: &Sender, ) -> Result<()> { - match task { + let urls = match task { CheckTask::ClearDiagnostics => { let state = Arc::get_mut(&mut world_state.check_watcher.state) .expect("couldn't get check watcher state as mutable"); - let cleared_files = state.clear(); - - // Send updated diagnostics for each cleared file - for url in cleared_files { - publish_diagnostics_for_url(&url, world_state, task_sender)?; - } + state.clear() } CheckTask::AddDiagnostic(url, diagnostic) => { let state = Arc::get_mut(&mut world_state.check_watcher.state) .expect("couldn't get check watcher state as mutable"); state.add_diagnostic_with_fixes(url.clone(), diagnostic); - - // We manually send a diagnostic update when the watcher asks - // us to, to avoid the issue of having to change the file to - // receive updated diagnostics. - publish_diagnostics_for_url(&url, world_state, task_sender)?; + vec![url] } CheckTask::Status(progress) => { @@ -636,22 +628,30 @@ fn on_check_task( }; let not = notification_new::(params); task_sender.send(Task::Notify(not)).unwrap(); + Vec::new() } - } - Ok(()) -} + }; + + let subscriptions = urls + .into_iter() + .map(|url| { + let path = url.to_file_path().map_err(|()| format!("invalid uri: {}", url))?; + Ok(world_state.vfs.read().path2file(&path).map(|it| FileId(it.0))) + }) + .filter_map(|res| res.transpose()) + .collect::>>()?; + + // We manually send a diagnostic update when the watcher asks + // us to, to avoid the issue of having to change the file to + // receive updated diagnostics. + update_file_notifications_on_threadpool( + pool, + world_state.snapshot(), + false, + task_sender.clone(), + subscriptions, + ); -fn publish_diagnostics_for_url( - url: &Url, - world_state: &WorldState, - task_sender: &Sender, -) -> Result<()> { - let path = url.to_file_path().map_err(|()| format!("invalid uri: {}", url))?; - if let Some(file_id) = world_state.vfs.read().path2file(&path) { - let params = handlers::publish_diagnostics(&world_state.snapshot(), FileId(file_id.0))?; - let not = notification_new::(params); - task_sender.send(Task::Notify(not)).unwrap(); - } Ok(()) } -- cgit v1.2.3