@@ -11,6 +11,7 @@ use deno_ast::swc::visit::VisitWith;
11
11
use deno_ast:: ParsedSource ;
12
12
use deno_ast:: SourceRange ;
13
13
use deno_ast:: SourceRangedForSpanned ;
14
+ use deno_core:: anyhow:: anyhow;
14
15
use deno_core:: error:: AnyError ;
15
16
use deno_core:: resolve_url;
16
17
use deno_core:: serde:: Deserialize ;
@@ -21,7 +22,7 @@ use deno_core::ModuleSpecifier;
21
22
use lazy_regex:: lazy_regex;
22
23
use once_cell:: sync:: Lazy ;
23
24
use regex:: Regex ;
24
- use tower_lsp :: jsonrpc :: Error as LspError ;
25
+ use tokio_util :: sync :: CancellationToken ;
25
26
use tower_lsp:: lsp_types as lsp;
26
27
27
28
use super :: analysis:: source_range_to_lsp_range;
@@ -30,7 +31,6 @@ use super::language_server;
30
31
use super :: text:: LineIndex ;
31
32
use super :: tsc;
32
33
use super :: tsc:: NavigationTree ;
33
- use crate :: lsp:: logging:: lsp_warn;
34
34
35
35
static ABSTRACT_MODIFIER : Lazy < Regex > = lazy_regex ! ( r"\babstract\b" ) ;
36
36
@@ -253,6 +253,7 @@ async fn resolve_implementation_code_lens(
253
253
code_lens : lsp:: CodeLens ,
254
254
data : CodeLensData ,
255
255
language_server : & language_server:: Inner ,
256
+ token : & CancellationToken ,
256
257
) -> Result < lsp:: CodeLens , AnyError > {
257
258
let asset_or_doc = language_server. get_asset_or_document ( & data. specifier ) ?;
258
259
let line_index = asset_or_doc. line_index ( ) ;
@@ -262,15 +263,25 @@ async fn resolve_implementation_code_lens(
262
263
language_server. snapshot ( ) ,
263
264
data. specifier . clone ( ) ,
264
265
line_index. offset_tsc ( code_lens. range . start ) ?,
266
+ token,
265
267
)
266
268
. await
267
269
. map_err ( |err| {
268
- lsp_warn ! ( "{err}" ) ;
269
- LspError :: internal_error ( )
270
+ if token. is_cancelled ( ) {
271
+ anyhow ! ( "request cancelled" )
272
+ } else {
273
+ anyhow ! (
274
+ "Unable to get implementation locations from TypeScript: {:#}" ,
275
+ err
276
+ )
277
+ }
270
278
} ) ?;
271
279
if let Some ( implementations) = maybe_implementations {
272
280
let mut locations = Vec :: new ( ) ;
273
281
for implementation in implementations {
282
+ if token. is_cancelled ( ) {
283
+ break ;
284
+ }
274
285
let implementation_specifier =
275
286
resolve_url ( & implementation. document_span . file_name ) ?;
276
287
let implementation_location =
@@ -326,17 +337,22 @@ async fn resolve_references_code_lens(
326
337
code_lens : lsp:: CodeLens ,
327
338
data : CodeLensData ,
328
339
language_server : & language_server:: Inner ,
340
+ token : & CancellationToken ,
329
341
) -> Result < lsp:: CodeLens , AnyError > {
330
342
fn get_locations (
331
343
maybe_referenced_symbols : Option < Vec < tsc:: ReferencedSymbol > > ,
332
344
language_server : & language_server:: Inner ,
345
+ token : & CancellationToken ,
333
346
) -> Result < Vec < lsp:: Location > , AnyError > {
334
347
let symbols = match maybe_referenced_symbols {
335
348
Some ( symbols) => symbols,
336
349
None => return Ok ( Vec :: new ( ) ) ,
337
350
} ;
338
351
let mut locations = Vec :: new ( ) ;
339
352
for reference in symbols. iter ( ) . flat_map ( |s| & s. references ) {
353
+ if token. is_cancelled ( ) {
354
+ break ;
355
+ }
340
356
if reference. is_definition {
341
357
continue ;
342
358
}
@@ -363,13 +379,18 @@ async fn resolve_references_code_lens(
363
379
language_server. snapshot ( ) ,
364
380
data. specifier . clone ( ) ,
365
381
line_index. offset_tsc ( code_lens. range . start ) ?,
382
+ token,
366
383
)
367
384
. await
368
385
. map_err ( |err| {
369
- lsp_warn ! ( "Unable to find references: {err}" ) ;
370
- LspError :: internal_error ( )
386
+ if token. is_cancelled ( ) {
387
+ anyhow ! ( "request cancelled" )
388
+ } else {
389
+ anyhow ! ( "Unable to get references from TypeScript: {:#}" , err)
390
+ }
371
391
} ) ?;
372
- let locations = get_locations ( maybe_referenced_symbols, language_server) ?;
392
+ let locations =
393
+ get_locations ( maybe_referenced_symbols, language_server, token) ?;
373
394
let title = if locations. len ( ) == 1 {
374
395
"1 reference" . to_string ( )
375
396
} else {
@@ -402,23 +423,28 @@ async fn resolve_references_code_lens(
402
423
pub async fn resolve_code_lens (
403
424
code_lens : lsp:: CodeLens ,
404
425
language_server : & language_server:: Inner ,
426
+ token : & CancellationToken ,
405
427
) -> Result < lsp:: CodeLens , AnyError > {
406
428
let data: CodeLensData =
407
429
serde_json:: from_value ( code_lens. data . clone ( ) . unwrap ( ) ) ?;
408
430
match data. source {
409
431
CodeLensSource :: Implementations => {
410
- resolve_implementation_code_lens ( code_lens, data, language_server) . await
432
+ resolve_implementation_code_lens ( code_lens, data, language_server, token)
433
+ . await
411
434
}
412
435
CodeLensSource :: References => {
413
- resolve_references_code_lens ( code_lens, data, language_server) . await
436
+ resolve_references_code_lens ( code_lens, data, language_server, token)
437
+ . await
414
438
}
415
439
}
416
440
}
417
441
418
442
pub fn collect_test (
419
443
specifier : & ModuleSpecifier ,
420
444
parsed_source : & ParsedSource ,
445
+ _token : & CancellationToken ,
421
446
) -> Result < Vec < lsp:: CodeLens > , AnyError > {
447
+ // TODO(nayeemrmn): Do cancellation checks while collecting tests.
422
448
let mut collector =
423
449
DenoTestCollector :: new ( specifier. clone ( ) , parsed_source. clone ( ) ) ;
424
450
parsed_source. program ( ) . visit_with ( & mut collector) ;
@@ -431,9 +457,10 @@ pub fn collect_tsc(
431
457
code_lens_settings : & CodeLensSettings ,
432
458
line_index : Arc < LineIndex > ,
433
459
navigation_tree : & NavigationTree ,
460
+ token : & CancellationToken ,
434
461
) -> Result < Vec < lsp:: CodeLens > , AnyError > {
435
462
let code_lenses = Rc :: new ( RefCell :: new ( Vec :: new ( ) ) ) ;
436
- navigation_tree. walk ( & |i, mp| {
463
+ navigation_tree. walk ( token , & |i, mp| {
437
464
let mut code_lenses = code_lenses. borrow_mut ( ) ;
438
465
439
466
// TSC Implementations Code Lens
@@ -541,7 +568,7 @@ pub fn collect_tsc(
541
568
_ => ( ) ,
542
569
}
543
570
}
544
- } ) ;
571
+ } ) ? ;
545
572
Ok ( Rc :: try_unwrap ( code_lenses) . unwrap ( ) . into_inner ( ) )
546
573
}
547
574
0 commit comments