diff options
author | Mickael Istria | 2017-02-06 16:53:51 +0000 |
---|---|---|
committer | Mickael Istria | 2017-02-07 13:30:29 +0000 |
commit | d09ebd6144c37e1c1bbee03b47ee0d18ed1157b0 (patch) | |
tree | 42d0933dec6403a24d5855bce1da7712cc57be22 | |
parent | 44817f4e990a75b8fc79b715814d9b352012ba06 (diff) | |
download | lsp4e-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>
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) {} } |