diff options
Diffstat (limited to 'cli/lsp/diagnostics.rs')
-rw-r--r-- | cli/lsp/diagnostics.rs | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/cli/lsp/diagnostics.rs b/cli/lsp/diagnostics.rs index 4f7e50725..65e170be2 100644 --- a/cli/lsp/diagnostics.rs +++ b/cli/lsp/diagnostics.rs @@ -218,6 +218,7 @@ impl DiagnosticsServer { snapshot.clone(), &config, &ts_server, + token.clone(), ) .await .map_err(|err| { @@ -495,6 +496,7 @@ async fn generate_ts_diagnostics( snapshot: Arc<language_server::StateSnapshot>, config: &ConfigSnapshot, ts_server: &tsc::TsServer, + token: CancellationToken, ) -> Result<DiagnosticVec, AnyError> { let mut diagnostics_vec = Vec::new(); let specifiers = snapshot @@ -509,7 +511,9 @@ async fn generate_ts_diagnostics( .partition::<Vec<_>, _>(|s| config.specifier_enabled(s)); let ts_diagnostics_map: TsDiagnosticsMap = if !enabled_specifiers.is_empty() { let req = tsc::RequestMethod::GetDiagnostics(enabled_specifiers); - ts_server.request(snapshot.clone(), req).await? + ts_server + .request_with_cancellation(snapshot.clone(), req, token) + .await? } else { Default::default() }; @@ -781,10 +785,14 @@ let c: number = "a"; ) .await; assert_eq!(get_diagnostics_for_single(diagnostics).len(), 6); - let diagnostics = - generate_ts_diagnostics(snapshot.clone(), &enabled_config, &ts_server) - .await - .unwrap(); + let diagnostics = generate_ts_diagnostics( + snapshot.clone(), + &enabled_config, + &ts_server, + Default::default(), + ) + .await + .unwrap(); assert_eq!(get_diagnostics_for_single(diagnostics).len(), 4); let diagnostics = generate_deps_diagnostics( &snapshot, @@ -817,10 +825,14 @@ let c: number = "a"; ) .await; assert_eq!(get_diagnostics_for_single(diagnostics).len(), 0); - let diagnostics = - generate_ts_diagnostics(snapshot.clone(), &disabled_config, &ts_server) - .await - .unwrap(); + let diagnostics = generate_ts_diagnostics( + snapshot.clone(), + &disabled_config, + &ts_server, + Default::default(), + ) + .await + .unwrap(); assert_eq!(get_diagnostics_for_single(diagnostics).len(), 0); let diagnostics = generate_deps_diagnostics( &snapshot, @@ -839,4 +851,27 @@ let c: number = "a"; let (_, _, diagnostics) = diagnostic_vec.into_iter().next().unwrap(); diagnostics } + + #[tokio::test] + async fn test_cancelled_ts_diagnostics_request() { + let specifier = ModuleSpecifier::parse("file:///a.ts").unwrap(); + let (snapshot, _) = setup(&[( + "file:///a.ts", + r#"export let a: string = 5;"#, + 1, + LanguageId::TypeScript, + )]); + let snapshot = Arc::new(snapshot); + let ts_server = TsServer::new(Default::default()); + + let config = mock_config(); + let token = CancellationToken::new(); + token.cancel(); + let diagnostics = + generate_ts_diagnostics(snapshot.clone(), &config, &ts_server, token) + .await + .unwrap(); + // should be none because it's cancelled + assert_eq!(diagnostics.len(), 0); + } } |