18
18
import java .util .Map ;
19
19
import java .util .concurrent .ExecutionException ;
20
20
import java .util .concurrent .TimeUnit ;
21
+ import java .util .concurrent .TimeoutException ;
21
22
22
23
import org .eclipse .core .resources .IFile ;
23
24
import org .eclipse .core .resources .IMarker ;
24
25
import org .eclipse .core .resources .IProject ;
25
26
import org .eclipse .core .resources .IResource ;
26
27
import org .eclipse .core .runtime .CoreException ;
27
28
import org .eclipse .core .runtime .IProgressMonitor ;
29
+ import org .eclipse .core .runtime .OperationCanceledException ;
30
+ import org .eclipse .core .runtime .SubMonitor ;
28
31
import org .eclipse .jface .text .IDocument ;
29
32
30
33
import ts .TypeScriptException ;
51
54
import ts .eclipse .ide .core .utils .TypeScriptResourceUtil ;
52
55
import ts .eclipse .ide .core .utils .WorkbenchResourceUtil ;
53
56
import ts .eclipse .ide .internal .core .Trace ;
57
+ import ts .eclipse .ide .internal .core .TypeScriptCoreMessages ;
54
58
import ts .eclipse .ide .internal .core .compiler .IDETypeScriptCompiler ;
55
59
import ts .eclipse .ide .internal .core .console .TypeScriptConsoleConnectorManager ;
56
60
import ts .eclipse .ide .internal .core .resources .jsonconfig .JsonConfigResourcesManager ;
@@ -376,19 +380,19 @@ protected ITypeScriptLint createTslint(File tslintFile, File tslintJsonFile, Fil
376
380
@ Override
377
381
public void compileWithTsserver (List <IFile > updatedTsFiles , List <IFile > removedTsFiles , IProgressMonitor monitor )
378
382
throws TypeScriptException {
383
+ SubMonitor subMonitor = SubMonitor .convert (monitor );
384
+ subMonitor .beginTask (TypeScriptCoreMessages .IDETypeScriptProject_compile_task , 100 );
385
+ List <IFile > tsFilesToClose = new ArrayList <>();
379
386
try {
380
387
List <String > tsFilesToCompile = new ArrayList <>();
381
388
// Collect ts files to compile by using tsserver to retrieve
382
389
// dependencies files.
383
390
// It works only if tsconfig.json declares "compileOnSave: true".
384
- if (collectTsFilesToCompile (updatedTsFiles , getClient (), tsFilesToCompile , false , monitor )) {
385
- return ;
386
- }
391
+ collectTsFilesToCompile (updatedTsFiles , tsFilesToCompile , tsFilesToClose , getClient (), subMonitor );
387
392
388
393
// Compile ts files with tsserver.
389
- if (compileTsFiles (tsFilesToCompile , getClient (), monitor )) {
390
- return ;
391
- }
394
+ compileTsFiles (tsFilesToCompile , getClient (), subMonitor );
395
+
392
396
if (removedTsFiles .size () > 0 ) {
393
397
// ts files was removed, how to get referenced files which must
394
398
// be recompiled (with errors)?
@@ -397,54 +401,84 @@ public void compileWithTsserver(List<IFile> updatedTsFiles, List<IFile> removedT
397
401
throw e ;
398
402
} catch (Exception e ) {
399
403
throw new TypeScriptException (e );
404
+ } finally {
405
+ for (IFile tsFile : tsFilesToClose ) {
406
+ closeFile (tsFile );
407
+ }
408
+ subMonitor .done ();
400
409
}
401
410
}
402
411
403
412
/**
404
413
* Collect ts files to compile from the given ts files list.
405
414
*
406
- * @param tsFiles
407
- * @param client
415
+ * @param updatedTsFiles
416
+ * list of TypeScript files which have changed.
408
417
* @param tsFilesToCompile
409
- * @param exclude
410
- * @param monitor
418
+ * list of collected ts files to compile.
419
+ * @param tsFilesToClose
420
+ * list of ts files to close.
421
+ * @param client
422
+ * @param subMonitor
411
423
* @throws Exception
412
424
*/
413
- private boolean collectTsFilesToCompile (List <IFile > tsFiles , ITypeScriptServiceClient client ,
414
- List <String > tsFilesToCompile , boolean exclude , IProgressMonitor monitor ) throws Exception {
415
- for (IFile tsFile : tsFiles ) {
416
- if (monitor .isCanceled ()) {
417
- return true ;
418
- }
425
+ private void collectTsFilesToCompile (List <IFile > updatedTsFiles , List <String > tsFilesToCompile ,
426
+ List <IFile > tsFilesToClose , ITypeScriptServiceClient client , SubMonitor subMonitor ) throws Exception {
427
+ SubMonitor loopMonitor = subMonitor .newChild (50 ).setWorkRemaining (updatedTsFiles .size ());// subMonitor.split(50).setWorkRemaining(updatedTsFiles.size());
428
+ loopMonitor .subTask (TypeScriptCoreMessages .IDETypeScriptProject_compile_collecting_step );
429
+ for (IFile tsFile : updatedTsFiles ) {
419
430
String filename = WorkbenchResourceUtil .getFileName (tsFile );
420
431
if (!tsFilesToCompile .contains (filename )) {
421
- collectTsFilesToCompile (filename , client , tsFilesToCompile , exclude );
432
+ collectTsFilesToCompile (filename , client , tsFilesToCompile , tsFilesToClose , loopMonitor );
433
+ }
434
+ if (loopMonitor .isCanceled ()) {
435
+ throw new OperationCanceledException ();
422
436
}
437
+ loopMonitor .worked (1 );
438
+ // loopMonitor.split(1);
423
439
}
424
- return false ;
440
+ subMonitor . setWorkRemaining ( 50 ) ;
425
441
}
426
442
427
443
/**
428
- * Collect ts files to compile from the given ts file name .
444
+ * Collect ts files to compile from the given TypeScript file.
429
445
*
430
446
* @param filename
431
447
* @param client
432
448
* @param tsFilesToCompile
433
- * @param exclude
449
+ * @param tsFilesToClose
450
+ * @param monitor
434
451
* @throws Exception
435
452
*/
436
453
private void collectTsFilesToCompile (String filename , ITypeScriptServiceClient client ,
437
- List <String > tsFilesToCompile , boolean exclude ) throws Exception {
438
- // call tsserver compileOnSaveAffectedFileList to retrieve file
439
- // dependencies of the given filename
440
- List <CompileOnSaveAffectedFileListSingleProject > affectedProjects = client
441
- .compileOnSaveAffectedFileList (filename ).get (5000 , TimeUnit .MILLISECONDS );
442
- for (CompileOnSaveAffectedFileListSingleProject affectedProject : affectedProjects ) {
443
- List <String > affectedTsFilenames = affectedProject .getFileNames ();
444
- for (String affectedFilename : affectedTsFilenames ) {
445
- if (!tsFilesToCompile .contains (affectedFilename ) && !(exclude && filename .equals (affectedFilename ))) {
446
- tsFilesToCompile .add (affectedFilename );
454
+ List <String > tsFilesToCompile , List <IFile > tsFilesToClose , IProgressMonitor monitor ) throws Exception {
455
+ while (!monitor .isCanceled ()) {
456
+ try {
457
+ // When tsserver is not started, it takes time, we try to collect TypeScript
458
+ // files every time and stop the search if user stops the builder.
459
+ List <CompileOnSaveAffectedFileListSingleProject > affectedProjects = client
460
+ .compileOnSaveAffectedFileList (filename ).get (2000 , TimeUnit .MILLISECONDS );
461
+ if (affectedProjects .size () == 0 && getOpenedFile (filename ) == null ) {
462
+ // Case when none TypeScript files are opened.
463
+ // In this case, compileOnSaveAffectedFileList returns null, the tsserver needs
464
+ // having just one opened TypeScript file
465
+ // in order to compileOnSaveAffectedFileList returns the well list.
466
+ IFile tsFile = WorkbenchResourceUtil .findFileFromWorkspace (filename );
467
+ openFile (tsFile , null );
468
+ tsFilesToClose .add (tsFile );
469
+ affectedProjects = client .compileOnSaveAffectedFileList (filename ).get (2000 , TimeUnit .MILLISECONDS );
470
+ }
471
+ for (CompileOnSaveAffectedFileListSingleProject affectedProject : affectedProjects ) {
472
+ List <String > affectedTsFilenames = affectedProject .getFileNames ();
473
+ for (String affectedFilename : affectedTsFilenames ) {
474
+ if (!tsFilesToCompile .contains (affectedFilename )) {
475
+ tsFilesToCompile .add (affectedFilename );
476
+ }
477
+ }
447
478
}
479
+ return ;
480
+ } catch (TimeoutException e ) {
481
+
448
482
}
449
483
}
450
484
}
@@ -454,28 +488,27 @@ private void collectTsFilesToCompile(String filename, ITypeScriptServiceClient c
454
488
*
455
489
* @param tsFilesToCompile
456
490
* @param client
457
- * @param monitor
458
- * @return true if process must be stopped and false otherwise.
491
+ * @param subMonitor
459
492
* @throws Exception
460
493
*/
461
- private boolean compileTsFiles (List <String > tsFilesToCompile , ITypeScriptServiceClient client ,
462
- IProgressMonitor monitor ) throws Exception {
494
+ private void compileTsFiles (List <String > tsFilesToCompile , ITypeScriptServiceClient client , SubMonitor subMonitor )
495
+ throws Exception {
496
+ SubMonitor loopMonitor = subMonitor .newChild (50 ).setWorkRemaining (tsFilesToCompile .size ());// subMonitor.split(50).setWorkRemaining(tsFilesToCompile.size());
497
+ loopMonitor .subTask (TypeScriptCoreMessages .IDETypeScriptProject_compile_compiling_step );
463
498
for (String filename : tsFilesToCompile ) {
464
- if (monitor .isCanceled ()) {
465
- return true ;
466
- }
467
499
try {
468
500
compileTsFile (filename , client );
501
+ loopMonitor .worked (1 );
502
+ // loopMonitor.split(1);
469
503
} catch (ExecutionException e ) {
470
504
if (e .getCause () instanceof TypeScriptNoContentAvailableException ) {
471
505
// Ignore "No content available" error.
472
- }
473
- else {
506
+ } else {
474
507
throw e ;
475
508
}
476
509
}
477
510
}
478
- return false ;
511
+ subMonitor . setWorkRemaining ( 100 ) ;
479
512
}
480
513
481
514
/**
0 commit comments