From a7e6b241f4fe6a986da00a4f1f9cee6a4f0f1d06 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Fri, 6 Jan 2017 12:44:23 +0100 Subject: [PATCH] added project structure for spring boot java language server --- vscode-extensions/pom.xml | 1 + vscode-extensions/vscode-boot-java/.classpath | 31 ++++++ vscode-extensions/vscode-boot-java/.gitignore | 17 ++++ vscode-extensions/vscode-boot-java/.project | 23 +++++ .../org.eclipse.core.resources.prefs | 5 + .../.settings/org.eclipse.jdt.core.prefs | 5 + .../.settings/org.eclipse.m2e.core.prefs | 4 + .../vscode-boot-java/.vscode/launch.json | 28 ++++++ .../vscode-boot-java/.vscode/settings.json | 12 +++ .../vscode-boot-java/.vscode/tasks.json | 30 ++++++ .../vscode-boot-java/.vscodeignore | 30 ++++++ vscode-extensions/vscode-boot-java/README.md | 73 ++++++++++++++ .../vscode-boot-java/lib/.gitignore | 1 + .../vscode-boot-java/lib/Main.ts | 37 +++++++ .../vscode-boot-java/package.json | 47 +++++++++ vscode-extensions/vscode-boot-java/pom.xml | 94 ++++++++++++++++++ .../vscode-boot-java/scripts/preinstall.sh | 5 + .../vscode-boot-java/spring-boot-logo.png | Bin 0 -> 5897 bytes .../boot/java/BootJavaLanguageServer.java | 78 +++++++++++++++ .../ide/vscode/boot/java/Main.java | 34 +++++++ .../completions/BootJavaCompletionEngine.java | 62 ++++++++++++ .../completions/BootJavaReconcileEngine.java | 13 +++ .../vscode-boot-java/tsconfig.json | 21 ++++ 23 files changed, 651 insertions(+) create mode 100644 vscode-extensions/vscode-boot-java/.classpath create mode 100644 vscode-extensions/vscode-boot-java/.gitignore create mode 100644 vscode-extensions/vscode-boot-java/.project create mode 100644 vscode-extensions/vscode-boot-java/.settings/org.eclipse.core.resources.prefs create mode 100644 vscode-extensions/vscode-boot-java/.settings/org.eclipse.jdt.core.prefs create mode 100644 vscode-extensions/vscode-boot-java/.settings/org.eclipse.m2e.core.prefs create mode 100644 vscode-extensions/vscode-boot-java/.vscode/launch.json create mode 100644 vscode-extensions/vscode-boot-java/.vscode/settings.json create mode 100644 vscode-extensions/vscode-boot-java/.vscode/tasks.json create mode 100644 vscode-extensions/vscode-boot-java/.vscodeignore create mode 100644 vscode-extensions/vscode-boot-java/README.md create mode 100644 vscode-extensions/vscode-boot-java/lib/.gitignore create mode 100644 vscode-extensions/vscode-boot-java/lib/Main.ts create mode 100644 vscode-extensions/vscode-boot-java/package.json create mode 100644 vscode-extensions/vscode-boot-java/pom.xml create mode 100755 vscode-extensions/vscode-boot-java/scripts/preinstall.sh create mode 100644 vscode-extensions/vscode-boot-java/spring-boot-logo.png create mode 100644 vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java create mode 100644 vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/Main.java create mode 100644 vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaCompletionEngine.java create mode 100644 vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaReconcileEngine.java create mode 100644 vscode-extensions/vscode-boot-java/tsconfig.json diff --git a/vscode-extensions/pom.xml b/vscode-extensions/pom.xml index 42d31f2e7..d0abfc259 100644 --- a/vscode-extensions/pom.xml +++ b/vscode-extensions/pom.xml @@ -12,6 +12,7 @@ commons vscode-boot-properties + vscode-boot-java vscode-manifest-yaml vscode-concourse diff --git a/vscode-extensions/vscode-boot-java/.classpath b/vscode-extensions/vscode-boot-java/.classpath new file mode 100644 index 000000000..d46faf10e --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.classpath @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vscode-extensions/vscode-boot-java/.gitignore b/vscode-extensions/vscode-boot-java/.gitignore new file mode 100644 index 000000000..e0fd3a462 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.gitignore @@ -0,0 +1,17 @@ +out +node_modules +target +*.log +*.log.* +classpath.txt +*.vsix +repo +.idea +*.iml +.DS_Store +**/.DS_Store +src/test/resources/test-projects/**/.classpath +src/test/resources/test-projects/**/.project +src/test/resources/test-projects/**/.factorypath +src/test/resources/test-projects/**/.settings/** +src/test/resources/test-projects/**/bin/** \ No newline at end of file diff --git a/vscode-extensions/vscode-boot-java/.project b/vscode-extensions/vscode-boot-java/.project new file mode 100644 index 000000000..c0cec16d7 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.project @@ -0,0 +1,23 @@ + + + vscode-boot-java + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/vscode-extensions/vscode-boot-java/.settings/org.eclipse.core.resources.prefs b/vscode-extensions/vscode-boot-java/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..cdfe4f1b6 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/=UTF-8 diff --git a/vscode-extensions/vscode-boot-java/.settings/org.eclipse.jdt.core.prefs b/vscode-extensions/vscode-boot-java/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..714351aec --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/vscode-extensions/vscode-boot-java/.settings/org.eclipse.m2e.core.prefs b/vscode-extensions/vscode-boot-java/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/vscode-extensions/vscode-boot-java/.vscode/launch.json b/vscode-extensions/vscode-boot-java/.vscode/launch.json new file mode 100644 index 000000000..52ebf9f9e --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.vscode/launch.json @@ -0,0 +1,28 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +{ + "version": "0.1.0", + "configurations": [ + { + "name": "Launch Extension", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": ["--extensionDevelopmentPath=${workspaceRoot}" ], + "stopOnEntry": false, + "sourceMaps": true, + "outDir": "${workspaceRoot}/out/lib", + "preLaunchTask": "npm" + }, + { + "name": "Launch Tests", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test" ], + "stopOnEntry": false, + "sourceMaps": true, + "outDir": "${workspaceRoot}/out/test", + "preLaunchTask": "npm" + } + ] +} diff --git a/vscode-extensions/vscode-boot-java/.vscode/settings.json b/vscode-extensions/vscode-boot-java/.vscode/settings.json new file mode 100644 index 000000000..c5592bee9 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.vscode/settings.json @@ -0,0 +1,12 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "out": true, // set this to true to hide the "out" folder with the compiled JS files + "node_modules": false, + "target": true + }, + "search.exclude": { + "out": true // set this to false to include "out" folder in search results + }, + "typescript.tsdk": "./node_modules/typescript/lib" // we want to use the TS server from our node_modules folder to control its version +} \ No newline at end of file diff --git a/vscode-extensions/vscode-boot-java/.vscode/tasks.json b/vscode-extensions/vscode-boot-java/.vscode/tasks.json new file mode 100644 index 000000000..1cbb9fd45 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.vscode/tasks.json @@ -0,0 +1,30 @@ +// Available variables which can be used inside of strings. +// ${workspaceRoot}: the root folder of the team +// ${file}: the current opened file +// ${fileBasename}: the current opened file's basename +// ${fileDirname}: the current opened file's dirname +// ${fileExtname}: the current opened file's extension +// ${cwd}: the current working directory of the spawned process + +// A task runner that calls a custom npm script that compiles the extension. +{ + "version": "0.1.0", + + // we want to run npm + "command": "npm", + + // the command is a shell script + "isShellCommand": true, + + // show the output window only if unrecognized errors occur. + "showOutput": "silent", + + // we run the custom script "compile" as defined in package.json + "args": ["run", "compile"], //, "--loglevel", "silent"], + + // The tsc compiler is started in watching mode + "isWatching": true, + + // use the standard tsc in watch mode problem matcher to find compile problems in the output. + "problemMatcher": "$tsc-watch" +} \ No newline at end of file diff --git a/vscode-extensions/vscode-boot-java/.vscodeignore b/vscode-extensions/vscode-boot-java/.vscodeignore new file mode 100644 index 000000000..37a538825 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/.vscodeignore @@ -0,0 +1,30 @@ +# IDE configs +.vscode/** +.idea/** +*.iml +javaconfig.json +classpath.txt +tsconfig.json +tsd.json +*.xml + +# Logs +*.log* + +# Sources +typings/** +src/** +test/** +lib/** +!lib/javaconfig.schema.json +repo/** +scripts/** + +# Compiler output +out/test/** +target/** +!target/vscode-boot-properties-*.jar + +# Extensions +.gitignore +**/*.map diff --git a/vscode-extensions/vscode-boot-java/README.md b/vscode-extensions/vscode-boot-java/README.md new file mode 100644 index 000000000..fd3d73970 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/README.md @@ -0,0 +1,73 @@ +# VS Code Language Server for Spring Boot Application Properties + +VSCode extension and Language Server providing support for working with Spring Boot apps in Java. + +## Installation: + +Currently this plugin is not distributed via vscode marketplace. You can only install +it from a .vsix file. You can download it here: + + TODO: add link + +To install it: + +- open vscode. +- press `CTRL-SHIFT-P` and search for VSIX +- select `Extension: Install from VSIX` + +## Usage: + +The extension will automatically activate when you edit files with the following +name patterns: + + - `*.java` => activates support for Java files + +# Developer notes + +## Bulding and Running + +This project consists of three pieces: + + - a vscode-extension which is a language-server client implemented in TypeScript. + - commons-vscode: a local npm module with some utilities implemented in TypeScript. + - a language server implemented in Java. + +To build all these pieces you normally only need to run: + + npm install + +**However, the first time you build** it might fail trying to +find the `commons-vscode` module on npm central. Once we publish a stable +version of that module on npm central that will no longer be a problem. +Until that time, you can work around this by doing a one time manual +run of the `preinstall` script prior to running `npm install`: + + ./scripts/preinstall.sh + npm install + +Now you can open the client-app in vscode. From the root of this project. + + code . + +To launch the language server in a vscode runtime, press F5. + +## Debugging + +To debug the language server, open `lib/Main.ts` and edit to set the +`DEBUG` option to `true`. When you laucnh the app next by pressing +`F5` it will launch with debug options being passed to the JVM. + +You can then connect a 'Remote Java' Eclipse debugger on port 8000. + +## Packaging as a vscode extension + +First make sure the stuff is all built locally: + + ./scripts/preinstall.sh # only needed if this is the first build. + npm install + +Then package it: + + npm run vsce-package + +This produces a `.vsix` file which you can install directly into vscode. \ No newline at end of file diff --git a/vscode-extensions/vscode-boot-java/lib/.gitignore b/vscode-extensions/vscode-boot-java/lib/.gitignore new file mode 100644 index 000000000..a6c7c2852 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/lib/.gitignore @@ -0,0 +1 @@ +*.js diff --git a/vscode-extensions/vscode-boot-java/lib/Main.ts b/vscode-extensions/vscode-boot-java/lib/Main.ts new file mode 100644 index 000000000..30b7d2bbc --- /dev/null +++ b/vscode-extensions/vscode-boot-java/lib/Main.ts @@ -0,0 +1,37 @@ +'use strict'; +// The module 'vscode' contains the VS Code extensibility API +// Import the module and reference it with the alias vscode in your code below + +import * as VSCode from 'vscode'; +import * as Path from 'path'; +import * as FS from 'fs'; +import * as Net from 'net'; +import * as ChildProcess from 'child_process'; +import {LanguageClient, LanguageClientOptions, SettingMonitor, ServerOptions, StreamInfo} from 'vscode-languageclient'; +import {TextDocument} from 'vscode'; + +import * as commons from 'commons-vscode'; + +/** Called when extension is activated */ +export function activate(context: VSCode.ExtensionContext) { + let options : commons.ActivatorOptions = { + DEBUG: true, + extensionId: 'vscode-boot-java', + fatJarFile: 'target/vscode-boot-java-0.0.1-SNAPSHOT.jar', + clientOptions: { + // HACK!!! documentSelector only takes string|string[] where string is language id, but DocumentFilter object is passed instead + // Reasons: + // 1. documentSelector is just passed over to functions like #registerHoverProvider(documentSelector, ...) that take documentSelector + // parameter in string | DocumentFilter | string[] | DocumentFilter[] format + // 2. Combination of non string|string[] documentSelector parameter and synchronize.textDocumentFilter function makes doc synchronization + // events pass on to Language Server only for documents for which function passed via textDocumentFilter property return true + + // TODO: Remove cast ones https://github.com/Microsoft/vscode-languageserver-node/issues/9 is resolved + documentSelector: ['java'], + synchronize: { + configurationSection: 'vscode-boot-java' + } + } + }; + commons.activate(options, context); +} diff --git a/vscode-extensions/vscode-boot-java/package.json b/vscode-extensions/vscode-boot-java/package.json new file mode 100644 index 000000000..95367b315 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/package.json @@ -0,0 +1,47 @@ +{ + "name": "vscode-boot-java", + "displayName": "Spring Boot Java Support", + "description": "Provides validation, content assist, and more working with Spring Boot applications Java code", + "icon": "spring-boot-logo.png", + "version": "0.0.1", + "publisher": "Pivotal", + "repository": { + "type": "git", + "url": "https://github.com/spring-projects/sts4.git" + }, + "license": "EPL-1.0", + "engines": { + "npm": "^3.0.0", + "vscode": "^1.5.0" + }, + "categories": [ + "Languages", + "Linters" + ], + "keywords": [ + "java", "spring-boot" + ], + "activationEvents": [ + "onLanguage:ini", + "onLanguage:java" + ], + "main": "./out/lib/Main", + "scripts": { + "prepublish": "tsc -p .", + "clean": "rm -fr node_modules out *.vsix", + "compile": "tsc -watch -p ./", + "preinstall": "./scripts/preinstall.sh", + "postinstall": "node ./node_modules/vscode/bin/install", + "vsce-package": "vsce package" + }, + "dependencies": { + "vscode-languageclient": "2.5.x", + "commons-vscode": "^0.0.1" + }, + "devDependencies": { + "vsce": "^1.17.0", + "typescript": "^2.0.x", + "@types/node": "^6.0.40", + "vscode": "^1.0.0" + } +} diff --git a/vscode-extensions/vscode-boot-java/pom.xml b/vscode-extensions/vscode-boot-java/pom.xml new file mode 100644 index 000000000..af357ead1 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/pom.xml @@ -0,0 +1,94 @@ + + + 4.0.0 + vscode-boot-java + jar + + + org.springframework.ide.vscode + commons-parent + 0.0.1-SNAPSHOT + ../commons/pom.xml + + + + + + oss-sonatype + oss-sonatype + https://oss.sonatype.org/content/repositories/snapshots/ + + true + + + + + + + distribution-repository + Temporary Staging Repository + file://${basedir}/dist + + + + + + org.springframework.ide.vscode + commons-maven + ${project.version} + + + org.springframework.ide.vscode + commons-language-server + ${project.version} + + + + + org.springframework.ide.vscode + language-server-test-harness + ${project.version} + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + + + + + org.springframework.boot + spring-boot-maven-plugin + 1.4.1.RELEASE + + + + repackage + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + + test-projects/** + + + + + + diff --git a/vscode-extensions/vscode-boot-java/scripts/preinstall.sh b/vscode-extensions/vscode-boot-java/scripts/preinstall.sh new file mode 100755 index 000000000..15b18c87f --- /dev/null +++ b/vscode-extensions/vscode-boot-java/scripts/preinstall.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -e +(cd ../commons-vscode ; npm install) +npm install ../commons-vscode +../mvnw -U -f ../pom.xml -pl vscode-boot-java -am clean install diff --git a/vscode-extensions/vscode-boot-java/spring-boot-logo.png b/vscode-extensions/vscode-boot-java/spring-boot-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0ccdef63a2dc50dd3215399d80fcacff1c4a1b75 GIT binary patch literal 5897 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 ZI`^R1#mdozpX^M1>O)HN%)&yv(5d3 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 literal 0 HcmV?d00001 diff --git a/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java new file mode 100644 index 000000000..1aadcdd72 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2016 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.java; + +import org.eclipse.lsp4j.CompletionOptions; +import org.eclipse.lsp4j.ServerCapabilities; +import org.eclipse.lsp4j.TextDocumentSyncKind; +import org.springframework.ide.vscode.boot.java.completions.BootJavaCompletionEngine; +import org.springframework.ide.vscode.boot.java.completions.BootJavaReconcileEngine; +import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine; +import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter; +import org.springframework.ide.vscode.commons.languageserver.java.DefaultJavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.java.IJavaProjectFinderStrategy; +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; +import org.springframework.ide.vscode.commons.maven.JavaProjectWithClasspathFileFinderStrategy; +import org.springframework.ide.vscode.commons.maven.MavenProjectFinderStrategy; +import org.springframework.ide.vscode.commons.util.text.TextDocument; + +/** + * Language Server for Spring Boot Application Properties files + * + * @author Martin Lippert + */ +public class BootJavaLanguageServer extends SimpleLanguageServer { + + public static final JavaProjectFinder DEFAULT_PROJECT_FINDER = new DefaultJavaProjectFinder(new IJavaProjectFinderStrategy[] { + new MavenProjectFinderStrategy(), + new JavaProjectWithClasspathFileFinderStrategy() + }); + + private final JavaProjectFinder javaProjectFinder; + private final VscodeCompletionEngineAdapter completionEngine; + + public BootJavaLanguageServer(JavaProjectFinder javaProjectFinder) { + this.javaProjectFinder = javaProjectFinder; + SimpleTextDocumentService documents = getTextDocumentService(); + + IReconcileEngine reconcileEngine = new BootJavaReconcileEngine(); + documents.onDidChangeContent(params -> { + TextDocument doc = params.getDocument(); + validateWith(doc, reconcileEngine); + }); + + ICompletionEngine bootCompletionEngine = new BootJavaCompletionEngine(); + completionEngine = new VscodeCompletionEngineAdapter(this, bootCompletionEngine); + completionEngine.setMaxCompletionsNumber(100); + documents.onCompletion(completionEngine::getCompletions); + documents.onCompletionResolve(completionEngine::resolveCompletion); + } + + public void setMaxCompletionsNumber(int number) { + completionEngine.setMaxCompletionsNumber(number); + } + + @Override + protected ServerCapabilities getServerCapabilities() { + ServerCapabilities c = new ServerCapabilities(); + + c.setTextDocumentSync(TextDocumentSyncKind.Incremental); + CompletionOptions completionProvider = new CompletionOptions(); + completionProvider.setResolveProvider(false); + c.setCompletionProvider(completionProvider); + + return c; + } + +} diff --git a/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/Main.java b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/Main.java new file mode 100644 index 000000000..73e1103bd --- /dev/null +++ b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/Main.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2016 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.java; + +import java.io.IOException; + +import org.springframework.ide.vscode.commons.languageserver.LaunguageServerApp; +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; + +/** + * Starts up Language Server process + * + * @author Martin Lippert + */ +public class Main { + + public static void main(String[] args) throws IOException { + LaunguageServerApp.start(() -> { + JavaProjectFinder javaProjectFinder = BootJavaLanguageServer.DEFAULT_PROJECT_FINDER; + SimpleLanguageServer server = new BootJavaLanguageServer(javaProjectFinder); + return server; + }); + } + +} diff --git a/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaCompletionEngine.java b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaCompletionEngine.java new file mode 100644 index 000000000..7f4877c3f --- /dev/null +++ b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaCompletionEngine.java @@ -0,0 +1,62 @@ +package org.springframework.ide.vscode.boot.java.completions; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.eclipse.lsp4j.CompletionItemKind; +import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; +import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine; +import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; +import org.springframework.ide.vscode.commons.util.Renderable; +import org.springframework.ide.vscode.commons.util.Renderables; +import org.springframework.ide.vscode.commons.util.text.IDocument; + +public class BootJavaCompletionEngine implements ICompletionEngine { + + @Override + public Collection getCompletions(IDocument document, int offset) throws Exception { + List completions = new ArrayList<>(); + + ICompletionProposal proposal = new ICompletionProposal() { + + @Override + public DocumentEdits getTextEdit() { + DocumentEdits edits = new DocumentEdits(document); + edits.insert(0, "my noew java code from spring boot completions!!!"); + + return edits; + } + + @Override + public String getLabel() { + return "Do a great Spring Boot Java Code completion"; + } + + @Override + public CompletionItemKind getKind() { + return CompletionItemKind.Text; + } + + @Override + public Renderable getDocumentation() { + return Renderables.text("this describes the Boot Java completion in more detail"); + } + + @Override + public String getDetail() { + return "and here are the details"; + } + + @Override + public ICompletionProposal deemphasize() { + return null; + } + }; + + completions.add(proposal); + + return completions; + } + +} diff --git a/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaReconcileEngine.java b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaReconcileEngine.java new file mode 100644 index 000000000..a7be7f3f1 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/src/main/java/org/springframework/ide/vscode/boot/java/completions/BootJavaReconcileEngine.java @@ -0,0 +1,13 @@ +package org.springframework.ide.vscode.boot.java.completions; + +import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector; +import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; +import org.springframework.ide.vscode.commons.util.text.IDocument; + +public class BootJavaReconcileEngine implements IReconcileEngine { + + @Override + public void reconcile(IDocument doc, IProblemCollector problemCollector) { + } + +} diff --git a/vscode-extensions/vscode-boot-java/tsconfig.json b/vscode-extensions/vscode-boot-java/tsconfig.json new file mode 100644 index 000000000..1905ffea7 --- /dev/null +++ b/vscode-extensions/vscode-boot-java/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "module": "commonjs", + "moduleResolution": "node", + "target": "es6", + "lib": [ + "es6" + ], + "declaration": true, + "outDir": "out", + "sourceMap": true, + "rootDir": "." + }, + "include": [ + "typings/*.d.ts", + "lib/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file