diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2021-11-23 20:04:27 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-23 20:04:27 -0500 |
commit | 0f90b4665a691e1c7393e5bd116c7f6a0819692e (patch) | |
tree | e54819826d383136a1e2aff0ad56f683b6cc0b65 /cli/lsp/diagnostics.rs | |
parent | fd6d0e309ca42f4b98ab75039eefb8a8a923fafb (diff) |
chore(lsp): fix possible race condition with tests expecting 3 publishDiagnostics messages (#12868)
The tests expect 3 publish notifications. It was possible for less than 3 to occur if two or more tasks set the diagnostics in the collection, exited the lock at the same time, then called `publish_diagnostics`
Diffstat (limited to 'cli/lsp/diagnostics.rs')
-rw-r--r-- | cli/lsp/diagnostics.rs | 34 |
1 files changed, 14 insertions, 20 deletions
diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs index 9bf45c5ae..8a0d50ef1 100644 --- a/cli/lsp/diagnostics.rs +++ b/cli/lsp/diagnostics.rs @@ -568,10 +568,9 @@ async fn generate_deps_diagnostics( /// Publishes diagnostics to the client. async fn publish_diagnostics( client: &lspower::Client, - collection: Arc<Mutex<DiagnosticCollection>>, + collection: &mut DiagnosticCollection, snapshot: &language_server::StateSnapshot, ) { - let mut collection = collection.lock().await; if let Some(changes) = collection.take_changes() { for specifier in changes { let mut diagnostics: Vec<lsp::Diagnostic> = @@ -625,13 +624,12 @@ async fn update_diagnostics( error!("Error generating lint diagnostics: {}", err); }) .unwrap_or_default(); - { - let mut collection = collection.lock().await; - for diagnostic_record in diagnostics { - collection.set(DiagnosticSource::DenoLint, diagnostic_record); - } + + let mut collection = collection.lock().await; + for diagnostic_record in diagnostics { + collection.set(DiagnosticSource::DenoLint, diagnostic_record); } - publish_diagnostics(client, collection, &snapshot).await; + publish_diagnostics(client, &mut collection, &snapshot).await; snapshot.performance.measure(mark); }; @@ -647,13 +645,11 @@ async fn update_diagnostics( error!("Error generating TypeScript diagnostics: {}", err); }) .unwrap_or_default(); - { - let mut collection = collection.lock().await; - for diagnostic_record in diagnostics { - collection.set(DiagnosticSource::TypeScript, diagnostic_record); - } + let mut collection = collection.lock().await; + for diagnostic_record in diagnostics { + collection.set(DiagnosticSource::TypeScript, diagnostic_record); } - publish_diagnostics(client, collection, &snapshot).await; + publish_diagnostics(client, &mut collection, &snapshot).await; snapshot.performance.measure(mark); }; @@ -669,13 +665,11 @@ async fn update_diagnostics( error!("Error generating Deno diagnostics: {}", err); }) .unwrap_or_default(); - { - let mut collection = collection.lock().await; - for diagnostic_record in diagnostics { - collection.set(DiagnosticSource::Deno, diagnostic_record); - } + let mut collection = collection.lock().await; + for diagnostic_record in diagnostics { + collection.set(DiagnosticSource::Deno, diagnostic_record); } - publish_diagnostics(client, collection, &snapshot).await; + publish_diagnostics(client, &mut collection, &snapshot).await; snapshot.performance.measure(mark); }; |