mirror of
https://github.com/denoland/deno.git
synced 2025-08-03 10:33:54 +00:00
perf(lsp): cancellable TS diagnostics (#13565)
This commit is contained in:
parent
3a5ddeb03f
commit
37aba8f754
3 changed files with 131 additions and 17 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue