From 05aa5b854b230c2f6ba182c0f2c94f3de9a47204 Mon Sep 17 00:00:00 2001 From: Emil Lauridsen Date: Thu, 23 Jan 2020 09:26:08 +0100 Subject: Remove RWLock from check watcher. @matklad mentioned this might be a good idea. So the general idea is that we don't really need the lock, as we can just clone the check watcher state when creating a snapshot. We can then use `Arc::get_mut` to get mutable access to the state from `WorldState` when needed. Running with this it seems to improve responsiveness a bit while cargo is running, but I have no hard numbers to prove it. In any case, a serialization point less is always better when we're trying to be responsive. --- crates/ra_lsp_server/src/main_loop.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'crates/ra_lsp_server/src/main_loop.rs') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 7822be2e2..746a8fbe9 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -586,12 +586,14 @@ fn on_notification( fn on_check_task( task: CheckTask, - world_state: &WorldState, + world_state: &mut WorldState, task_sender: &Sender, ) -> Result<()> { match task { CheckTask::ClearDiagnostics => { - let cleared_files = world_state.check_watcher.state.write().clear(); + 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 { @@ -600,11 +602,9 @@ fn on_check_task( } CheckTask::AddDiagnostic(url, diagnostic) => { - world_state - .check_watcher - .state - .write() - .add_diagnostic_with_fixes(url.clone(), 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 -- cgit v1.2.3 From b90ea640e6484788f8728be6e48cc55d90e488ba Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 24 Jan 2020 16:35:37 +0100 Subject: Cancel requests during shutdown --- crates/ra_lsp_server/src/main_loop.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_lsp_server/src/main_loop.rs') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 746a8fbe9..83adf9711 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -210,7 +210,7 @@ pub fn main_loop( )?; } } - + world_state.analysis_host.request_cancellation(); log::info!("waiting for tasks to finish..."); task_receiver.into_iter().for_each(|task| { on_task(task, &connection.sender, &mut loop_state.pending_requests, &mut world_state) -- cgit v1.2.3 From 40109941db20180eb71b70c23c578fed5244bd74 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 25 Jan 2020 13:27:36 +0100 Subject: Use default threadpool size --- crates/ra_lsp_server/src/main_loop.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'crates/ra_lsp_server/src/main_loop.rs') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 83adf9711..315f4a4d6 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -29,9 +29,6 @@ use crate::{ Result, ServerConfig, }; -const THREADPOOL_SIZE: usize = 8; -const MAX_IN_FLIGHT_LIBS: usize = THREADPOOL_SIZE - 3; - #[derive(Debug)] pub struct LspError { pub code: i32, @@ -168,7 +165,7 @@ pub fn main_loop( ) }; - let pool = ThreadPool::new(THREADPOOL_SIZE); + let pool = ThreadPool::default(); let (task_sender, task_receiver) = unbounded::(); let (libdata_sender, libdata_receiver) = unbounded::(); @@ -371,7 +368,8 @@ fn loop_turn( loop_state.pending_libraries.extend(changes); } - while loop_state.in_flight_libraries < MAX_IN_FLIGHT_LIBS + let max_in_flight_libs = pool.max_count().saturating_sub(2).max(1); + while loop_state.in_flight_libraries < max_in_flight_libs && !loop_state.pending_libraries.is_empty() { let (root, files) = loop_state.pending_libraries.pop().unwrap(); -- cgit v1.2.3 From 493a903f226d148fec4b539f65b78a408e4dcb2c Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 26 Jan 2020 12:02:56 +0100 Subject: Bump main thread priority on windows --- crates/ra_lsp_server/src/main_loop.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'crates/ra_lsp_server/src/main_loop.rs') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 315f4a4d6..15bf519c9 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -57,6 +57,25 @@ pub fn main_loop( ) -> Result<()> { log::info!("server_config: {:#?}", config); + // Windows scheduler implements priority boosts: if thread waits for an + // event (like a condvar), and event fires, priority of the thread is + // temporary bumped. This optimization backfires in our case: each time the + // `main_loop` schedules a task to run on a threadpool, the worker threads + // gets a higher priority, and (on a machine with fewer cores) displaces the + // main loop! We work-around this by marking the main loop as a + // higher-priority thread. + // + // https://docs.microsoft.com/en-us/windows/win32/procthread/scheduling-priorities + // https://docs.microsoft.com/en-us/windows/win32/procthread/priority-boosts + // https://github.com/rust-analyzer/rust-analyzer/issues/2835 + #[cfg(windows)] + unsafe { + use winapi::um::processthreadsapi::*; + let thread = GetCurrentThread(); + let thread_priority_above_normal = 1; + SetThreadPriority(thread, thread_priority_above_normal); + } + let mut loop_state = LoopState::default(); let mut world_state = { let feature_flags = { -- cgit v1.2.3 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/ra_lsp_server/src/main_loop.rs') 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 From aaa4861a0b2f6cb2f9f271961d9836976e94b139 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 29 Jan 2020 11:15:08 +0100 Subject: More uniform naming --- crates/ra_lsp_server/src/main_loop.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'crates/ra_lsp_server/src/main_loop.rs') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 52c7e2bdb..2daaf1b4a 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -452,7 +452,7 @@ fn on_request( world: &mut WorldState, pending_requests: &mut PendingRequests, pool: &ThreadPool, - sender: &Sender, + task_sender: &Sender, msg_sender: &Sender, request_received: Instant, req: Request, @@ -461,7 +461,7 @@ fn on_request( req: Some(req), pool, world, - sender, + task_sender, msg_sender, pending_requests, request_received, @@ -661,7 +661,7 @@ struct PoolDispatcher<'a> { world: &'a mut WorldState, pending_requests: &'a mut PendingRequests, msg_sender: &'a Sender, - sender: &'a Sender, + task_sender: &'a Sender, request_received: Instant, } @@ -708,7 +708,7 @@ impl<'a> PoolDispatcher<'a> { self.pool.execute({ let world = self.world.snapshot(); - let sender = self.sender.clone(); + let sender = self.task_sender.clone(); move || { let result = f(world, params); let task = result_to_task::(id, result); @@ -786,7 +786,7 @@ fn update_file_notifications_on_threadpool( pool: &ThreadPool, world: WorldSnapshot, publish_decorations: bool, - sender: Sender, + task_sender: Sender, subscriptions: Vec, ) { log::trace!("updating notifications for {:?}", subscriptions); @@ -802,7 +802,7 @@ fn update_file_notifications_on_threadpool( } Ok(params) => { let not = notification_new::(params); - sender.send(Task::Notify(not)).unwrap(); + task_sender.send(Task::Notify(not)).unwrap(); } } } @@ -815,7 +815,7 @@ fn update_file_notifications_on_threadpool( } Ok(params) => { let not = notification_new::(params); - sender.send(Task::Notify(not)).unwrap(); + task_sender.send(Task::Notify(not)).unwrap(); } } } -- cgit v1.2.3 From 9753eb98ccbe4c5abefacde2fc60e919cf3c5645 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 29 Jan 2020 11:21:49 +0100 Subject: Complain loudly if the main loop is blocked --- crates/ra_lsp_server/src/main_loop.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'crates/ra_lsp_server/src/main_loop.rs') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 2daaf1b4a..9901fe931 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -5,7 +5,14 @@ mod handlers; mod subscriptions; pub(crate) mod pending_requests; -use std::{error::Error, fmt, panic, path::PathBuf, sync::Arc, time::Instant}; +use std::{ + env, + error::Error, + fmt, panic, + path::PathBuf, + sync::Arc, + time::{Duration, Instant}, +}; use crossbeam_channel::{select, unbounded, RecvError, Sender}; use lsp_server::{Connection, ErrorCode, Message, Notification, Request, RequestId, Response}; @@ -425,6 +432,19 @@ fn loop_turn( loop_state.subscriptions.subscriptions(), ) } + + let loop_duration = loop_start.elapsed(); + if loop_duration > Duration::from_millis(10) { + log::error!("overly long loop turn: {:?}", loop_duration); + if env::var("RA_PROFILE").is_ok() { + show_message( + req::MessageType::Error, + format!("overly long loop turn: {:?}", loop_duration), + &connection.sender, + ); + } + } + Ok(()) } -- cgit v1.2.3 From 7cc0a8652870402db3b072cab030ba28d6b96b39 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 29 Jan 2020 14:04:10 +0100 Subject: Fix long loop timeout --- crates/ra_lsp_server/src/main_loop.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_lsp_server/src/main_loop.rs') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 9901fe931..d850ded37 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -434,7 +434,7 @@ fn loop_turn( } let loop_duration = loop_start.elapsed(); - if loop_duration > Duration::from_millis(10) { + if loop_duration > Duration::from_millis(100) { log::error!("overly long loop turn: {:?}", loop_duration); if env::var("RA_PROFILE").is_ok() { show_message( -- cgit v1.2.3 From 24ad1cce2c3cf2c0ce8288fc02c4c55529598990 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 2 Feb 2020 18:54:26 +0100 Subject: Avoid premature pessimization The extra allocation for message should not matter here at all, but using a static string is just as ergonomic, if not more, and there's no reason to write deliberately slow code --- crates/ra_lsp_server/src/main_loop.rs | 1 - 1 file changed, 1 deletion(-) (limited to 'crates/ra_lsp_server/src/main_loop.rs') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index d850ded37..508fe08c0 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -403,7 +403,6 @@ fn loop_turn( let sender = libdata_sender.clone(); pool.execute(move || { log::info!("indexing {:?} ... ", root); - let _p = profile(&format!("indexed {:?}", root)); let data = LibraryData::prepare(root, files); sender.send(data).unwrap(); }); -- cgit v1.2.3 From 790788d5f4013d8d92f110bc12a581d18cf4b6ae Mon Sep 17 00:00:00 2001 From: Emil Lauridsen Date: Fri, 31 Jan 2020 19:23:25 +0100 Subject: Rework how we send diagnostics to client. The previous way of sending from the thread pool suffered from stale diagnostics due to being canceled before we could clear the old ones. The key change is moving to sending diagnostics from the main loop thread, but doing all the hard work in the thread pool. This should provide the best of both worlds, with little to no of the downsides. This should hopefully fix a lot of issues, but we'll need testing in each individual issue to be sure. --- crates/ra_lsp_server/src/main_loop.rs | 76 ++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 36 deletions(-) (limited to 'crates/ra_lsp_server/src/main_loop.rs') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 508fe08c0..12961ba37 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -17,16 +17,17 @@ use std::{ use crossbeam_channel::{select, unbounded, RecvError, Sender}; use lsp_server::{Connection, ErrorCode, Message, Notification, Request, RequestId, Response}; use lsp_types::{ClientCapabilities, NumberOrString}; -use ra_cargo_watch::{CheckOptions, CheckTask}; +use ra_cargo_watch::{url_from_path_with_drive_lowercasing, CheckOptions, CheckTask}; use ra_ide::{Canceled, FeatureFlags, FileId, LibraryData, SourceRootId}; use ra_prof::profile; -use ra_vfs::{VfsTask, Watch}; +use ra_vfs::{VfsFile, VfsTask, Watch}; use relative_path::RelativePathBuf; use rustc_hash::FxHashSet; use serde::{de::DeserializeOwned, Serialize}; use threadpool::ThreadPool; use crate::{ + diagnostics::DiagnosticTask, main_loop::{ pending_requests::{PendingRequest, PendingRequests}, subscriptions::Subscriptions, @@ -254,6 +255,7 @@ pub fn main_loop( enum Task { Respond(Response), Notify(Notification), + Diagnostic(DiagnosticTask), } enum Event { @@ -359,7 +361,7 @@ fn loop_turn( world_state.maybe_collect_garbage(); loop_state.in_flight_libraries -= 1; } - Event::CheckWatcher(task) => on_check_task(pool, task, world_state, task_sender)?, + Event::CheckWatcher(task) => on_check_task(task, world_state, task_sender)?, Event::Msg(msg) => match msg { Message::Request(req) => on_request( world_state, @@ -464,6 +466,7 @@ fn on_task( Task::Notify(n) => { msg_sender.send(n.into()).unwrap(); } + Task::Diagnostic(task) => on_diagnostic_task(task, msg_sender, state), } } @@ -621,23 +624,26 @@ fn on_notification( } fn on_check_task( - pool: &ThreadPool, task: CheckTask, world_state: &mut WorldState, task_sender: &Sender, ) -> Result<()> { - let urls = match task { + match task { CheckTask::ClearDiagnostics => { - let state = Arc::get_mut(&mut world_state.check_watcher.state) - .expect("couldn't get check watcher state as mutable"); - state.clear() + task_sender.send(Task::Diagnostic(DiagnosticTask::ClearCheck))?; } - 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); - vec![url] + CheckTask::AddDiagnostic { url, diagnostic, fixes } => { + let path = url.to_file_path().map_err(|()| format!("invalid uri: {}", url))?; + let file_id = world_state + .vfs + .read() + .path2file(&path) + .map(|it| FileId(it.0)) + .ok_or_else(|| format!("unknown file: {}", path.to_string_lossy()))?; + + task_sender + .send(Task::Diagnostic(DiagnosticTask::AddCheck(file_id, diagnostic, fixes)))?; } CheckTask::Status(progress) => { @@ -647,31 +653,30 @@ fn on_check_task( }; let not = notification_new::(params); task_sender.send(Task::Notify(not)).unwrap(); - Vec::new() } }; - 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::>>()?; + Ok(()) +} - // 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 on_diagnostic_task(task: DiagnosticTask, msg_sender: &Sender, state: &mut WorldState) { + let subscriptions = state.diagnostics.handle_task(task); - Ok(()) + for file_id in subscriptions { + let path = state.vfs.read().file2path(VfsFile(file_id.0)); + let uri = match url_from_path_with_drive_lowercasing(&path) { + Ok(uri) => uri, + Err(err) => { + log::error!("Couldn't convert path to url ({}): {:?}", err, path.to_string_lossy()); + continue; + } + }; + + let diagnostics = state.diagnostics.diagnostics_for(file_id).cloned().collect(); + let params = req::PublishDiagnosticsParams { uri, diagnostics, version: None }; + let not = notification_new::(params); + msg_sender.send(not.into()).unwrap(); + } } struct PoolDispatcher<'a> { @@ -819,9 +824,8 @@ fn update_file_notifications_on_threadpool( log::error!("failed to compute diagnostics: {:?}", e); } } - Ok(params) => { - let not = notification_new::(params); - task_sender.send(Task::Notify(not)).unwrap(); + Ok(task) => { + task_sender.send(Task::Diagnostic(task)).unwrap(); } } } -- cgit v1.2.3 From 5db7c8642beb1cd4c09359c3f3266d67557a30f9 Mon Sep 17 00:00:00 2001 From: Emil Lauridsen Date: Fri, 7 Feb 2020 12:30:29 +0100 Subject: Don't crash when recieving unkown file for cargo diagnostic. --- crates/ra_lsp_server/src/main_loop.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'crates/ra_lsp_server/src/main_loop.rs') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index 12961ba37..fcae37bb7 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -635,12 +635,16 @@ fn on_check_task( CheckTask::AddDiagnostic { url, diagnostic, fixes } => { let path = url.to_file_path().map_err(|()| format!("invalid uri: {}", url))?; - let file_id = world_state - .vfs - .read() - .path2file(&path) - .map(|it| FileId(it.0)) - .ok_or_else(|| format!("unknown file: {}", path.to_string_lossy()))?; + let file_id = match world_state.vfs.read().path2file(&path) { + Some(file) => FileId(file.0), + None => { + log::error!( + "File with cargo diagnostic not found in VFS: {}", + path.to_string_lossy() + ); + return Ok(()); + } + }; task_sender .send(Task::Diagnostic(DiagnosticTask::AddCheck(file_id, diagnostic, fixes)))?; -- cgit v1.2.3 From 137a878461662b7bf7f1acf3855b166c1c19fc2f Mon Sep 17 00:00:00 2001 From: Emil Lauridsen Date: Fri, 7 Feb 2020 12:35:36 +0100 Subject: to_string_lossy() -> display() --- crates/ra_lsp_server/src/main_loop.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'crates/ra_lsp_server/src/main_loop.rs') diff --git a/crates/ra_lsp_server/src/main_loop.rs b/crates/ra_lsp_server/src/main_loop.rs index fcae37bb7..ceff82fda 100644 --- a/crates/ra_lsp_server/src/main_loop.rs +++ b/crates/ra_lsp_server/src/main_loop.rs @@ -638,10 +638,7 @@ fn on_check_task( let file_id = match world_state.vfs.read().path2file(&path) { Some(file) => FileId(file.0), None => { - log::error!( - "File with cargo diagnostic not found in VFS: {}", - path.to_string_lossy() - ); + log::error!("File with cargo diagnostic not found in VFS: {}", path.display()); return Ok(()); } }; -- cgit v1.2.3