diff --git a/atom-extensions/atom-bosh/package.json b/atom-extensions/atom-bosh/package.json
index cb0262a5f..41a2b2446 100644
--- a/atom-extensions/atom-bosh/package.json
+++ b/atom-extensions/atom-bosh/package.json
@@ -1,6 +1,6 @@
{
"name": "bosh-yaml",
- "version": "0.1.6",
+ "version": "0.2.0",
"description": "Provides validation and content assist for various Bosh configuration files",
"repository": "https://github.com/spring-projects/atom-bosh",
"icon": "icon.png",
diff --git a/atom-extensions/atom-cf-manifest-yaml/package.json b/atom-extensions/atom-cf-manifest-yaml/package.json
index 7a37af272..680f317d1 100644
--- a/atom-extensions/atom-cf-manifest-yaml/package.json
+++ b/atom-extensions/atom-cf-manifest-yaml/package.json
@@ -1,6 +1,6 @@
{
"name": "cf-manifest-yaml",
- "version": "0.1.6",
+ "version": "0.2.0",
"description": "Cloud Foundry Deployment Manifest YAML support for Atom",
"repository": "https://github.com/spring-projects/atom-cf-manifest-yaml",
"icon": "icon.png",
diff --git a/atom-extensions/atom-concourse/package.json b/atom-extensions/atom-concourse/package.json
index 6403267dc..5295f9203 100644
--- a/atom-extensions/atom-concourse/package.json
+++ b/atom-extensions/atom-concourse/package.json
@@ -1,6 +1,6 @@
{
"name": "concourse-pipeline-yaml",
- "version": "0.1.6",
+ "version": "0.2.0",
"description": "Provides validation and content assist for Concourse CI pipeline and task configuration yml files",
"repository": "https://github.com/spring-projects/atom-concourse",
"icon": "icon.png",
diff --git a/atom-extensions/atom-spring-boot/package.json b/atom-extensions/atom-spring-boot/package.json
index 55c0ae214..517d6e198 100644
--- a/atom-extensions/atom-spring-boot/package.json
+++ b/atom-extensions/atom-spring-boot/package.json
@@ -1,6 +1,6 @@
{
"name": "spring-boot",
- "version": "0.1.6",
+ "version": "0.2.0",
"description": "Spring Boot support for Atom",
"repository": "https://github.com/spring-projects/atom-spring-boot",
"icon": "icon.png",
diff --git a/atom-extensions/atom-spring-boot/properties.json b/atom-extensions/atom-spring-boot/properties.json
index 5f72a3b34..fd23a8bb8 100644
--- a/atom-extensions/atom-spring-boot/properties.json
+++ b/atom-extensions/atom-spring-boot/properties.json
@@ -1,3 +1,3 @@
{
- "jarUrl": "https://s3-us-west-1.amazonaws.com/s3-test.spring.io/sts4/fatjars/snapshots/spring-boot-language-server-0.1.5-201803051440.jar"
+ "jarUrl": "https://s3-us-west-1.amazonaws.com/s3-test.spring.io/sts4/fatjars/snapshots/spring-boot-language-server-0.1.5-201803091709.jar"
}
diff --git a/headless-services/bosh-language-server/pom.xml b/headless-services/bosh-language-server/pom.xml
index 697cc4320..404e35684 100644
--- a/headless-services/bosh-language-server/pom.xml
+++ b/headless-services/bosh-language-server/pom.xml
@@ -8,7 +8,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../commons/pom.xml
diff --git a/headless-services/commons/commons-boot-app-cli/pom.xml b/headless-services/commons/commons-boot-app-cli/pom.xml
index c78d26c67..5657f8531 100644
--- a/headless-services/commons/commons-boot-app-cli/pom.xml
+++ b/headless-services/commons/commons-boot-app-cli/pom.xml
@@ -8,7 +8,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../pom.xml
diff --git a/headless-services/commons/commons-cf/pom.xml b/headless-services/commons/commons-cf/pom.xml
index 6a194b823..df65c859e 100644
--- a/headless-services/commons/commons-cf/pom.xml
+++ b/headless-services/commons/commons-cf/pom.xml
@@ -8,7 +8,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../pom.xml
diff --git a/headless-services/commons/commons-gradle/pom.xml b/headless-services/commons/commons-gradle/pom.xml
index 30be7b8ea..3e01d4820 100644
--- a/headless-services/commons/commons-gradle/pom.xml
+++ b/headless-services/commons/commons-gradle/pom.xml
@@ -9,7 +9,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../pom.xml
diff --git a/headless-services/commons/commons-java/pom.xml b/headless-services/commons/commons-java/pom.xml
index ec2677d4f..4a9bce879 100644
--- a/headless-services/commons/commons-java/pom.xml
+++ b/headless-services/commons/commons-java/pom.xml
@@ -8,7 +8,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../pom.xml
diff --git a/headless-services/commons/commons-language-server/pom.xml b/headless-services/commons/commons-language-server/pom.xml
index 0313e223b..e6d143fc6 100644
--- a/headless-services/commons/commons-language-server/pom.xml
+++ b/headless-services/commons/commons-language-server/pom.xml
@@ -8,7 +8,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../pom.xml
diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/DocumentHighlightHandler.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/DocumentHighlightHandler.java
new file mode 100644
index 000000000..636495d0e
--- /dev/null
+++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/DocumentHighlightHandler.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2018 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.commons.languageserver.util;
+
+import java.util.List;
+
+import org.eclipse.lsp4j.DocumentHighlight;
+import org.eclipse.lsp4j.TextDocumentPositionParams;
+
+@FunctionalInterface
+public interface DocumentHighlightHandler {
+
+ List extends DocumentHighlight> handle(TextDocumentPositionParams position);
+
+}
diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java
index 1463f7e0c..ea4d9f28c 100644
--- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java
+++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java
@@ -18,7 +18,6 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
-import java.util.Map;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
@@ -355,6 +354,9 @@ public class SimpleLanguageServer implements Sts4LanguageServer, LanguageClientA
if (hasDocumentSymbolHandler()) {
c.setDocumentSymbolProvider(true);
}
+ if (hasDocumentHighlightHandler()) {
+ c.setDocumentHighlightProvider(true);
+ }
if (hasCodeLensHandler()) {
CodeLensOptions codeLensOptions = new CodeLensOptions();
codeLensOptions.setResolveProvider(hasCodeLensResolveProvider());
@@ -389,6 +391,10 @@ public class SimpleLanguageServer implements Sts4LanguageServer, LanguageClientA
return getTextDocumentService().hasDocumentSymbolHandler();
}
+ private boolean hasDocumentHighlightHandler() {
+ return getTextDocumentService().hasDocumentHighlightHandler();
+ }
+
private boolean hasCodeLensHandler() {
return getTextDocumentService().hasCodeLensHandler();
}
diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java
index e8e3936c3..f7e96b2ce 100644
--- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java
+++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java
@@ -77,6 +77,7 @@ public class SimpleTextDocumentService implements TextDocumentService {
private DefinitionHandler definitionHandler;
private ReferencesHandler referencesHandler;
private DocumentSymbolHandler documentSymbolHandler;
+ private DocumentHighlightHandler documentHighlightHandler;
private CodeLensHandler codeLensHandler;
private CodeLensResolveHandler codeLensResolveHandler;
@@ -109,6 +110,11 @@ public class SimpleTextDocumentService implements TextDocumentService {
this.documentSymbolHandler = h;
}
+ public synchronized void onDocumentHighlight(DocumentHighlightHandler h) {
+ Assert.isNull("A DocumentHighlightHandler is already set, multiple handlers not supported yet", documentHighlightHandler);
+ this.documentHighlightHandler = h;
+ }
+
public synchronized void onCompletion(CompletionHandler h) {
Assert.isNull("A completion handler is already set, multiple handlers not supported yet", completionHandler);
this.completionHandler = h;
@@ -260,6 +266,7 @@ public class SimpleTextDocumentService implements TextDocumentService {
public final static List extends Location> NO_REFERENCES = ImmutableList.of();
public final static List extends SymbolInformation> NO_SYMBOLS = ImmutableList.of();
public final static List extends CodeLens> NO_CODELENS = ImmutableList.of();
+ public final static List NO_HIGHLIGHTS = ImmutableList.of();
@Override
public CompletableFuture, CompletionList>> completion(TextDocumentPositionParams position) {
@@ -437,7 +444,13 @@ public class SimpleTextDocumentService implements TextDocumentService {
@Override
public CompletableFuture> documentHighlight(TextDocumentPositionParams position) {
- return CompletableFuture.completedFuture(Collections.emptyList());
+ return async.invoke(() -> {
+ DocumentHighlightHandler handler = this.documentHighlightHandler;
+ if (handler != null) {
+ return handler.handle(position);
+ }
+ return NO_HIGHLIGHTS;
+ });
}
public boolean hasDefinitionHandler() {
@@ -452,6 +465,10 @@ public class SimpleTextDocumentService implements TextDocumentService {
return this.documentSymbolHandler!=null;
}
+ public boolean hasDocumentHighlightHandler() {
+ return this.documentHighlightHandler!=null;
+ }
+
public boolean hasCodeLensHandler() {
return this.codeLensHandler != null;
}
diff --git a/headless-services/commons/commons-maven/pom.xml b/headless-services/commons/commons-maven/pom.xml
index 6bee0cd22..3673e4122 100644
--- a/headless-services/commons/commons-maven/pom.xml
+++ b/headless-services/commons/commons-maven/pom.xml
@@ -10,7 +10,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../pom.xml
diff --git a/headless-services/commons/commons-util/pom.xml b/headless-services/commons/commons-util/pom.xml
index 517295f82..2ac8e55cb 100644
--- a/headless-services/commons/commons-util/pom.xml
+++ b/headless-services/commons/commons-util/pom.xml
@@ -7,7 +7,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../pom.xml
diff --git a/headless-services/commons/commons-yaml/pom.xml b/headless-services/commons/commons-yaml/pom.xml
index 70398f55a..686258d3d 100644
--- a/headless-services/commons/commons-yaml/pom.xml
+++ b/headless-services/commons/commons-yaml/pom.xml
@@ -8,7 +8,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../pom.xml
diff --git a/headless-services/commons/java-properties/pom.xml b/headless-services/commons/java-properties/pom.xml
index 49baea0dd..a9b669f9e 100644
--- a/headless-services/commons/java-properties/pom.xml
+++ b/headless-services/commons/java-properties/pom.xml
@@ -7,7 +7,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../pom.xml
diff --git a/headless-services/commons/language-server-test-harness/pom.xml b/headless-services/commons/language-server-test-harness/pom.xml
index 79a02669c..2641e0b80 100644
--- a/headless-services/commons/language-server-test-harness/pom.xml
+++ b/headless-services/commons/language-server-test-harness/pom.xml
@@ -8,7 +8,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../pom.xml
diff --git a/headless-services/commons/pom.xml b/headless-services/commons/pom.xml
index b0c6d8a8d..e24ec1782 100644
--- a/headless-services/commons/pom.xml
+++ b/headless-services/commons/pom.xml
@@ -6,7 +6,7 @@
org.springframework.ide.vscode
commons-parent
pom
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
commons-parent
diff --git a/headless-services/concourse-language-server/pom.xml b/headless-services/concourse-language-server/pom.xml
index 79b8e5f86..ebe4f4c95 100644
--- a/headless-services/concourse-language-server/pom.xml
+++ b/headless-services/concourse-language-server/pom.xml
@@ -8,7 +8,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../commons/pom.xml
diff --git a/headless-services/manifest-yaml-language-server/pom.xml b/headless-services/manifest-yaml-language-server/pom.xml
index b2f11c6cf..b7513017b 100644
--- a/headless-services/manifest-yaml-language-server/pom.xml
+++ b/headless-services/manifest-yaml-language-server/pom.xml
@@ -8,7 +8,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../commons/pom.xml
diff --git a/headless-services/spring-boot-language-server/pom.xml b/headless-services/spring-boot-language-server/pom.xml
index a9cc190b7..99993157b 100644
--- a/headless-services/spring-boot-language-server/pom.xml
+++ b/headless-services/spring-boot-language-server/pom.xml
@@ -8,7 +8,7 @@
org.springframework.ide.vscode
commons-parent
- 0.1.6-SNAPSHOT
+ 0.2.0-SNAPSHOT
../commons/pom.xml
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java
index fc932d065..1d199e5c2 100644
--- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java
@@ -27,12 +27,14 @@ import org.springframework.ide.vscode.boot.java.conditionals.ConditionalsLiveHov
import org.springframework.ide.vscode.boot.java.data.DataRepositorySymbolProvider;
import org.springframework.ide.vscode.boot.java.handlers.BootJavaCodeLensEngine;
import org.springframework.ide.vscode.boot.java.handlers.BootJavaCompletionEngine;
+import org.springframework.ide.vscode.boot.java.handlers.BootJavaDocumentHighlightEngine;
import org.springframework.ide.vscode.boot.java.handlers.BootJavaDocumentSymbolHandler;
import org.springframework.ide.vscode.boot.java.handlers.BootJavaHoverProvider;
import org.springframework.ide.vscode.boot.java.handlers.BootJavaReferencesHandler;
import org.springframework.ide.vscode.boot.java.handlers.BootJavaWorkspaceSymbolHandler;
import org.springframework.ide.vscode.boot.java.handlers.CodeLensProvider;
import org.springframework.ide.vscode.boot.java.handlers.CompletionProvider;
+import org.springframework.ide.vscode.boot.java.handlers.HighlightProvider;
import org.springframework.ide.vscode.boot.java.handlers.HoverProvider;
import org.springframework.ide.vscode.boot.java.handlers.ReferenceProvider;
import org.springframework.ide.vscode.boot.java.handlers.RunningAppProvider;
@@ -44,6 +46,7 @@ import org.springframework.ide.vscode.boot.java.requestmapping.LiveAppURLSymbolP
import org.springframework.ide.vscode.boot.java.requestmapping.RequestMappingHoverProvider;
import org.springframework.ide.vscode.boot.java.requestmapping.RequestMappingSymbolProvider;
import org.springframework.ide.vscode.boot.java.requestmapping.WebfluxHandlerCodeLensProvider;
+import org.springframework.ide.vscode.boot.java.requestmapping.WebfluxRouteHighlightProdivder;
import org.springframework.ide.vscode.boot.java.requestmapping.WebfluxRouterSymbolProvider;
import org.springframework.ide.vscode.boot.java.scope.ScopeCompletionProcessor;
import org.springframework.ide.vscode.boot.java.snippets.JavaSnippet;
@@ -61,6 +64,7 @@ import org.springframework.ide.vscode.commons.languageserver.composable.Language
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver;
import org.springframework.ide.vscode.commons.languageserver.util.CodeLensHandler;
+import org.springframework.ide.vscode.commons.languageserver.util.DocumentHighlightHandler;
import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler;
import org.springframework.ide.vscode.commons.languageserver.util.LSFactory;
import org.springframework.ide.vscode.commons.languageserver.util.ReferencesHandler;
@@ -94,6 +98,7 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent
private JavaProjectFinder projectFinder;
private BootJavaHoverProvider hoverProvider;
private CodeLensHandler codeLensHandler;
+ private DocumentHighlightHandler highlightsEngine;
public BootJavaLanguageServerComponents(SimpleLanguageServer server, LSFactory _params) {
this.server = server;
@@ -151,7 +156,10 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent
codeLensHandler = createCodeLensEngine();
documents.onCodeLens(codeLensHandler);
-
+
+ highlightsEngine = createDocumentHighlightEngine();
+ documents.onDocumentHighlight(highlightsEngine);
+
workspaceService.onDidChangeConfiguraton(settings -> {
config.handleConfigurationChange(settings);
if (config.isBootHintsEnabled()) {
@@ -180,6 +188,10 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent
return codeLensHandler;
}
+ public DocumentHighlightHandler getDocumentHighlightHandler() {
+ return highlightsEngine;
+ }
+
private void initialize(InitializeParams params) {
this.indexer.initialize(server.getWorkspaceRoots());
}
@@ -314,6 +326,13 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent
return new BootJavaCodeLensEngine(this, codeLensProvider);
}
+
+ protected BootJavaDocumentHighlightEngine createDocumentHighlightEngine() {
+ Collection highlightProvider = new ArrayList<>();
+ highlightProvider.add(new WebfluxRouteHighlightProdivder(this));
+
+ return new BootJavaDocumentHighlightEngine(this, highlightProvider);
+ }
public ProjectObserver getProjectObserver() {
return projectObserver;
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaDocumentHighlightEngine.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaDocumentHighlightEngine.java
new file mode 100644
index 000000000..b44e40ff8
--- /dev/null
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaDocumentHighlightEngine.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2018 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.handlers;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.lsp4j.DocumentHighlight;
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextDocumentPositionParams;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerComponents;
+import org.springframework.ide.vscode.commons.languageserver.util.DocumentHighlightHandler;
+import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService;
+import org.springframework.ide.vscode.commons.util.text.TextDocument;
+
+/**
+ * @author Martin Lippert
+ */
+public class BootJavaDocumentHighlightEngine implements DocumentHighlightHandler {
+
+ private static Logger log = LoggerFactory.getLogger(BootJavaDocumentHighlightEngine.class);
+
+ private BootJavaLanguageServerComponents server;
+ private Collection highlightProviders;
+
+ public BootJavaDocumentHighlightEngine(BootJavaLanguageServerComponents server, Collection highlightProviders) {
+ this.server = server;
+ this.highlightProviders = highlightProviders;
+ }
+
+ @Override
+ public List handle(TextDocumentPositionParams params) {
+ SimpleTextDocumentService documents = server.getTextDocumentService();
+ String docURI = params.getTextDocument().getUri();
+
+ if (documents.get(docURI) != null) {
+ TextDocument doc = documents.get(docURI).copy();
+ try {
+ return provideDocumentHighlights(doc, params.getPosition());
+ }
+ catch (Exception e) {
+ log.error("", e);
+ }
+ }
+
+ return SimpleTextDocumentService.NO_HIGHLIGHTS;
+ }
+
+ private List provideDocumentHighlights(TextDocument document, Position position) {
+ List result = new ArrayList<>();
+ for (HighlightProvider highlightProvider : highlightProviders) {
+ highlightProvider.provideHighlights(document, position, result);
+ }
+
+ return result;
+ }
+
+}
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/EnhancedSymbolInformation.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/EnhancedSymbolInformation.java
index 7a20e0f57..b3fa7c101 100644
--- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/EnhancedSymbolInformation.java
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/EnhancedSymbolInformation.java
@@ -18,9 +18,9 @@ import org.eclipse.lsp4j.SymbolInformation;
public class EnhancedSymbolInformation {
private final SymbolInformation symbol;
- private final Object additionalInformation;
+ private final SymbolAddOnInformation[] additionalInformation;
- public EnhancedSymbolInformation(SymbolInformation symbol, Object additionalInformation) {
+ public EnhancedSymbolInformation(SymbolInformation symbol, SymbolAddOnInformation[] additionalInformation) {
this.symbol = symbol;
this.additionalInformation = additionalInformation;
}
@@ -29,7 +29,7 @@ public class EnhancedSymbolInformation {
return symbol;
}
- public Object getAdditionalInformation() {
+ public SymbolAddOnInformation[] getAdditionalInformation() {
return additionalInformation;
}
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/HighlightProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/HighlightProvider.java
new file mode 100644
index 000000000..1e97aa7ce
--- /dev/null
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/HighlightProvider.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2018 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.handlers;
+
+import java.util.List;
+
+import org.eclipse.lsp4j.DocumentHighlight;
+import org.eclipse.lsp4j.Position;
+import org.springframework.ide.vscode.commons.util.text.TextDocument;
+
+/**
+ * @author Martin Lippert
+ */
+public interface HighlightProvider {
+
+ public void provideHighlights(TextDocument document, Position position, List resultAccumulator);
+
+}
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/SymbolAddOnInformation.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/SymbolAddOnInformation.java
new file mode 100644
index 000000000..99be8fd58
--- /dev/null
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/SymbolAddOnInformation.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2018 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.handlers;
+
+/**
+ * @author Martin Lippert
+ */
+public interface SymbolAddOnInformation {
+}
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/links/AtomSourceLinks.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/links/AtomSourceLinks.java
new file mode 100644
index 000000000..81d3c973a
--- /dev/null
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/links/AtomSourceLinks.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2018 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.links;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.file.Path;
+import java.util.Optional;
+
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerComponents;
+import org.springframework.ide.vscode.commons.java.IJavaProject;
+import org.springframework.ide.vscode.commons.util.text.Region;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+
+/**
+ * Source links for Atom client
+ *
+ * @author Alex Boyko
+ *
+ */
+public class AtomSourceLinks extends AbstractSourceLinks {
+
+ private static Supplier LOG = Suppliers.memoize(() -> LoggerFactory.getLogger(AbstractSourceLinks.class));
+
+ public AtomSourceLinks(BootJavaLanguageServerComponents server) {
+ super(server);
+ }
+
+ @Override
+ public Optional sourceLinkForResourcePath(Path path) {
+ try {
+ return Optional.of("atom://core/open/file?filename=" + URLEncoder.encode(path.toString(), "UTF8"));
+ } catch (UnsupportedEncodingException e) {
+ LOG.get().error("Cannot build source URL for " + path, e);
+ }
+ return Optional.empty();
+ }
+
+ @Override
+ protected String positionLink(CompilationUnit cu, String fqName) {
+ if (cu != null) {
+ Region region = findTypeRegion(cu, fqName);
+ if (region != null) {
+ int column = cu.getColumnNumber(region.getOffset());
+ int line = cu.getLineNumber(region.getOffset());
+ StringBuilder sb = new StringBuilder();
+ sb.append("&line=");
+ sb.append(line);
+ sb.append("&column=");
+ sb.append(column + 1); // 1-based columns?
+ return sb.toString();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected Optional jarUrl(IJavaProject project, String fqName, File jarFile) {
+ // JAR URLs are not supported yet
+ return Optional.empty();
+ }
+
+}
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/links/SourceLinkFactory.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/links/SourceLinkFactory.java
index 5f64335bd..8d427bec8 100644
--- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/links/SourceLinkFactory.java
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/links/SourceLinkFactory.java
@@ -55,6 +55,8 @@ public final class SourceLinkFactory {
return new VSCodeSourceLinks(server);
case ECLIPSE:
return new EclipseSourceLinks();
+ case ATOM:
+ return new AtomSourceLinks(server);
default:
return NO_SOURCE_LINKS;
}
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/RouteUtils.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/RouteUtils.java
index 0cc7a4436..6354afbf8 100644
--- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/RouteUtils.java
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/RouteUtils.java
@@ -14,6 +14,7 @@ import org.eclipse.lsp4j.Location;
import org.eclipse.lsp4j.SymbolInformation;
import org.eclipse.lsp4j.SymbolKind;
import org.springframework.ide.vscode.boot.java.handlers.EnhancedSymbolInformation;
+import org.springframework.ide.vscode.boot.java.handlers.SymbolAddOnInformation;
/**
* @author Martin Lippert
@@ -21,7 +22,7 @@ import org.springframework.ide.vscode.boot.java.handlers.EnhancedSymbolInformati
public class RouteUtils {
public static EnhancedSymbolInformation createRouteSymbol(Location location, String path,
- String[] httpMethods, String[] contentTypes, String[] acceptTypes, Object enhancedInformation) {
+ String[] httpMethods, String[] contentTypes, String[] acceptTypes, SymbolAddOnInformation[] enhancedInformation) {
if (path != null && path.length() > 0) {
String label = "@" + (path.startsWith("/") ? path : ("/" + path));
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxAcceptTypeFinder.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxAcceptTypeFinder.java
index c9b5dfa98..85e423ed1 100644
--- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxAcceptTypeFinder.java
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxAcceptTypeFinder.java
@@ -10,41 +10,53 @@
*******************************************************************************/
package org.springframework.ide.vscode.boot.java.requestmapping;
-import java.util.LinkedHashSet;
-import java.util.Set;
+import java.util.ArrayList;
+import java.util.List;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.MethodInvocation;
+import org.eclipse.jdt.core.dom.SimpleName;
+import org.eclipse.lsp4j.Range;
+import org.springframework.ide.vscode.commons.util.BadLocationException;
+import org.springframework.ide.vscode.commons.util.text.TextDocument;
/**
* @author Martin Lippert
*/
public class WebfluxAcceptTypeFinder extends ASTVisitor {
- private Set acceptTypes;
+ private List acceptTypes;
+ private TextDocument doc;
- public WebfluxAcceptTypeFinder() {
- this.acceptTypes = new LinkedHashSet<>();
+ public WebfluxAcceptTypeFinder(TextDocument doc) {
+ this.doc = doc;
+ this.acceptTypes = new ArrayList<>();
}
- public Set getAcceptTypes() {
+ public List getAcceptTypes() {
return acceptTypes;
}
@Override
public boolean visit(MethodInvocation node) {
IMethodBinding methodBinding = node.resolveMethodBinding();
-
- if (WebfluxUtils.REQUEST_PREDICATES_TYPE.equals(methodBinding.getDeclaringClass().getBinaryName())) {
- String name = methodBinding.getName();
- if (name != null && WebfluxUtils.REQUEST_PREDICATE_ACCEPT_TYPE_METHOD.equals(name)) {
- String acceptType = WebfluxUtils.extractSimpleNameArgument(node);
- if (acceptType != null) {
- acceptTypes.add(acceptType);
+
+ try {
+ if (WebfluxUtils.REQUEST_PREDICATES_TYPE.equals(methodBinding.getDeclaringClass().getBinaryName())) {
+ String name = methodBinding.getName();
+ if (name != null && WebfluxUtils.REQUEST_PREDICATE_ACCEPT_TYPE_METHOD.equals(name)) {
+ SimpleName nameArgument = WebfluxUtils.extractSimpleNameArgument(node);
+ if (nameArgument != null && nameArgument.getFullyQualifiedName() != null) {
+ Range range = doc.toRange(nameArgument.getStartPosition(), nameArgument.getLength());
+ acceptTypes.add(new WebfluxRouteElement(nameArgument.getFullyQualifiedName().toString(), range));
+ }
}
}
}
+ catch (BadLocationException e) {
+ // ignore
+ }
return !WebfluxUtils.isRouteMethodInvocation(methodBinding);
}
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxContentTypeFinder.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxContentTypeFinder.java
index 2e8cf56db..b2ab27665 100644
--- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxContentTypeFinder.java
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxContentTypeFinder.java
@@ -10,53 +10,55 @@
*******************************************************************************/
package org.springframework.ide.vscode.boot.java.requestmapping;
-import java.util.LinkedHashSet;
-import java.util.Set;
+import java.util.ArrayList;
+import java.util.List;
-import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.MethodInvocation;
+import org.eclipse.jdt.core.dom.SimpleName;
+import org.eclipse.lsp4j.Range;
+import org.springframework.ide.vscode.commons.util.BadLocationException;
+import org.springframework.ide.vscode.commons.util.text.TextDocument;
/**
* @author Martin Lippert
*/
public class WebfluxContentTypeFinder extends ASTVisitor {
- private Set contentTypes;
- private ASTNode root;
+ private List contentTypes;
+ private TextDocument doc;
- public WebfluxContentTypeFinder(ASTNode root) {
- this.root = root;
- this.contentTypes = new LinkedHashSet<>();
+ public WebfluxContentTypeFinder(TextDocument doc) {
+ this.doc = doc;
+ this.contentTypes = new ArrayList<>();
}
- public Set getContentTypes() {
+ public List getContentTypes() {
return contentTypes;
}
@Override
public boolean visit(MethodInvocation node) {
- boolean visitChildren = true;
+ IMethodBinding methodBinding = node.resolveMethodBinding();
- if (node != this.root) {
- IMethodBinding methodBinding = node.resolveMethodBinding();
-
+ try {
if (WebfluxUtils.REQUEST_PREDICATES_TYPE.equals(methodBinding.getDeclaringClass().getBinaryName())) {
String name = methodBinding.getName();
if (name != null && WebfluxUtils.REQUEST_PREDICATE_CONTENT_TYPE_METHOD.equals(name)) {
- String contentType = WebfluxUtils.extractSimpleNameArgument(node);
- if (contentType != null) {
- contentTypes.add(contentType);
+ SimpleName nameArgument = WebfluxUtils.extractSimpleNameArgument(node);
+ if (nameArgument != null && nameArgument.getFullyQualifiedName() != null) {
+ Range range = doc.toRange(nameArgument.getStartPosition(), nameArgument.getLength());
+ contentTypes.add(new WebfluxRouteElement(nameArgument.getFullyQualifiedName().toString(), range));
}
}
}
-
- if (WebfluxUtils.isRouteMethodInvocation(methodBinding)) {
- visitChildren = false;
- }
}
- return visitChildren;
+ catch (BadLocationException e) {
+ // ignore
+ }
+
+ return !WebfluxUtils.isRouteMethodInvocation(methodBinding);
}
}
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxElementsInformation.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxElementsInformation.java
new file mode 100644
index 000000000..7b4556e2d
--- /dev/null
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxElementsInformation.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2018 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.requestmapping;
+
+import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.Range;
+import org.springframework.ide.vscode.boot.java.handlers.SymbolAddOnInformation;
+
+/**
+ * @author Martin Lippert
+ */
+public class WebfluxElementsInformation implements SymbolAddOnInformation {
+
+ private Range[] ranges;
+
+ public WebfluxElementsInformation(Range... ranges) {
+ this.ranges = ranges;
+ }
+
+ public Range[] getRanges() {
+ return ranges;
+ }
+
+ public boolean contains(Position position) {
+ for (Range range : ranges) {
+ if (isEqualOrBefore(range.getStart(), position) && isEqualsOrBehind(range.getEnd(), position)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * returns true if position1 is the same or before position2 in a document
+ */
+ protected boolean isEqualOrBefore(Position position1, Position position2) {
+ if (position1.getLine() < position2.getLine()) return true;
+ if (position1.getLine() == position2.getLine() && position1.getCharacter() <= position2.getCharacter()) return true;
+ return false;
+ }
+
+ /**
+ * returns true if position1 is the same or behind position2 in a document
+ */
+ protected boolean isEqualsOrBehind(Position position1, Position position2) {
+ if (position1.getLine() > position2.getLine()) return true;
+ if (position1.getLine() == position2.getLine() && position1.getCharacter() >= position2.getCharacter()) return true;
+ return false;
+ }
+
+}
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java
index fc14555d9..6fabd7b5b 100644
--- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java
@@ -20,6 +20,7 @@ import org.eclipse.lsp4j.CodeLens;
import org.eclipse.lsp4j.Command;
import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerComponents;
import org.springframework.ide.vscode.boot.java.handlers.CodeLensProvider;
+import org.springframework.ide.vscode.boot.java.handlers.SymbolAddOnInformation;
import org.springframework.ide.vscode.boot.java.utils.SpringIndexer;
import org.springframework.ide.vscode.commons.util.BadLocationException;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
@@ -55,7 +56,7 @@ public class WebfluxHandlerCodeLensProvider implements CodeLensProvider {
final String handlerClass = methodBinding.getDeclaringClass().getBinaryName().trim();
final String handlerMethod = methodBinding.getMethodDeclaration().toString().trim();
- List