33
44import { promisify } from "util" ;
55import * as vscode from "vscode" ;
6- import { sendError } from "vscode-extension-telemetry-wrapper" ;
6+ import { sendError , sendInfo } from "vscode-extension-telemetry-wrapper" ;
77import { LSDaemon } from "./daemon" ;
88
99const delay = promisify ( setTimeout ) ;
@@ -25,12 +25,19 @@ async function checkJavaExtActivated(_context: vscode.ExtensionContext): Promise
2525 return false ;
2626 }
2727
28+ vscode . workspace . onDidGrantWorkspaceTrust ( ( ) => {
29+ checkIfJavaServerCrashed ( 30 * 1000 /*ms*/ ) ;
30+ } ) ;
31+
2832 // wait javaExt to activate
2933 const timeout = 30 * 60 * 1000 ; // wait 30 min at most
3034 let count = 0 ;
3135 while ( ! javaExt . isActive && count < timeout ) {
3236 await delay ( 1000 ) ;
3337 count += 1000 ;
38+ if ( count % 10000 === 0 ) {
39+ checkIfJavaServerCrashed ( ) ;
40+ }
3441 }
3542
3643 if ( ! javaExt . isActive ) {
@@ -41,6 +48,10 @@ async function checkJavaExtActivated(_context: vscode.ExtensionContext): Promise
4148
4249 // on ServiceReady
4350 javaExt . exports . onDidServerModeChange ( async ( mode : string ) => {
51+ if ( mode === "Hybrid" ) { // begin to start standard language server
52+ checkIfJavaServerCrashed ( 30 * 1000 /*ms*/ ) ;
53+ }
54+
4455 if ( mode === "Standard" ) {
4556 daemon . logWatcher . sendStartupMetadata ( "jdtls standard server ready" ) ;
4657
@@ -57,3 +68,35 @@ async function checkJavaExtActivated(_context: vscode.ExtensionContext): Promise
5768
5869 return true ;
5970}
71+
72+ let corruptedCacheDetected : boolean = false ;
73+ async function checkIfJavaServerCrashed ( wait : number = 0 /*ms*/ ) {
74+ if ( corruptedCacheDetected ) {
75+ return ;
76+ }
77+
78+ // wait Java Language Server to start
79+ if ( wait ) {
80+ await delay ( wait ) ;
81+ }
82+
83+ const corruptedCache = ! await daemon . processWatcher . start ( ) && await daemon . logWatcher . checkIfWorkspaceCorrupted ( ) ;
84+ if ( ! corruptedCacheDetected && corruptedCache ) {
85+ corruptedCacheDetected = true ;
86+ sendInfo ( "" , {
87+ name : "corrupted-cache" ,
88+ } ) ;
89+ const ans = await vscode . window . showErrorMessage ( "Java extension cannot start due to corrupted workspace cache, please try to clean the workspace." ,
90+ "Clean and Restart" , "Later" ) ;
91+ if ( ans === "Clean and Restart" ) {
92+ sendInfo ( "" , {
93+ name : "clean-cache-action" ,
94+ } ) ;
95+ vscode . commands . executeCommand ( "java.clean.workspace" , true ) ;
96+ } else {
97+ sendInfo ( "" , {
98+ name : "clean-cache-cancel-action" ,
99+ } ) ;
100+ }
101+ }
102+ }
0 commit comments