Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 89 additions & 54 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ const jdtEventEmitter = new EventEmitter<Uri>();
const extensionName = 'Language Support for Java';
let storagePath: string;
let clientLogFile: string;
let standardServerStart: Promise<LanguageClient | undefined> | undefined;

const excutable= new Deferred<Executable>();

Expand Down Expand Up @@ -444,6 +445,17 @@ export async function activate(context: ExtensionContext): Promise<ExtensionAPI>
return apiManager.getApiInstance();
}

async function getStandardLanguageClient(): Promise<LanguageClient | undefined> {
try {
if (standardServerStart) {
return await standardServerStart;
}
} catch (error) {
logger.error(`Failed to initialize the Java language client: ${getMessage(error)}`);
}
return standardClient.getClient();
}

async function postExtensionStartInit(
context: ExtensionContext,
requirements: requirements.RequirementsData,
Expand All @@ -469,7 +481,53 @@ async function postExtensionStartInit(
serverStatusBarProvider.showLightWeightStatus();
}

context.subscriptions.push(commands.registerCommand(Commands.EXECUTE_WORKSPACE_COMMAND, (command, ...rest) => {
apiManager.getApiInstance().onDidServerModeChange((event: ServerMode) => {
if (event === ServerMode.standard) {
syntaxClient.stop();
fileEventHandler.setServerStatus(true);
languageStatusBarProvider.initialize(context);
}
commands.executeCommand('setContext', 'java:serverMode', event);
});

if (cleanWorkspaceExists) {
const data = {};
try {
cleanupLombokCache(context);
cleanupWorkspaceState(context);
deleteDirectory(workspacePath);
deleteDirectory(syntaxServerWorkspacePath);
cleanJavaLSConfiguration(context);
} catch (error) {
data['error'] = getMessage(error);
window.showErrorMessage(`Failed to delete ${workspacePath}: ${error}`);
}
await Telemetry.sendTelemetry(Commands.CLEAN_WORKSPACE, data);
}

if (serverMode === ServerMode.hybrid && !await fse.pathExists(path.join(workspacePath, ".metadata", ".plugins"))) {
const config = getJavaConfiguration();
const importOnStartupSection: string = "project.importOnFirstTimeStartup";
const importOnStartup = config.get(importOnStartupSection);
if (importOnStartup === "disabled" ||
env.uiKind === UIKind.Web && env.appName.includes("Visual Studio Code")) {
apiManager.getApiInstance().serverMode = ServerMode.lightWeight;
apiManager.fireDidServerModeChange(ServerMode.lightWeight);
requireStandardServer = false;
} else if (importOnStartup === "interactive" && await workspaceContainsBuildFiles()) {
apiManager.getApiInstance().serverMode = ServerMode.lightWeight;
apiManager.fireDidServerModeChange(ServerMode.lightWeight);
requireStandardServer = await promptUserForStandardServer(config);
} else {
requireStandardServer = true;
}
}

if (requireStandardServer) {
void startStandardServer(context, requirements, clientOptions, workspacePath);
}

context.subscriptions.push(commands.registerCommand(Commands.EXECUTE_WORKSPACE_COMMAND, async (command, ...rest) => {
const api: ExtensionAPI = apiManager.getApiInstance();
if (api.serverMode === ServerMode.lightWeight) {
console.warn(`The command: ${command} is not supported in LightWeight mode. See: https://github.com/redhat-developer/vscode-java/issues/1480`);
Expand All @@ -485,29 +543,18 @@ async function postExtensionStartInit(
command,
arguments: commandArgs
};
const client: LanguageClient | undefined = await getStandardLanguageClient();
if (!client) {
console.warn(`Cannot execute Java workspace command '${command}' because the Java language client is not initialized`);
return;
}
if (token) {
return standardClient.getClient().sendRequest(ExecuteCommandRequest.type, params, token);
return client.sendRequest(ExecuteCommandRequest.type, params, token);
} else {
return standardClient.getClient().sendRequest(ExecuteCommandRequest.type, params);
return client.sendRequest(ExecuteCommandRequest.type, params);
}
}));

if (cleanWorkspaceExists) {
const data = {};
try {
cleanupLombokCache(context);
cleanupWorkspaceState(context);
deleteDirectory(workspacePath);
deleteDirectory(syntaxServerWorkspacePath);
cleanJavaLSConfiguration(context);
} catch (error) {
data['error'] = getMessage(error);
window.showErrorMessage(`Failed to delete ${workspacePath}: ${error}`);
}
await Telemetry.sendTelemetry(Commands.CLEAN_WORKSPACE, data);
}

// Register commands here to make it available even when the language client fails
context.subscriptions.push(commands.registerCommand(Commands.OPEN_STATUS_SHORTCUT, async (status: string) => {
const items: ShortcutQuickPickItem[] = [];
if (status === ServerStatusKind.error || status === ServerStatusKind.warning) {
Expand Down Expand Up @@ -672,37 +719,6 @@ async function postExtensionStartInit(

registerClientProviders(context, { contentProviderEvent: jdtEventEmitter.event });

apiManager.getApiInstance().onDidServerModeChange((event: ServerMode) => {
if (event === ServerMode.standard) {
syntaxClient.stop();
fileEventHandler.setServerStatus(true);
languageStatusBarProvider.initialize(context);
}
commands.executeCommand('setContext', 'java:serverMode', event);
});

if (serverMode === ServerMode.hybrid && !await fse.pathExists(path.join(workspacePath, ".metadata", ".plugins"))) {
const config = getJavaConfiguration();
const importOnStartupSection: string = "project.importOnFirstTimeStartup";
const importOnStartup = config.get(importOnStartupSection);
if (importOnStartup === "disabled" ||
env.uiKind === UIKind.Web && env.appName.includes("Visual Studio Code")) {
apiManager.getApiInstance().serverMode = ServerMode.lightWeight;
apiManager.fireDidServerModeChange(ServerMode.lightWeight);
requireStandardServer = false;
} else if (importOnStartup === "interactive" && await workspaceContainsBuildFiles()) {
apiManager.getApiInstance().serverMode = ServerMode.lightWeight;
apiManager.fireDidServerModeChange(ServerMode.lightWeight);
requireStandardServer = await promptUserForStandardServer(config);
} else {
requireStandardServer = true;
}
}

if (requireStandardServer) {
await startStandardServer(context, requirements, clientOptions, workspacePath);
}

const onDidGrantWorkspaceTrust = (workspace as any).onDidGrantWorkspaceTrust;
if (onDidGrantWorkspaceTrust !== undefined) { // keep compatibility for old engines < 1.56.0
context.subscriptions.push(onDidGrantWorkspaceTrust(() => {
Expand All @@ -725,16 +741,34 @@ async function postExtensionStartInit(
}
context.subscriptions.push(workspace.onDidChangeTextDocument(event => handleTextDocumentChanges(event.document, event.contentChanges)));
}
async function startStandardServer(context: ExtensionContext, requirements: requirements.RequirementsData, clientOptions: LanguageClientOptions, workspacePath: string, triggeredByCommand: boolean = false) {
async function startStandardServer(
context: ExtensionContext,
requirements: requirements.RequirementsData,
clientOptions: LanguageClientOptions,
workspacePath: string,
triggeredByCommand: boolean = false
): Promise<LanguageClient | undefined> {
if (standardServerStart) {
const client = await standardServerStart;
if (client || !triggeredByCommand) {
return client;
}
}
if (standardClient.getClientStatus() !== ClientStatus.uninitialized) {
return;
return standardClient.getClient();
}
standardServerStart = doStartStandardServer(context, requirements, clientOptions, workspacePath, triggeredByCommand).finally(() => {
standardServerStart = undefined;
});
return standardServerStart;
}

async function doStartStandardServer(context: ExtensionContext, requirements: requirements.RequirementsData, clientOptions: LanguageClientOptions, workspacePath: string, triggeredByCommand: boolean = false): Promise<LanguageClient | undefined> {
const selector: BuildFileSelector = new BuildFileSelector(context, []);
const importMode: ImportMode = await getImportMode(context, selector);
if (importMode === ImportMode.automatic) {
if (!await ensureNoBuildToolConflicts(context, clientOptions)) {
return;
return undefined;
}
} else {
const buildFiles: string[] = [];
Expand All @@ -749,7 +783,7 @@ async function startStandardServer(context: ExtensionContext, requirements: requ
if (buildFiles.length === 0) {
commands.executeCommand('setContext', 'java:serverMode', ServerMode.lightWeight);
serverStatusBarProvider.showNotImportedStatus();
return;
return undefined;
}
clientOptions.initializationOptions.projectConfigurations = buildFiles;
}
Expand All @@ -764,6 +798,7 @@ async function startStandardServer(context: ExtensionContext, requirements: requ
standardClient.registerLanguageClientActions(context, await fse.pathExists(path.join(workspacePath, ".metadata", ".plugins")), jdtEventEmitter);
});
serverStatusBarProvider.setBusy("Activating...");
return standardClient.getClient();
}

async function workspaceContainsBuildFiles(): Promise<boolean> {
Expand Down
Loading