From 55f90983e8b3fc7e79e488e445211a98145678ed Mon Sep 17 00:00:00 2001 From: Yaohai Zheng Date: Mon, 4 Mar 2019 10:11:29 +0800 Subject: [PATCH 1/2] Reload prompt when extension bundle changed. Signed-off-by: Yaohai Zheng --- .gitignore | 3 +++ package-lock.json | 41 +++++++++++------------------------------ package.json | 2 +- src/extension.ts | 7 +++++-- src/plugin.ts | 34 +++++++++++++++++++++++++++++----- test/extension.test.ts | 2 +- 6 files changed, 50 insertions(+), 39 deletions(-) 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..7af18f068f 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", @@ -2366,14 +2365,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2388,20 +2385,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -2518,8 +2512,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -2531,7 +2524,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2546,7 +2538,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2554,14 +2545,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2580,7 +2569,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2661,8 +2649,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2674,7 +2661,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -2760,8 +2746,7 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -2797,7 +2782,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2817,7 +2801,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2861,14 +2844,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..5be5d73d5e 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[] { + existingExtensions = []; if (extensions && extensions.length) { for (let extension of extensions) { let contributesSection = extension.packageJSON['contributes']; @@ -12,11 +15,32 @@ export function collectionJavaExtensions(extensions: Extension[]): string[] let javaExtensions = contributesSection['javaExtensions']; if (Array.isArray(javaExtensions) && javaExtensions.length) { for (let javaExtensionPath of javaExtensions) { - result.push(path.resolve(extension.extensionPath, javaExtensionPath)); + existingExtensions.push(path.resolve(extension.extensionPath, javaExtensionPath)); } } } } } - return result; + return existingExtensions; +} + +export function onExtensionChange(extensions: vscode.Extension[]) { + if (!existingExtensions) { + return; + } + const oldExtensions = existingExtensions.slice(); + const newExtensions = collectJavaExtensions(extensions); + for (const newExtension of newExtensions) { + if (oldExtensions.indexOf(newExtension) < 0) { + let msg = 'Java Language Server has new extension installed or updated, please restart VS Code to enable it.'; + let action = 'Restart Now'; + let restartId = Commands.RELOAD_WINDOW; + vscode.window.showWarningMessage(msg, action).then((selection) => { + if (action === selection) { + vscode.commands.executeCommand(restartId); + } + }); + break; + } + } } 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'))); }); From 1317964ab6fc0c27c5bfb9a942c27edfa999afdc Mon Sep 17 00:00:00 2001 From: Yaohai Zheng Date: Mon, 11 Mar 2019 15:47:37 +0800 Subject: [PATCH 2/2] Address review feedback. Signed-off-by: Yaohai Zheng --- package-lock.json | 28 +++++++++++++++++++++------- src/plugin.ts | 39 ++++++++++++++++++++++++--------------- 2 files changed, 45 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7af18f068f..0b26221014 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2365,12 +2365,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2385,17 +2387,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2512,7 +2517,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2524,6 +2530,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -2538,6 +2545,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2545,12 +2553,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -2569,6 +2579,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2649,7 +2660,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -2661,6 +2673,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2782,6 +2795,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", diff --git a/src/plugin.ts b/src/plugin.ts index 5be5d73d5e..b15cf98dfc 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -7,7 +7,7 @@ import { Commands } from './commands'; let existingExtensions: Array; export function collectJavaExtensions(extensions: vscode.Extension[]): string[] { - existingExtensions = []; + const result = []; if (extensions && extensions.length) { for (let extension of extensions) { let contributesSection = extension.packageJSON['contributes']; @@ -15,32 +15,41 @@ export function collectJavaExtensions(extensions: vscode.Extension[]): stri let javaExtensions = contributesSection['javaExtensions']; if (Array.isArray(javaExtensions) && javaExtensions.length) { for (let javaExtensionPath of javaExtensions) { - existingExtensions.push(path.resolve(extension.extensionPath, javaExtensionPath)); + result.push(path.resolve(extension.extensionPath, javaExtensionPath)); } } } } } - return existingExtensions; + // Make a copy of extensions: + existingExtensions = result.slice(); + return result; } export function onExtensionChange(extensions: vscode.Extension[]) { if (!existingExtensions) { return; } - const oldExtensions = existingExtensions.slice(); + const oldExtensions = new Set(existingExtensions.slice()); const newExtensions = collectJavaExtensions(extensions); - for (const newExtension of newExtensions) { - if (oldExtensions.indexOf(newExtension) < 0) { - let msg = 'Java Language Server has new extension installed or updated, please restart VS Code to enable it.'; - let action = 'Restart Now'; - let restartId = Commands.RELOAD_WINDOW; - vscode.window.showWarningMessage(msg, action).then((selection) => { - if (action === selection) { - vscode.commands.executeCommand(restartId); - } - }); - break; + 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); + } + }); + } }