diff --git a/atom-extensions/atom-boot-java/lib/main.js b/atom-extensions/atom-boot-java/lib/main.js index dded7498c..ac2e8c2cf 100644 --- a/atom-extensions/atom-boot-java/lib/main.js +++ b/atom-extensions/atom-boot-java/lib/main.js @@ -1,7 +1,11 @@ const path = require('path'); -const { JarLanguageClient } = require('pivotal-atom-languageclient-commons'); +const { JarLanguageClient, StsAdapter } = require('pivotal-atom-languageclient-commons'); +const { Convert } = require('atom-languageclient'); const PROPERTIES = require('../properties.json'); +const BOOT_DATA_MARKER_TYPE = 'BootApp-Hint'; +const BOOT_HINT_GUTTER_NAME = 'boot-hint-gutter'; + class BootJavaLanguageClient extends JarLanguageClient { constructor() { @@ -11,6 +15,7 @@ class BootJavaLanguageClient extends JarLanguageClient { path.join(__dirname, '..', 'server'), 'boot-java-language-server.jar' ); + this.DEBUG = true; } getGrammarScopes() { @@ -32,6 +37,28 @@ class BootJavaLanguageClient extends JarLanguageClient { super.activate(); } + compatibleJavaVersion(javaExecutablePath) { + return super.compatibleJavaVersion(javaExecutablePath).then(version => { + this.fileExists(`${javaExecutablePath}/bin/${this.correctBinname('javac')}`).then(exists => { + if (!exists) { + const notification = atom.notifications.addWarning(`"Boot-Java" Package Functionality Limited`, { + dismissable: true, + detail: 'No JDK found', + description: 'JAVA_HOME environment variable does not point to JDK hence Boot Hints are unavailable', + buttons: [{ + text: 'OK', + onDidClick: () => { + notification.dismiss() + }, + }], + }); + } + }); + return version; + }); + } + + launchVmArgs(version) { return [ '-Dorg.slf4j.simpleLogger.logFile=boot-java.log', @@ -42,6 +69,59 @@ class BootJavaLanguageClient extends JarLanguageClient { } + createStsAdapter() { + return new BootStsAdapter(); + } + +} + +class BootStsAdapter extends StsAdapter { + + constructor() { + super(); + } + + onHighlight(params) { + this.findEditors(params.doc.uri).forEach(editor => this.markHintsForEditor(editor, params.ranges)); + } + + markHintsForEditor(editor, ranges) { + editor.findMarkers(BOOT_DATA_MARKER_TYPE).forEach(m => m.destroy()); + if (Array.isArray(ranges)) { + ranges.forEach(range => this.createHintMarker(editor, range)); + } + const gutter = editor.gutterWithName(BOOT_HINT_GUTTER_NAME); + if (gutter) { + if (!ranges || !ranges.length) { + gutter.hide(); + } else if (!gutter.isVisible()) { + gutter.show(); + } + } + } + + createHintMarker(editor, range) { + // Create marker model + const marker = editor.markBufferRange(Convert.lsRangeToAtomRange(range), BOOT_DATA_MARKER_TYPE); + + // Marker around the text in the editor + editor.decorateMarker(marker, { + type: 'highlight', + class: 'boot-hint' + }); + + // Marker in the diagnostic gutter + let gutter = editor.gutterWithName(BOOT_HINT_GUTTER_NAME); + if (!gutter) { + gutter = editor.addGutter({ + name: BOOT_HINT_GUTTER_NAME, + visible: false, + }); + } + const iconElement = document.createElement('span'); + iconElement.setAttribute('class', 'gutter-boot-hint'); + gutter.decorateMarker(marker, {item: iconElement}); + } } module.exports = new BootJavaLanguageClient(); diff --git a/atom-extensions/atom-boot-java/package.json b/atom-extensions/atom-boot-java/package.json index f4bc6d464..e47066374 100644 --- a/atom-extensions/atom-boot-java/package.json +++ b/atom-extensions/atom-boot-java/package.json @@ -17,7 +17,7 @@ "dependencies": { "atom-package-deps": "^4.6.0", "download": "^6.2.5", - "pivotal-atom-languageclient-commons": "0.0.11" + "pivotal-atom-languageclient-commons": "0.0.12" }, "devDependencies": { "coffeelint": "^1.10.1" diff --git a/atom-extensions/atom-boot-java/styles/boot-icon.png b/atom-extensions/atom-boot-java/styles/boot-icon.png new file mode 100644 index 000000000..de88ef0d5 Binary files /dev/null and b/atom-extensions/atom-boot-java/styles/boot-icon.png differ diff --git a/atom-extensions/atom-boot-java/styles/hints.atom-text-editor.less b/atom-extensions/atom-boot-java/styles/hints.atom-text-editor.less new file mode 100644 index 000000000..469540c21 --- /dev/null +++ b/atom-extensions/atom-boot-java/styles/hints.atom-text-editor.less @@ -0,0 +1,16 @@ +.boot-hint .region { + border-color: #32BA56; + border-style: dotted; + border-width: 1px; +} + +atom-text-editor::shadow { + .gutter-boot-hint:before { + content: url("atom://boot-java/styles/boot-icon.png"); + display: block; + width: 10px; + height: 1em; + margin: 0 2px 0 0; + float: left; + } +} diff --git a/atom-extensions/atom-bosh/package.json b/atom-extensions/atom-bosh/package.json index 75467a29e..9ecd253e4 100644 --- a/atom-extensions/atom-bosh/package.json +++ b/atom-extensions/atom-bosh/package.json @@ -19,7 +19,7 @@ "dependencies": { "atom-package-deps": "^4.6.0", "download": "^6.2.5", - "pivotal-atom-languageclient-commons": "0.0.11" + "pivotal-atom-languageclient-commons": "0.0.12" }, "configSchema": { "bosh": { diff --git a/atom-extensions/atom-cf-manifest-yaml/package.json b/atom-extensions/atom-cf-manifest-yaml/package.json index 675252bcf..09bda7938 100644 --- a/atom-extensions/atom-cf-manifest-yaml/package.json +++ b/atom-extensions/atom-cf-manifest-yaml/package.json @@ -19,7 +19,7 @@ "dependencies": { "atom-package-deps": "^4.6.0", "download": "^6.2.5", - "pivotal-atom-languageclient-commons": "0.0.11" + "pivotal-atom-languageclient-commons": "0.0.12" }, "devDependencies": { "coffeelint": "^1.10.1" diff --git a/atom-extensions/atom-commons/lib/index.js b/atom-extensions/atom-commons/lib/index.js index e21efad92..33b710d23 100644 --- a/atom-extensions/atom-commons/lib/index.js +++ b/atom-extensions/atom-commons/lib/index.js @@ -1,3 +1,4 @@ import { JarLanguageClient } from './jar-language-client'; +import { StsAdapter } from './sts-adapter'; -export { JarLanguageClient }; \ No newline at end of file +export { JarLanguageClient, StsAdapter }; \ No newline at end of file diff --git a/atom-extensions/atom-commons/lib/jar-language-client.js b/atom-extensions/atom-commons/lib/jar-language-client.js index 9f44267a1..6c33428d6 100644 --- a/atom-extensions/atom-commons/lib/jar-language-client.js +++ b/atom-extensions/atom-commons/lib/jar-language-client.js @@ -13,6 +13,8 @@ import { StsAdapter } from './sts-adapter'; export class JarLanguageClient extends AutoLanguageClient { + DEBUG = false; + constructor(serverDownloadUrl, serverHome, serverLauncherJar) { super(); @@ -38,6 +40,10 @@ export class JarLanguageClient extends AutoLanguageClient { let childProcess; + if (this.DEBUG) { + return this.connectToLS(); + } + return new Promise((resolve, reject) => { let basePort = Math.floor(Math.random() * 10000) + 40000; PortFinder.getPort({port: basePort}, (err, port) => { @@ -54,10 +60,28 @@ export class JarLanguageClient extends AutoLanguageClient { }); } + connectToLS() { + return new Promise(resolve => { + this.socket = net.connect({ + port: 5007 + }); + resolve({ + pid: -1, + kill: function() { + console.log('fake shutdown'); + } + }) + }); + } + // Start adapters that are not shared between servers startExclusiveAdapters(server) { super.startExclusiveAdapters(server); - StsAdapter.attach(server.connection); + + const stsAdapter = this.createStsAdapter() || new StsAdapter(); + server.connection._onRequest({method: 'sts/moveCursor'}, params => stsAdapter.onMoveCursor(params)); + server.connection._onNotification({method: 'sts/progress'}, params => stsAdapter.onProgress(params)); + server.connection._onNotification({method: 'sts/highlight'}, params => stsAdapter.onHighlight(params)); } @@ -202,9 +226,15 @@ export class JarLanguageClient extends AutoLanguageClient { // Late wire-up of listeners after initialize method has been sent postInitialization(server) { server.disposable.add(new Disposable(() => { - this.server.close() + if (this.server) { + this.server.close() + } })); } + createStsAdapter() { + + } + } diff --git a/atom-extensions/atom-commons/lib/sts-adapter.js b/atom-extensions/atom-commons/lib/sts-adapter.js index 68b87fbc7..45c7e12ea 100644 --- a/atom-extensions/atom-commons/lib/sts-adapter.js +++ b/atom-extensions/atom-commons/lib/sts-adapter.js @@ -2,20 +2,19 @@ import {Convert} from 'atom-languageclient'; export class StsAdapter { - // Public: Attach to a {StsLanguageClientConnection} to receive messages. - static attach(connection) { - connection._onRequest({method: 'sts/moveCursor'}, params => StsAdapter.onMoveCursor(params)); - connection._onNotification({method: 'sts/progress'}, params => StsAdapter.onProgress(params)); + constructor() {} + + findEditors(uri) { + return atom.workspace.getTextEditors() + .filter(e => e && e.getPath() && Convert.pathToUri(e.getPath()) === uri); } - static onMoveCursor(params) { - atom.workspace.getTextEditors() - .filter(e => Convert.pathToUri(e.getPath()) === params.uri) - .forEach(e => e.setCursorScreenPosition(Convert.positionToPoint(params.position))); + onMoveCursor(params) { + findEditors(params.uri).forEach(e => e.setCursorScreenPosition(Convert.positionToPoint(params.position))); return { applied: true}; } - static onProgress(params) { - console.log('PROGRESS: ' + JSON.stringify(params)); - } + onProgress(params) {} + + onHighlight(params) {} } diff --git a/atom-extensions/atom-commons/package.json b/atom-extensions/atom-commons/package.json index bbdf0514f..0f00676c3 100644 --- a/atom-extensions/atom-commons/package.json +++ b/atom-extensions/atom-commons/package.json @@ -1,6 +1,6 @@ { "name": "pivotal-atom-languageclient-commons", - "version": "0.0.11", + "version": "0.0.12", "description": "Atom language client commons for STS4 language servers", "repository": "https://github.com/spring-projects/sts4", "license": "MIT", diff --git a/atom-extensions/atom-concourse/package.json b/atom-extensions/atom-concourse/package.json index 075f4c2cc..a9d60bbac 100644 --- a/atom-extensions/atom-concourse/package.json +++ b/atom-extensions/atom-concourse/package.json @@ -19,7 +19,7 @@ "dependencies": { "atom-package-deps": "^4.6.0", "download": "^6.2.5", - "pivotal-atom-languageclient-commons": "0.0.11" + "pivotal-atom-languageclient-commons": "0.0.12" }, "devDependencies": { "coffeelint": "^1.10.1"