diff --git a/src/apiManager.ts b/src/apiManager.ts index 6cdbf8e62..7f3879188 100644 --- a/src/apiManager.ts +++ b/src/apiManager.ts @@ -22,6 +22,7 @@ class ApiManager { private traceEventEmitter: Emitter = new Emitter(); private sourceInvalidatedEventEmitter: Emitter = new Emitter(); private serverReadyPromiseResolve: (result: boolean) => void; + private serverRunningPromiseResolve: (result: boolean) => void; public initialize(requirements: RequirementsData, serverMode: ServerMode): void { // if it's manual import mode, set the server mode to lightweight, so that the @@ -57,6 +58,13 @@ class ApiManager { return serverReadyPromise; }; + const serverRunningPromise: Promise = new Promise((resolve) => { + this.serverRunningPromiseResolve = resolve; + }); + const serverRunning = async () => { + return serverRunningPromise; + }; + this.api = { apiVersion: extensionApiVersion, javaRequirement: requirements, @@ -73,6 +81,7 @@ class ApiManager { onDidProjectsImport, onDidProjectsDelete, serverReady, + serverRunning, onWillRequestStart, onDidRequestEnd, trackEvent: traceEvent, @@ -123,6 +132,10 @@ class ApiManager { public resolveServerReadyPromise(): void { this.serverReadyPromiseResolve(true); } + + public resolveServerRunningPromise(): void { + this.serverRunningPromiseResolve?.(true); + } } export const apiManager: ApiManager = new ApiManager(); diff --git a/src/extension.api.ts b/src/extension.api.ts index 4c8661062..7e44da530 100644 --- a/src/extension.api.ts +++ b/src/extension.api.ts @@ -111,7 +111,7 @@ export interface SourceInvalidatedEvent { affectedEditorDocuments?: Uri[]; } -export const extensionApiVersion = '0.13'; +export const extensionApiVersion = '0.14'; export interface ExtensionAPI { readonly apiVersion: string; @@ -167,6 +167,14 @@ export interface ExtensionAPI { */ readonly serverReady: () => Promise; + /** + * A promise that will be resolved when the language server process is running + * and can accept requests, even if project imports have not yet completed. + * This allows extensions to start querying for projects incrementally during import. + * @since API version 0.14 + */ + readonly serverRunning?: () => Promise; + /** * An event that's fired when a request is about to send to language server. * @since API version 0.12 diff --git a/src/standardLanguageClient.ts b/src/standardLanguageClient.ts index 11eac27db..7a0aae0eb 100644 --- a/src/standardLanguageClient.ts +++ b/src/standardLanguageClient.ts @@ -121,6 +121,9 @@ export class StandardLanguageClient { public registerLanguageClientActions(context: ExtensionContext, hasImported: boolean, jdtEventEmitter: EventEmitter) { activationProgressNotification.showProgress(); this.languageClient.onNotification(StatusNotification.type, (report) => { + // Resolve serverRunning on the first status notification from the server, + // indicating the server process is alive and can accept requests. + apiManager.resolveServerRunningPromise(); switch (report.type) { case 'ServiceReady': apiManager.updateServerMode(ServerMode.standard);