Skip to content

Commit 6765a6e

Browse files
datho7561rgrunber
authored andcommitted
Return the API before importing the projects
This also has the side effect that extensions that depend on vscode-java can start up sooner. Fixes #2900 Signed-off-by: David Thompson <davthomp@redhat.com>
1 parent 2cdb0ce commit 6765a6e

File tree

6 files changed

+31
-38
lines changed

6 files changed

+31
-38
lines changed

src/extension.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -243,12 +243,16 @@ export function activate(context: ExtensionContext): Promise<ExtensionAPI> {
243243
};
244244

245245
apiManager.initialize(requirements, serverMode);
246+
resolve(apiManager.getApiInstance());
247+
// the promise is resolved
248+
// no need to pass `resolve` into any code past this point,
249+
// since `resolve` is a no-op from now on
246250

247251
if (requireSyntaxServer) {
248252
if (process.env['SYNTAXLS_CLIENT_PORT']) {
249-
syntaxClient.initialize(requirements, clientOptions, resolve);
253+
syntaxClient.initialize(requirements, clientOptions);
250254
} else {
251-
syntaxClient.initialize(requirements, clientOptions, resolve, prepareExecutable(requirements, syntaxServerWorkspacePath, getJavaConfig(requirements.java_home), context, true));
255+
syntaxClient.initialize(requirements, clientOptions, prepareExecutable(requirements, syntaxServerWorkspacePath, getJavaConfig(requirements.java_home), context, true));
252256
}
253257
syntaxClient.start();
254258
serverStatusBarProvider.showLightWeightStatus();
@@ -347,7 +351,7 @@ export function activate(context: ExtensionContext): Promise<ExtensionAPI> {
347351
}
348352

349353
if (choice === "Yes") {
350-
await startStandardServer(context, requirements, clientOptions, workspacePath, resolve);
354+
await startStandardServer(context, requirements, clientOptions, workspacePath);
351355
}
352356
});
353357

@@ -372,18 +376,16 @@ export function activate(context: ExtensionContext): Promise<ExtensionAPI> {
372376
const importOnStartup = config.get(importOnStartupSection);
373377
if (importOnStartup === "disabled" ||
374378
env.uiKind === UIKind.Web && env.appName.includes("Visual Studio Code")) {
375-
syntaxClient.resolveApi(resolve);
376379
requireStandardServer = false;
377380
} else if (importOnStartup === "interactive" && await workspaceContainsBuildFiles()) {
378-
syntaxClient.resolveApi(resolve);
379381
requireStandardServer = await promptUserForStandardServer(config);
380382
} else {
381383
requireStandardServer = true;
382384
}
383385
}
384386

385387
if (requireStandardServer) {
386-
await startStandardServer(context, requirements, clientOptions, workspacePath, resolve);
388+
await startStandardServer(context, requirements, clientOptions, workspacePath);
387389
}
388390

389391
const onDidGrantWorkspaceTrust = (workspace as any).onDidGrantWorkspaceTrust;
@@ -411,7 +413,7 @@ export function activate(context: ExtensionContext): Promise<ExtensionAPI> {
411413
});
412414
}
413415

