Skip to content

Commit 06fa6f0

Browse files
committed
Contribute to completion, hover .. with external JAR
Fixes #190 Signed-off-by: azerr <azerr@redhat.com>
1 parent cf8674b commit 06fa6f0

File tree

8 files changed

+934
-1187
lines changed

8 files changed

+934
-1187
lines changed

package-lock.json

Lines changed: 809 additions & 1164 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"dtd"
1717
],
1818
"engines": {
19-
"vscode": "^1.27.0"
19+
"vscode": "^1.37.0"
2020
},
2121
"activationEvents": [
2222
"onLanguage:xml",
@@ -28,10 +28,11 @@
2828
"compile": "webpack --mode none",
2929
"watch": "webpack --mode development --watch --info-verbosity verbose",
3030
"test-compile": "tsc -p ./",
31-
"postinstall": "node ./node_modules/vscode/bin/install",
32-
"test": "node ./node_modules/vscode/bin/test",
33-
"build-server": "./node_modules/.bin/gulp build_server",
34-
"tslint": "./node_modules/.bin/gulp tslint"
31+
"pretest": "npm run test-compile",
32+
"test": "node ./out/test/runTest.js",
33+
"tslint": "./node_modules/.bin/tslint -p .",
34+
"build": "./node_modules/.bin/gulp build",
35+
"build-server": "./node_modules/.bin/gulp build_server"
3536
},
3637
"repository": {
3738
"type": "git",
@@ -44,25 +45,27 @@
4445
"Snippets"
4546
],
4647
"devDependencies": {
47-
"@types/mocha": "^5.2.5",
48-
"@types/node": "^6.0.40",
49-
"gulp": "^4.0.0",
48+
"@types/mocha": "^5.2.6",
49+
"@types/node": "^10.14.16",
50+
"@types/vscode": "^1.37.0",
51+
"gulp": "^4.0.2",
5052
"gulp-tslint": "^8.1.3",
51-
"mocha": "^5.2.0",
52-
"tar": ">=4.4.2",
53+
"gulp-rename": "^1.4.0",
54+
"mocha": "^6.2.1",
5355
"ts-loader": "^6.0.1",
54-
"tslint": "^5.11.0",
55-
"typescript": "^3.0.3",
56-
"vscode": "^1.1.21",
56+
"tslint": "^5.12.1",
57+
"typescript": "^3.4.1",
58+
"typescript-tslint-plugin": "^0.3.1",
59+
"vscode-test": "^1.2.0",
5760
"webpack": "^4.32.2",
5861
"webpack-cli": "^3.3.2"
5962
},
6063
"dependencies": {
6164
"expand-home-dir": "^0.0.3",
6265
"find-java-home": "0.2.0",
63-
"glob": "^7.1.1",
64-
"path-exists": "^3.0.0",
65-
"vscode-languageclient": "~5.1.0"
66+
"glob": "^7.1.4",
67+
"path-exists": "^4.0.0",
68+
"vscode-languageclient": "^5.2.1"
6669
},
6770
"contributes": {
6871
"configuration": {
@@ -285,6 +288,12 @@
285288
".mod"
286289
]
287290
}
291+
],
292+
"jsonValidation": [
293+
{
294+
"fileMatch": "package.json",
295+
"url": "./schemas/package.schema.json"
296+
}
288297
]
289298
}
290299
}

schemas/package.schema.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-04/schema#",
3+
"title": "XML Language server contributions to package.json",
4+
"type": "object",
5+
"properties": {
6+
"contributes": {
7+
"type": "object",
8+
"properties": {
9+
"xml.javaExtensions": {
10+
"type": "array",
11+
"markdownDescription": "XML language server extensions",
12+
"items": {
13+
"type": "string",
14+
"description": "Relative path to a XML language server extension JAR file"
15+
}
16+
}
17+
}
18+
}
19+
}
20+
}

src/commands.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,9 @@ export namespace Commands {
3030
*/
3131
export const EDITOR_SHOW_REFERENCES = 'editor.action.showReferences';
3232

33+
/**
34+
* Reload VS Code window
35+
*/
36+
export const RELOAD_WINDOW = 'workbench.action.reloadWindow';
37+
3338
}

src/extension.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@
1313
import { prepareExecutable } from './javaServerStarter';
1414
import { LanguageClientOptions, RevealOutputChannelOn, LanguageClient, DidChangeConfigurationNotification, RequestType, TextDocumentPositionParams, ReferencesRequest } from 'vscode-languageclient';
1515
import * as requirements from './requirements';
16-
import { languages, IndentAction, workspace, window, commands, ExtensionContext, TextDocument, Position, LanguageConfiguration, Uri } from "vscode";
16+
import { languages, IndentAction, workspace, window, commands, ExtensionContext, TextDocument, Position, LanguageConfiguration, Uri, extensions } from "vscode";
1717
import * as path from 'path';
1818
import * as os from 'os';
1919
import { activateTagClosing, AutoCloseResult } from './tagClosing';
2020
import { Commands } from './commands';
2121
import { onConfigurationChange, subscribeJDKChangeConfiguration } from './settings';
22+
import { collectXmlJavaExtensions, onExtensionChange } from './plugin';
2223

2324
export interface ScopeInfo {
2425
scope : "default" | "global" | "workspace" | "folder";
@@ -84,7 +85,7 @@ export function activate(context: ExtensionContext) {
8485
}
8586
}
8687

