From b212e3b8ab11678b06548a17364c483c57069e47 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Thu, 5 Oct 2017 19:58:34 -0400 Subject: [PATCH] Support sts/highlight message. Support "standalone" server for Atom --- atom-extensions/atom-boot-java/lib/main.js | 82 +++++++++++++++++- atom-extensions/atom-boot-java/package.json | 2 +- .../atom-boot-java/styles/boot-icon.png | Bin 0 -> 617 bytes .../styles/hints.atom-text-editor.less | 16 ++++ atom-extensions/atom-bosh/package.json | 2 +- .../atom-cf-manifest-yaml/package.json | 2 +- atom-extensions/atom-commons/lib/index.js | 3 +- .../atom-commons/lib/jar-language-client.js | 34 +++++++- .../atom-commons/lib/sts-adapter.js | 21 +++-- atom-extensions/atom-commons/package.json | 2 +- atom-extensions/atom-concourse/package.json | 2 +- 11 files changed, 146 insertions(+), 20 deletions(-) create mode 100644 atom-extensions/atom-boot-java/styles/boot-icon.png create mode 100644 atom-extensions/atom-boot-java/styles/hints.atom-text-editor.less 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 0000000000000000000000000000000000000000..de88ef0d5ceb61e6e6b141349ae5269c9187a59a GIT binary patch literal 617 zcmV-v0+#)WP)|WK~y-6rIWu)TTv9pKj+1~MB|H5O0)AYOXdvzXI;@+8$XypN@4-;fb1CtKd>3s`+DR9R`50! zjx7bnBBCPF3Q#UZz3B7*CXkX0Sz^_U8fP#zNO!oKVP}}kP=?J z(YKumibjni2wS(d7)gvUHZaC$|0tc0z7VOL7s^NnMt+9w*Hc05(2ukQ>hh+g}2I zj7r)^Tc$|Rz_AA$OZ*xvrV%1H*N%;nCo9KG(J>ctk z21d { 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"