diff --git a/.gitignore b/.gitignore index 355c66f374..905e4094bf 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ undefined target dist bin/ +.settings +.classpath +.project diff --git a/package-lock.json b/package-lock.json index 84e047e548..0b26221014 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2344,8 +2344,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -2760,8 +2759,7 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -2817,7 +2815,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2861,14 +2858,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, diff --git a/package.json b/package.json index 87844a553c..99ea4042c6 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "bugs": "https://github.com/redhat-developer/vscode-java/issues", "preview": true, "engines": { - "vscode": "^1.30.0" + "vscode": "^1.31.0" }, "repository": { "type": "git", diff --git a/src/extension.ts b/src/extension.ts index 42e6d5dd59..553c1e8f89 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -5,7 +5,7 @@ import * as os from 'os'; import * as fs from 'fs'; import { workspace, extensions, ExtensionContext, window, StatusBarAlignment, commands, ViewColumn, Uri, CancellationToken, TextDocumentContentProvider, TextEditor, WorkspaceConfiguration, languages, IndentAction, ProgressLocation, InputBoxOptions, Selection, Position, EventEmitter } from 'vscode'; import { ExecuteCommandParams, ExecuteCommandRequest, LanguageClient, LanguageClientOptions, RevealOutputChannelOn, Position as LSPosition, Location as LSLocation, StreamInfo, VersionedTextDocumentIdentifier } from 'vscode-languageclient'; -import { collectionJavaExtensions } from './plugin'; +import { onExtensionChange, collectJavaExtensions } from './plugin'; import { prepareExecutable, awaitServerConnection } from './javaServerStarter'; import * as requirements from './requirements'; import { Commands } from './commands'; @@ -68,7 +68,7 @@ export function activate(context: ExtensionContext): Promise { ], }, initializationOptions: { - bundles: collectionJavaExtensions(extensions.all), + bundles: collectJavaExtensions(extensions.all), workspaceFolders: workspace.workspaceFolders ? workspace.workspaceFolders.map(f => f.uri.toString()) : null, settings: { java: getJavaConfiguration() }, extendedClientCapabilities:{ @@ -304,6 +304,9 @@ export function activate(context: ExtensionContext): Promise { } }; context.subscriptions.push(workspace.registerTextDocumentContentProvider('jdt', provider)); + extensions.onDidChange(() => { + onExtensionChange(extensions.all); + }); excludeProjectSettingsFiles(); }); diff --git a/src/plugin.ts b/src/plugin.ts index 8d1460950e..b15cf98dfc 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -1,10 +1,13 @@ 'use strict'; -import { Extension } from 'vscode'; +import * as vscode from 'vscode'; import * as path from 'path'; +import { Commands } from './commands'; -export function collectionJavaExtensions(extensions: Extension[]): string[] { - let result = []; +let existingExtensions: Array; + +export function collectJavaExtensions(extensions: vscode.Extension[]): string[] { + const result = []; if (extensions && extensions.length) { for (let extension of extensions) { let contributesSection = extension.packageJSON['contributes']; @@ -18,5 +21,35 @@ export function collectionJavaExtensions(extensions: Extension[]): string[] } } } + // Make a copy of extensions: + existingExtensions = result.slice(); return result; } + +export function onExtensionChange(extensions: vscode.Extension[]) { + if (!existingExtensions) { + return; + } + const oldExtensions = new Set(existingExtensions.slice()); + const newExtensions = collectJavaExtensions(extensions); + let hasChanged = ( oldExtensions.size != newExtensions.length); + if (!hasChanged) { + for (const newExtension of newExtensions) { + if (!oldExtensions.has(newExtension)) { + hasChanged = true; + break; + } + } + } + + if (hasChanged) { + const msg = 'Extensions to the Java Language Server changed, reloading Visual Studio Code is required for the changes to take effect.'; + const action = 'Reload'; + const restartId = Commands.RELOAD_WINDOW; + vscode.window.showWarningMessage(msg, action).then((selection) => { + if (action === selection) { + vscode.commands.executeCommand(restartId); + } + }); + } +} diff --git a/test/extension.test.ts b/test/extension.test.ts index 70880f1d79..ab2ddf4e04 100644 --- a/test/extension.test.ts +++ b/test/extension.test.ts @@ -88,7 +88,7 @@ suite('Java Language Extension', () => { }; const extensions = [fakedExtension]; - const result = plugin.collectionJavaExtensions(extensions); + const result = plugin.collectJavaExtensions(extensions); assert(result.length === 1); assert(result[0].endsWith(path.normalize('./bin/java.extend.jar'))); });