87-
let serverOptions = prepareExecutable(requirements);
88+
let serverOptions = prepareExecutable(requirements, collectXmlJavaExtensions(extensions.all));
8889
let languageClient = new LanguageClient('xml', 'XML Support', serverOptions, clientOptions);
8990
let toDispose = context.subscriptions;
9091
let disposable = languageClient.start();
@@ -113,6 +114,12 @@ export function activate(context: ExtensionContext) {
113114
return text;
114115
};
115116

117+
if (extensions.onDidChange) {// Theia doesn't support this API yet
118+
extensions.onDidChange(() => {
119+
onExtensionChange(extensions.all);
120+
});
121+
}
122+
116123
disposable = activateTagClosing(tagProvider, { xml: true, xsl: true }, Commands.AUTO_CLOSE_TAGS);
117124
toDispose.push(disposable);
118125
});

src/javaServerStarter.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,18 @@ declare var v8debug;
99

1010
const DEBUG = (typeof v8debug === 'object') || startedInDebugMode();
1111

12-
export function prepareExecutable(requirements: RequirementsData): Executable {
12+
export function prepareExecutable(requirements: RequirementsData, xmlJavaExtensions: string[]): Executable {
1313
let executable: Executable = Object.create(null);
1414
let options: ExecutableOptions = Object.create(null);
1515
options.env = process.env;
1616
options.stdio = 'pipe';
1717
executable.options = options;
1818
executable.command = path.resolve(requirements.java_home + '/bin/java');
19-
executable.args = prepareParams(requirements);
19+
executable.args = prepareParams(requirements, xmlJavaExtensions);
2020
return executable;
2121
}
2222

23-
function prepareParams(requirements: RequirementsData): string[] {
23+
function prepareParams(requirements: RequirementsData, xmlJavaExtensions: string[]): string[] {
2424
let params: string[] = [];
2525
if (DEBUG) {
2626
params.push('-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1054,quiet=y');
@@ -38,7 +38,13 @@ function prepareParams(requirements: RequirementsData): string[] {
3838
let server_home: string = path.resolve(__dirname, '../server');
3939
let launchersFound: Array<string> = glob.sync('**/org.eclipse.lsp4xml-uber.jar', { cwd: server_home });
4040
if (launchersFound.length) {
41-
params.push('-jar'); params.push(path.resolve(server_home, launchersFound[0]));
41+
let xmlJavaExtensionsClasspath = '';
42+
if (xmlJavaExtensions.length > 0) {
43+
const pathSeparator = os.platform() == 'win32' ? ';' : ':';
44+
xmlJavaExtensionsClasspath = pathSeparator + xmlJavaExtensions.join(pathSeparator);
45+
}
46+
params.push('-cp'); params.push(path.resolve(server_home, launchersFound[0]) + xmlJavaExtensionsClasspath);
47+
params.push('org.eclipse.lsp4xml.XMLServerLauncher');
4248
} else {
4349
return null;
4450
}

src/plugin.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
'use strict';
2+
3+
import * as vscode from 'vscode';
4+
import * as path from 'path';
5+
import { Commands } from './commands';
6+
7+
let existingExtensions: Array<string>;
8+
9+
export function collectXmlJavaExtensions(extensions: readonly vscode.Extension<any>[]): string[] {
10+
const result = [];
11+
if (extensions && extensions.length) {
12+
for (const extension of extensions) {
13+
const contributesSection = extension.packageJSON['contributes'];
14+
if (contributesSection) {
15+
const xmlJavaExtensions = contributesSection['xml.javaExtensions'];
16+
if (Array.isArray(xmlJavaExtensions) && xmlJavaExtensions.length) {
17+
for (const xmLJavaExtensionPath of xmlJavaExtensions) {
18+
result.push(path.resolve(extension.extensionPath, xmLJavaExtensionPath));
19+
}
20+
}
21+
}
22+
}
23+
}
24+
// Make a copy of extensions:
25+
existingExtensions = result.slice();
26+
return result;
27+
}
28+
29+
export function onExtensionChange(extensions: readonly vscode.Extension<any>[]) {
30+
if (!existingExtensions) {
31+
return;
32+
}
33+
const oldExtensions = new Set(existingExtensions.slice());
34+
const newExtensions = collectXmlJavaExtensions(extensions);
35+
let hasChanged = ( oldExtensions.size !== newExtensions.length);
36+
if (!hasChanged) {
37+
for (const newExtension of newExtensions) {
38+
if (!oldExtensions.has(newExtension)) {
39+
hasChanged = true;
40+
break;
41+
}
42+
}
43+
}
44+
45+
if (hasChanged) {
46+
const msg = `Extensions to the XML Language Server changed, reloading ${vscode.env.appName} is required for the changes to take effect.`;
47+
const action = 'Reload';
48+
const restartId = Commands.RELOAD_WINDOW;
49+
vscode.window.showWarningMessage(msg, action).then((selection) => {
50+
if (action === selection) {
51+
vscode.commands.executeCommand(restartId);
52+
}
53+
});
54+
}
55+
}

src/tagClosing.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export function activateTagClosing(tagProvider: (document: TextDocument, positio
4040
isEnabled = true;
4141
}
4242

43-
function onDidChangeTextDocument(document: TextDocument, changes: TextDocumentContentChangeEvent[]) {
43+
function onDidChangeTextDocument(document: TextDocument, changes: ReadonlyArray<TextDocumentContentChangeEvent>) {
4444
if (!isEnabled) {
4545
return;
4646
}

0 commit comments

Comments
 (0)