Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMickael Istria2017-02-06 16:53:51 +0000
committerMickael Istria2017-02-07 13:30:29 +0000
commitd09ebd6144c37e1c1bbee03b47ee0d18ed1157b0 (patch)
tree42d0933dec6403a24d5855bce1da7712cc57be22
parent44817f4e990a75b8fc79b715814d9b352012ba06 (diff)
downloadlsp4e-d09ebd6144c37e1c1bbee03b47ee0d18ed1157b0.tar.gz
lsp4e-d09ebd6144c37e1c1bbee03b47ee0d18ed1157b0.tar.xz
lsp4e-d09ebd6144c37e1c1bbee03b47ee0d18ed1157b0.zip
Bug 510898 - (Dirty) support for code actions
Change-Id: Icd27d8e78f04305e1a9131d8902a5bb0ba2874b4 Signed-off-by: Mickael Istria <mistria@redhat.com>
-rw-r--r--org.eclipse.lsp4e.languages/src/org/eclipse/lsp4e/languages/CSSLanguageServer.java8
-rw-r--r--org.eclipse.lsp4e.languages/src/org/eclipse/lsp4e/languages/HTMLLanguageServer.java3
-rw-r--r--org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/hover/HoverTest.java6
-rw-r--r--org.eclipse.lsp4e.tests.mock/src/org/eclipse/lsp4e/tests/mock/MockTextDocumentService.java6
-rw-r--r--org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java13
-rw-r--r--org.eclipse.lsp4e/src/org/eclipse/lsp4e/ProjectSpecificLanguageServerWrapper.java25
-rw-r--r--org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/CodeActionMarkerResolution.java82
-rw-r--r--org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/LSPCodeActionMarkerResolution.java12
-rw-r--r--org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/declaration/OpenDeclarationHyperlinkDetector.java17
-rw-r--r--org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/hover/LSBasedHover.java8
-rw-r--r--org.eclipse.lsp4e/src/org/eclipse/lsp4e/server/StreamConnectionProvider.java7
11 files changed, 140 insertions, 47 deletions
diff --git a/org.eclipse.lsp4e.languages/src/org/eclipse/lsp4e/languages/CSSLanguageServer.java b/org.eclipse.lsp4e.languages/src/org/eclipse/lsp4e/languages/CSSLanguageServer.java
index 4ba9df17..df4a49c0 100644
--- a/org.eclipse.lsp4e.languages/src/org/eclipse/lsp4e/languages/CSSLanguageServer.java
+++ b/org.eclipse.lsp4e.languages/src/org/eclipse/lsp4e/languages/CSSLanguageServer.java
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.lsp4e.languages;
+import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -41,7 +42,7 @@ public class CSSLanguageServer extends ProcessStreamConnectionProvider {
}
@Override
- public Object getInitializationOptions(String rootPath) {
+ public Object getInitializationOptions(URI rootUri) {
Map<String, Object> settings = new HashMap<>();
settings.put("css", Collections.singletonMap("validate", true));
settings.put("scss", Collections.singletonMap("validate", true));
@@ -49,12 +50,13 @@ public class CSSLanguageServer extends ProcessStreamConnectionProvider {
return settings;
}
- public void handleMessage(Message message, LanguageServer languageServer, String rootPath) {
+ @Override
+ public void handleMessage(Message message, LanguageServer languageServer, URI rootUri) {
if (message instanceof ResponseMessage) {
ResponseMessage responseMessage = (ResponseMessage)message;
if (responseMessage.getResult() instanceof InitializeResult) {
// enable validation: so far, no better way found than changing conf after init.
- DidChangeConfigurationParams params = new DidChangeConfigurationParams(getInitializationOptions(rootPath));
+ DidChangeConfigurationParams params = new DidChangeConfigurationParams(getInitializationOptions(rootUri));
languageServer.getWorkspaceService().didChangeConfiguration(params);
}
}
diff --git a/org.eclipse.lsp4e.languages/src/org/eclipse/lsp4e/languages/HTMLLanguageServer.java b/org.eclipse.lsp4e.languages/src/org/eclipse/lsp4e/languages/HTMLLanguageServer.java
index 3d20a5b0..18043439 100644
--- a/org.eclipse.lsp4e.languages/src/org/eclipse/lsp4e/languages/HTMLLanguageServer.java
+++ b/org.eclipse.lsp4e.languages/src/org/eclipse/lsp4e/languages/HTMLLanguageServer.java
@@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.lsp4e.languages;
+import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -30,7 +31,7 @@ public class HTMLLanguageServer extends ProcessStreamConnectionProvider {
}
@Override
- public Object getInitializationOptions(String rootPath) {
+ public Object getInitializationOptions(URI rootUri) {
Map<String, Object> map = new HashMap<>();
map.put("css", true);
map.put("javascript", true);
diff --git a/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/hover/HoverTest.java b/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/hover/HoverTest.java
index 9d3a9aa3..6e649c0c 100644
--- a/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/hover/HoverTest.java
+++ b/org.eclipse.lsp4e.test/src/org/eclipse/lsp4e/test/hover/HoverTest.java
@@ -51,7 +51,7 @@ public class HoverTest {
@Test
public void testHoverRegion() throws CoreException, InvocationTargetException {
- Hover hoverResponse = new Hover(Either.forLeft(Either.forLeft("HoverContent")), new Range(new Position(0, 0), new Position(0, 10)));
+ Hover hoverResponse = new Hover(Collections.singletonList(Either.forLeft("HoverContent")), new Range(new Position(0, 0), new Position(0, 10)));
MockLanguageSever.INSTANCE.setHover(hoverResponse);
IFile file = TestUtils.createUniqueTestFile(project, "HoverRange Other Text");
@@ -72,7 +72,7 @@ public class HoverTest {
@Test
public void testHoverInfo() throws CoreException, InvocationTargetException {
- Hover hoverResponse = new Hover(Either.forLeft(Either.forLeft("HoverContent")), new Range(new Position(0, 0), new Position(0, 10)));
+ Hover hoverResponse = new Hover(Collections.singletonList(Either.forLeft("HoverContent")), new Range(new Position(0, 0), new Position(0, 10)));
MockLanguageSever.INSTANCE.setHover(hoverResponse);
IFile file = TestUtils.createUniqueTestFile(project, "HoverRange Other Text");
@@ -84,7 +84,7 @@ public class HoverTest {
@Test
public void testHoverInfoEmptyContentList() throws CoreException, InvocationTargetException {
- Hover hoverResponse = new Hover(Either.forRight(Collections.emptyList()), new Range(new Position(0, 0), new Position(0, 10)));
+ Hover hoverResponse = new Hover(Collections.emptyList(), new Range(new Position(0, 0), new Position(0, 10)));
MockLanguageSever.INSTANCE.setHover(hoverResponse);
IFile file = TestUtils.createUniqueTestFile(project, "HoverRange Other Text");
diff --git a/org.eclipse.lsp4e.tests.mock/src/org/eclipse/lsp4e/tests/mock/MockTextDocumentService.java b/org.eclipse.lsp4e.tests.mock/src/org/eclipse/lsp4e/tests/mock/MockTextDocumentService.java
index 0e3b2bf7..557777ec 100644
--- a/org.eclipse.lsp4e.tests.mock/src/org/eclipse/lsp4e/tests/mock/MockTextDocumentService.java
+++ b/org.eclipse.lsp4e.tests.mock/src/org/eclipse/lsp4e/tests/mock/MockTextDocumentService.java
@@ -62,7 +62,7 @@ public class MockTextDocumentService implements TextDocumentService {
CompletionItem item = new CompletionItem();
item.setLabel("Mock completion item");
mockCompletionList = new CompletionList(false, Collections.singletonList(item));
- mockHover = new Hover(Either.forLeft(Either.forLeft("Mock hover")), null);
+ mockHover = new Hover(Collections.singletonList(Either.forLeft("Mock hover")), null);
}
private <U> CompletableFuture<U> futureFactory(U value) {
@@ -92,8 +92,8 @@ public class MockTextDocumentService implements TextDocumentService {
}
@Override
- public CompletableFuture<Either<Location, List<? extends Location>>> definition(TextDocumentPositionParams position) {
- return CompletableFuture.completedFuture(Either.forRight(mockDefinitionLocations));
+ public CompletableFuture<List<? extends Location>> definition(TextDocumentPositionParams position) {
+ return CompletableFuture.completedFuture(mockDefinitionLocations);
}
@Override
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java
index b1ff9e61..968a655e 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LSPEclipseUtils.java
@@ -39,6 +39,7 @@ import org.eclipse.lsp4j.Position;
import org.eclipse.lsp4j.TextDocumentIdentifier;
import org.eclipse.lsp4j.TextDocumentPositionParams;
import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.WorkspaceEdit;
import org.eclipse.text.edits.MalformedTreeException;
import org.eclipse.text.edits.MultiTextEdit;
import org.eclipse.text.edits.ReplaceEdit;
@@ -108,7 +109,7 @@ public class LSPEclipseUtils {
return project.findMember(projectRelativePath);
}
}
-
+
public static void applyEdit(TextEdit textEdit, IDocument document) throws BadLocationException {
document.replace(
LSPEclipseUtils.toOffset(textEdit.getRange().getStart(), document),
@@ -119,7 +120,7 @@ public class LSPEclipseUtils {
/**
* Method will apply all edits to document as single modification. Needs to
* be executed in UI thread.
- *
+ *
* @param document
* document to modify
* @param edits
@@ -230,4 +231,12 @@ public class LSPEclipseUtils {
}
}
+ public static void applyWorkspaceEdit(WorkspaceEdit wsEdit) {
+ for (java.util.Map.Entry<String, List<TextEdit>> edit : wsEdit.getChanges().entrySet()) {
+ String uri = edit.getKey();
+ IDocument document = LSPEclipseUtils.getDocument(LSPEclipseUtils.findResourceFor(uri));
+ LSPEclipseUtils.applyEdits(document, edit.getValue());
+ }
+ }
+
}
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/ProjectSpecificLanguageServerWrapper.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/ProjectSpecificLanguageServerWrapper.java
index 800f6ad6..0f7036da 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/ProjectSpecificLanguageServerWrapper.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/ProjectSpecificLanguageServerWrapper.java
@@ -11,6 +11,7 @@
package org.eclipse.lsp4e;
import java.io.IOException;
+import java.net.URI;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -42,7 +43,10 @@ import org.eclipse.jface.text.IDocument;
import org.eclipse.lsp4e.operations.diagnostics.LSPDiagnosticsToMarkers;
import org.eclipse.lsp4e.server.StreamConnectionProvider;
import org.eclipse.lsp4e.ui.Messages;
+import org.eclipse.lsp4j.ApplyWorkspaceEditParams;
+import org.eclipse.lsp4j.ApplyWorkspaceEditResponse;
import org.eclipse.lsp4j.ClientCapabilities;
+import org.eclipse.lsp4j.ExecuteCommandCapabilites;
import org.eclipse.lsp4j.InitializeParams;
import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.MessageActionItem;
@@ -50,8 +54,10 @@ import org.eclipse.lsp4j.MessageParams;
import org.eclipse.lsp4j.PublishDiagnosticsParams;
import org.eclipse.lsp4j.ServerCapabilities;
import org.eclipse.lsp4j.ShowMessageRequestParams;
+import org.eclipse.lsp4j.SymbolCapabilites;
import org.eclipse.lsp4j.TextDocumentSyncKind;
import org.eclipse.lsp4j.TextDocumentSyncOptions;
+import org.eclipse.lsp4j.WorkspaceClientCapabilites;
import org.eclipse.lsp4j.jsonrpc.Launcher;
import org.eclipse.lsp4j.jsonrpc.ResponseErrorException;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
@@ -166,16 +172,24 @@ public class ProjectSpecificLanguageServerWrapper {
public void logMessage(MessageParams message) {
ServerMessageHandler.logMessage(project, label, message);
}
+
+ @Override
+ public CompletableFuture<ApplyWorkspaceEditResponse> applyEdit(ApplyWorkspaceEditParams params) {
+ return CompletableFuture.supplyAsync(() -> {
+ LSPEclipseUtils.applyWorkspaceEdit(params.getEdit());
+ return new ApplyWorkspaceEditResponse(true);
+ });
+ }
};
ExecutorService executorService = Executors.newCachedThreadPool();
final InitializeParams initParams = new InitializeParams();
- initParams.setRootPath(project.getLocation().toFile().getAbsolutePath());
+ initParams.setRootUri(project.getLocation().toFile().toURI().toString());
Launcher<LanguageServer> launcher = LSPLauncher.createClientLauncher(client,
this.lspStreamProvider.getInputStream(), this.lspStreamProvider.getOutputStream(), executorService,
consumer -> (message -> {
consumer.consume(message);
logMessage(message);
- this.lspStreamProvider.handleMessage(message, this.languageServer, initParams.getRootPath());
+ this.lspStreamProvider.handleMessage(message, this.languageServer, URI.create(initParams.getRootUri()));
}));
this.languageServer = launcher.getRemoteProxy();
this.launcherFuture = launcher.startListening();
@@ -184,10 +198,15 @@ public class ProjectSpecificLanguageServerWrapper {
if (Platform.getProduct() != null) {
name = Platform.getProduct().getName();
}
+ WorkspaceClientCapabilites workspaceClientCapabilites = new WorkspaceClientCapabilites();
+ workspaceClientCapabilites.setApplyEdit(Boolean.TRUE);
+ workspaceClientCapabilites.setExecuteCommand(new ExecuteCommandCapabilites());
+ workspaceClientCapabilites.setSymbol(new SymbolCapabilites());
+ initParams.setCapabilities(new ClientCapabilities(workspaceClientCapabilites, null, null));
initParams.setClientName(name);
initParams.setCapabilities(new ClientCapabilities());
initParams.setInitializationOptions(
- this.lspStreamProvider.getInitializationOptions(initParams.getRootPath()));
+ this.lspStreamProvider.getInitializationOptions(URI.create(initParams.getRootUri())));
initializeFuture = languageServer.initialize(initParams).thenApply(res -> {
initializeResult = res;
return res;
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/CodeActionMarkerResolution.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/CodeActionMarkerResolution.java
index 9ca6d091..b8b7421e 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/CodeActionMarkerResolution.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/CodeActionMarkerResolution.java
@@ -10,19 +10,31 @@
*******************************************************************************/
package org.eclipse.lsp4e.operations.codeactions;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
import org.eclipse.core.resources.IMarker;
-import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.lsp4e.LSPEclipseUtils;
+import org.eclipse.lsp4e.LanguageServerPlugin;
import org.eclipse.lsp4j.Command;
+import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.WorkspaceEdit;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.views.markers.WorkbenchMarkerResolution;
+import com.google.gson.Gson;
+
public class CodeActionMarkerResolution extends WorkbenchMarkerResolution implements IMarkerResolution {
- private Command command;
+ private @NonNull Command command;
- public CodeActionMarkerResolution(Command command) {
+ public CodeActionMarkerResolution(@NonNull Command command) {
this.command = command;
}
@@ -33,17 +45,73 @@ public class CodeActionMarkerResolution extends WorkbenchMarkerResolution implem
@Override
public void run(IMarker marker) {
- MessageDialog.openWarning(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Not yet supported", "LSP Commands are not yet supported"); //$NON-NLS-1$//$NON-NLS-2$
+ try {
+ // This is a *client-side* command, no need to go through workspace/executeCommand operation
+ // TODO? Consider binding LS commands to Eclipse commands and handlers???
+ if (command.getArguments() != null) {
+ WorkspaceEdit edit = createWorkspaceEdit(command.getArguments(), marker.getResource());
+ LSPEclipseUtils.applyWorkspaceEdit(edit);
+ }
+ } catch (Exception e) {
+ LanguageServerPlugin.logError(e);
+ }
+ }
+
+ private static final class Pair<K, V> {
+ K key;
+ V value;
+ Pair(K key,V value) {
+ this.key = key;
+ this.value = value;
+ }
+ }
+
+ /**
+ * Very empirical and unsafe heuristic to turn unknown command arguments
+ * into a workspace edit...
+ */
+ private WorkspaceEdit createWorkspaceEdit(List<Object> arguments, IResource initialResource) {
+ WorkspaceEdit res = new WorkspaceEdit();
+ Map<String, List<TextEdit>> changes = new HashMap<>();
+ res.setChanges(changes);
+ Pair<IResource, List<TextEdit>> currentEntry = new Pair<>(initialResource, new ArrayList<>());
+ arguments.stream().flatMap(item -> {
+ if (item instanceof List) {
+ return ((List<?>)item).stream();
+ } else {
+ return Collections.singleton(item).stream();
+ }
+ }).forEach(arg -> {
+ if (arg instanceof String) {
+ changes.put(currentEntry.key.getLocationURI().toString(), currentEntry.value);
+ IResource resource = LSPEclipseUtils.findResourceFor((String)arg);
+ if (resource != null) {
+ currentEntry.key = resource;
+ currentEntry.value = new ArrayList<>();
+ }
+ } else if (arg instanceof WorkspaceEdit) {
+ changes.putAll(((WorkspaceEdit)arg).getChanges());
+ } else if (arg instanceof TextEdit) {
+ currentEntry.value.add((TextEdit)arg);
+ } else if (arg instanceof Map) {
+ Gson gson = new Gson(); // TODO? retrieve the GSon used by LS
+ TextEdit edit = gson.fromJson(gson.toJson(arg), TextEdit.class);
+ if (edit != null) {
+ currentEntry.value.add(edit);
+ }
+ }
+ });
+ changes.put(currentEntry.key.getLocationURI().toString(), currentEntry.value);
+ return res;
}
@Override
public String getDescription() {
- return null;
+ return command.getTitle();
}
@Override
public Image getImage() {
- // TODO Auto-generated method stub
return null;
}
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/LSPCodeActionMarkerResolution.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/LSPCodeActionMarkerResolution.java
index 8334d5e7..a647d95b 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/LSPCodeActionMarkerResolution.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/LSPCodeActionMarkerResolution.java
@@ -15,6 +15,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
@@ -40,6 +41,7 @@ import org.eclipse.ui.internal.progress.ProgressInfoItem;
public class LSPCodeActionMarkerResolution implements IMarkerResolutionGenerator2 {
private static final String LSP_REMEDIATION = "lspCodeActions"; //$NON-NLS-1$
+ private static final String LS = "languageServer"; //$NON-NLS-1$
private static final IMarkerResolution2 COMPUTING = new IMarkerResolution2() {
@@ -47,6 +49,7 @@ public class LSPCodeActionMarkerResolution implements IMarkerResolutionGenerator
public void run(IMarker marker) {
// TODO Auto-generated method stub
// join on Future?
+
}
@Override
@@ -71,9 +74,11 @@ public class LSPCodeActionMarkerResolution implements IMarkerResolutionGenerator
@Override
public IMarkerResolution[] getResolutions(IMarker marker) {
Object att;
+ LanguageServer languageServer = null;
try {
checkMarkerResoultion(marker);
att = marker.getAttribute(LSP_REMEDIATION);
+ languageServer = (LanguageServer) marker.getAttribute(LS);
} catch (Exception e) {
LanguageServerPlugin.logError(e);
return new IMarkerResolution[0];
@@ -84,7 +89,9 @@ public class LSPCodeActionMarkerResolution implements IMarkerResolutionGenerator
List<? extends Command> commands = (List<? extends Command>)att;
List<IMarkerResolution> res = new ArrayList<>(commands.size());
for (Command command : commands) {
- res.add(new CodeActionMarkerResolution(command));
+ if (command != null) {
+ res.add(new CodeActionMarkerResolution(command));
+ }
}
return res.toArray(new IMarkerResolution[res.size()]);
}
@@ -96,6 +103,7 @@ public class LSPCodeActionMarkerResolution implements IMarkerResolutionGenerator
LanguageServer lsp = LanguageServiceAccessor.getLanguageServer((IFile)marker.getResource(), (capabilities) -> Boolean.TRUE.equals(capabilities.getCodeActionProvider()));
if (lsp != null) {
marker.setAttribute(LSP_REMEDIATION, COMPUTING);
+ marker.setAttribute(LS, lsp);
Diagnostic diagnostic = (Diagnostic)marker.getAttribute(LSPDiagnosticsToMarkers.LSP_DIAGNOSTIC);
CodeActionContext context = new CodeActionContext(Collections.singletonList(diagnostic));
CodeActionParams params = new CodeActionParams();
@@ -110,6 +118,8 @@ public class LSPCodeActionMarkerResolution implements IMarkerResolutionGenerator
LanguageServerPlugin.logError(e);
}
});
+ // wait a bit to avoid showing too much "Computing" without looking like a freeze
+ codeAction.get(300, TimeUnit.MILLISECONDS);
}
}
}
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/declaration/OpenDeclarationHyperlinkDetector.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/declaration/OpenDeclarationHyperlinkDetector.java
index 563b4687..19ca4734 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/declaration/OpenDeclarationHyperlinkDetector.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/declaration/OpenDeclarationHyperlinkDetector.java
@@ -12,7 +12,6 @@
package org.eclipse.lsp4e.operations.declaration;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
@@ -32,7 +31,6 @@ import org.eclipse.lsp4e.LanguageServiceAccessor;
import org.eclipse.lsp4e.LanguageServiceAccessor.LSPDocumentInfo;
import org.eclipse.lsp4e.ui.Messages;
import org.eclipse.lsp4j.Location;
-import org.eclipse.lsp4j.jsonrpc.messages.Either;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
@@ -76,19 +74,10 @@ public class OpenDeclarationHyperlinkDetector extends AbstractHyperlinkDetector
final LSPDocumentInfo info = LanguageServiceAccessor.getLSPDocumentInfoFor(textViewer, (capabilities) -> Boolean.TRUE.equals(capabilities.getDefinitionProvider()));
if (info != null) {
try {
- CompletableFuture<Either<Location, List<? extends Location>>> documentHighlight = info.getLanguageClient().getTextDocumentService()
+ CompletableFuture<List<? extends Location>> documentHighlight = info.getLanguageClient().getTextDocumentService()
.definition(LSPEclipseUtils.toTextDocumentPosistionParams(info.getFileUri(), region.getOffset(), info.getDocument()));
- Either<Location, List<? extends Location>> response = documentHighlight.get(2, TimeUnit.SECONDS);
- if (response == null) {
- return null;
- }
- List<? extends Location> locations = Collections.emptyList();
- if (response.isLeft()) {
- locations = Collections.singletonList(response.getLeft());
- } else if (response.isRight()) {
- locations = response.getRight();
- }
- if (locations.isEmpty()) {
+ List<? extends Location> locations = documentHighlight.get(2, TimeUnit.SECONDS);
+ if (locations == null || locations.isEmpty()) {
return null;
}
IRegion linkRegion = findWord(textViewer.getDocument(), region.getOffset());
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/hover/LSBasedHover.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/hover/LSBasedHover.java
index d57be3ec..5d4e2049 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/hover/LSBasedHover.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/hover/LSBasedHover.java
@@ -10,7 +10,6 @@
*******************************************************************************/
package org.eclipse.lsp4e.operations.hover;
-import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
@@ -96,12 +95,7 @@ public class LSBasedHover implements ITextHover, ITextHoverExtension {
if (hoverResult == null) {
return null;
}
- List<Either<String, MarkedString>> contents = null;
- if (hoverResult.getContents().isLeft()) {
- contents = Collections.singletonList(hoverResult.getContents().getLeft());
- } else if (hoverResult.getContents().isRight()) {
- contents = hoverResult.getContents().getRight();
- }
+ List<Either<String, MarkedString>> contents = hoverResult.getContents();
if (contents == null || contents.isEmpty()) {
return null;
}
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/server/StreamConnectionProvider.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/server/StreamConnectionProvider.java
index 8b70b4a7..7390db10 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/server/StreamConnectionProvider.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/server/StreamConnectionProvider.java
@@ -13,6 +13,7 @@ package org.eclipse.lsp4e.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.net.URI;
import org.eclipse.lsp4j.jsonrpc.messages.Message;
import org.eclipse.lsp4j.services.LanguageServer;
@@ -43,7 +44,7 @@ public interface StreamConnectionProvider {
/**
* User provided initialization options.
*/
- public default Object getInitializationOptions(String rootPath){
+ public default Object getInitializationOptions(URI rootUri){
return null;
}
@@ -53,8 +54,8 @@ public interface StreamConnectionProvider {
* Allows to hook custom behavior on messages.
* @param message a message
* @param languageServer the language server receiving/sending the message.
- * @param rootPath
+ * @param rootUri
*/
- public default void handleMessage(Message message, LanguageServer languageServer, String rootPath) {}
+ public default void handleMessage(Message message, LanguageServer languageServer, URI rootURI) {}
}

Back to the top