414-
async function startStandardServer(context: ExtensionContext, requirements: requirements.RequirementsData, clientOptions: LanguageClientOptions, workspacePath: string, resolve: (value?: ExtensionAPI | PromiseLike<ExtensionAPI>) => void) {
416+
async function startStandardServer(context: ExtensionContext, requirements: requirements.RequirementsData, clientOptions: LanguageClientOptions, workspacePath: string) {
415417
if (standardClient.getClientStatus() !== ClientStatus.uninitialized) {
416418
return;
417419
}
@@ -426,7 +428,7 @@ async function startStandardServer(context: ExtensionContext, requirements: requ
426428
apiManager.getApiInstance().serverMode = ServerMode.hybrid;
427429
apiManager.fireDidServerModeChange(ServerMode.hybrid);
428430
}
429-
await standardClient.initialize(context, requirements, clientOptions, workspacePath, jdtEventEmitter, resolve);
431+
await standardClient.initialize(context, requirements, clientOptions, workspacePath, jdtEventEmitter);
430432
standardClient.start();
431433
serverStatusBarProvider.showStandardStatus();
432434
}

src/standardLanguageClient.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { apiManager } from "./apiManager";
1111
import * as buildPath from './buildpath';
1212
import { javaRefactorKinds, RefactorDocumentProvider } from "./codeActionProvider";
1313
import { Commands } from "./commands";
14-
import { ClientStatus, ExtensionAPI } from "./extension.api";
14+
import { ClientStatus } from "./extension.api";
1515
import * as fileEventHandler from './fileEventHandler';
1616
import { gradleCodeActionMetadata, GradleCodeActionProvider } from "./gradle/gradleCodeActionProvider";
1717
import { JavaInlayHintsProvider } from "./inlayHintsProvider";
@@ -56,7 +56,7 @@ export class StandardLanguageClient {
5656
private languageClient: LanguageClient;
5757
private status: ClientStatus = ClientStatus.uninitialized;
5858

59-
public async initialize(context: ExtensionContext, requirements: RequirementsData, clientOptions: LanguageClientOptions, workspacePath: string, jdtEventEmitter: EventEmitter<Uri>, resolve: (value: ExtensionAPI) => void): Promise<void> {
59+
public async initialize(context: ExtensionContext, requirements: RequirementsData, clientOptions: LanguageClientOptions, workspacePath: string, jdtEventEmitter: EventEmitter<Uri>): Promise<void> {
6060
if (this.status !== ClientStatus.uninitialized) {
6161
return;
6262
}
@@ -139,13 +139,11 @@ export class StandardLanguageClient {
139139
serverStatus.updateServerStatus(ServerStatusKind.ready);
140140
commands.executeCommand('setContext', 'javaLSReady', true);
141141
apiManager.updateStatus(ClientStatus.started);
142-
resolve(apiManager.getApiInstance());
143142
break;
144143
case 'Error':
145144
this.status = ClientStatus.error;
146145
serverStatus.updateServerStatus(ServerStatusKind.error);
147146
apiManager.updateStatus(ClientStatus.error);
148-
resolve(apiManager.getApiInstance());
149147
break;
150148
case 'ProjectStatus':
151149
if (report.message === "WARNING") {

src/syntaxLanguageClient.ts

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import { DidChangeConfigurationNotification, LanguageClientOptions } from "vscod
55
import { LanguageClient, ServerOptions, StreamInfo } from "vscode-languageclient/node";
66
import { apiManager } from "./apiManager";
77
import { ClientErrorHandler } from "./clientErrorHandler";
8-
import { ClientStatus, ExtensionAPI } from "./extension.api";
8+
import { ClientStatus } from "./extension.api";
99
import { logger } from "./log";
1010
import { OutputInfoCollector } from "./outputInfoCollector";
1111
import { StatusNotification } from "./protocol";
12+
import { RequirementsData } from "./requirements";
1213
import { ServerMode } from "./settings";
1314
import { snippetCompletionProvider } from "./snippetCompletionProvider";
1415
import { getJavaConfig } from "./utils";
@@ -19,7 +20,7 @@ export class SyntaxLanguageClient {
1920
private languageClient: LanguageClient;
2021
private status: ClientStatus = ClientStatus.uninitialized;
2122

22-
public initialize(requirements, clientOptions: LanguageClientOptions, resolve: (value: ExtensionAPI) => void, serverOptions?: ServerOptions) {
23+
public initialize(requirements: RequirementsData, clientOptions: LanguageClientOptions, serverOptions?: ServerOptions) {
2324
const newClientOptions: LanguageClientOptions = Object.assign({}, clientOptions, {
2425
middleware: {
2526
workspace: {
@@ -75,7 +76,7 @@ export class SyntaxLanguageClient {
7576
break;
7677
}
7778
if (apiManager.getApiInstance().serverMode === ServerMode.lightWeight) {
78-
this.resolveApiOnReady(resolve);
79+
apiManager.fireDidServerModeChange(ServerMode.lightWeight);
7980
}
8081
});
8182
});
@@ -111,15 +112,4 @@ export class SyntaxLanguageClient {
111112
return this.languageClient;
112113
}
113114

114-
public resolveApi(resolve: (value: ExtensionAPI) => void): void {
115-
apiManager.getApiInstance().serverMode = ServerMode.lightWeight;
116-
apiManager.fireDidServerModeChange(ServerMode.lightWeight);
117-
this.resolveApiOnReady(resolve);
118-
}
119-
120-
private resolveApiOnReady(resolve: (value: ExtensionAPI) => void): void {
121-
if ([ClientStatus.started, ClientStatus.error].includes(this.status)) {
122-
resolve(apiManager.getApiInstance());
123-
}
124-
}
125115
}

test/lightweight-mode-suite/publicApi.test.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
'use strict';
22

33
import * as assert from 'assert';
4+
import * as fse from 'fs-extra';
45
import * as path from 'path';
5-
import { ExtensionAPI, extensionApiVersion, ClasspathResult } from '../../src/extension.api';
6-
import { Uri, DocumentSymbol, extensions, commands } from 'vscode';
6+
import { commands, DocumentSymbol, extensions, Uri } from 'vscode';
7+
import { Commands } from '../../src/commands';
8+
import { ClasspathResult, ExtensionAPI, extensionApiVersion } from '../../src/extension.api';
79
import { ServerMode } from '../../src/settings';
8-
import * as fse from 'fs-extra';
910
import { getJavaConfiguration } from '../../src/utils';
10-
import { Commands } from '../../src/commands';
1111
import { constants } from '../common';
1212

1313
const pomPath: string = path.join(constants.projectFsPath, 'pom.xml');
@@ -31,7 +31,7 @@ suite('Public APIs - LightWeight', () => {
3131

3232
test('status should be correct', async function () {
3333
const api: ExtensionAPI = extensions.getExtension('redhat.java').exports;
34-
assert.equal(api.status, 'Started');
34+
assert.equal(api.status, 'Starting');
3535
});
3636

3737
test('registerHoverCommand should work', async function () {

test/standard-mode-suite/gotoSuperImplementation.test.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@
22

33
import * as assert from 'assert';
44
import * as path from 'path';
5-
import { Uri, extensions, commands, TextDocument, workspace, window, Selection, Position } from 'vscode';
5+
import { commands, extensions, Position, Selection, TextDocument, Uri, window, workspace } from 'vscode';
66
import { Commands } from '../../src/commands';
7+
import { ExtensionAPI } from '../../src/extension.api';
78

89
const projectFsPath: string = path.join(__dirname, '..', '..', '..', 'test', 'resources', 'projects', 'maven', 'salut');
910
const fileFsPath: string = path.join(projectFsPath, 'src', 'main', 'java', 'java', 'Foo3.java');
1011

1112
suite('Goto Super Implementation', () => {
1213

1314
suiteSetup(async function() {
14-
await extensions.getExtension('redhat.java').activate();
15+
const api: ExtensionAPI = await extensions.getExtension('redhat.java').activate();
16+
await api.serverReady();
1517
});
1618

1719
test('go to super implementation should work', async function () {

test/standard-mode-suite/publicApi.test.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
'use strict';
22

33
import * as assert from 'assert';
4+
import * as fse from 'fs-extra';
45
import * as path from 'path';
5-
import { ExtensionAPI, extensionApiVersion, ClasspathResult } from '../../src/extension.api';
6-
import { Uri, DocumentSymbol, extensions, commands } from 'vscode';
6+
import { env } from 'process';
7+
import { commands, DocumentSymbol, extensions, Uri } from 'vscode';
8+
import { Commands } from '../../src/commands';
9+
import { ClasspathResult, ExtensionAPI, extensionApiVersion } from '../../src/extension.api';
710
import { ServerMode } from '../../src/settings';
8-
import * as fse from 'fs-extra';
911
import { getJavaConfiguration } from '../../src/utils';
10-
import { Commands } from '../../src/commands';
1112
import { constants } from '../common';
12-
import { env } from 'process';
1313

1414
const pomPath: string = path.join(constants.projectFsPath, 'pom.xml');
1515
const gradleTestFolder: string = path.join(constants.projectFsPath, 'testGradle');
@@ -34,6 +34,7 @@ suite('Public APIs - Standard', () => {
3434

3535
test('status should be correct', async function () {
3636
const api: ExtensionAPI = extensions.getExtension('redhat.java').exports;
37+
await api.serverReady();
3738
assert.equal(api.status, 'Started');
3839
});
3940

0 commit comments

Comments
 (0)