Skip to content

Commit b023ab9

Browse files
chore: update plugin to compile against upstream LSP4e [HEAD-349] (#142)
* chore: don't stop language server (set timeout real high) * fix: update plugin to compile against upstream LSP4e API * docs: update Changelog
1 parent edabcad commit b023ab9

6 files changed

Lines changed: 39 additions & 83 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
# Snyk Changelog
22

3-
## [2.0.0] - Unreleased
3+
## [2.1.0] - UNRELEASED
44
### Changes
5-
- Increase LS version
5+
- update plugin to cater to LSP4e API changes
6+
- cleanup redundant code
7+
- don't shutdown language server after some time of inactivity
68

7-
## [2.1.0] - UNRELEASED
9+
## [2.1.0] - v20230307.102901
810
### Changes
911
- unpin LSP4e dependency - this requires running Eclipse on JDK 17+
1012

plugin/plugin.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@
165165
id="io.snyk.languageserver"
166166
label="Snyk Language Server"
167167
clientImpl="io.snyk.languageserver.protocolextension.SnykExtendedLanguageClient"
168-
lastDocumentDisconnectedTimeout="3600"
168+
lastDocumentDisconnectedTimeout="3000000"
169169
singleton="true"
170170
makerType="io.snyk.languageserver.marker">
171171
</server>

plugin/src/main/java/io/snyk/eclipse/plugin/SnykStartup.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import org.eclipse.core.runtime.Status;
1818
import org.eclipse.core.runtime.jobs.Job;
1919
import org.eclipse.jface.wizard.WizardDialog;
20+
import org.eclipse.lsp4e.LanguageServersRegistry;
21+
import org.eclipse.lsp4e.LanguageServiceAccessor;
2022
import org.eclipse.ui.IStartup;
2123
import org.eclipse.ui.IWorkbench;
2224
import org.eclipse.ui.IWorkbenchWindow;
@@ -60,24 +62,35 @@ protected IStatus run(IProgressMonitor monitor) {
6062
monitor.subTask("Starting download of Snyk Language Server");
6163
download(monitor);
6264
}
63-
64-
monitor.subTask("Starting Snyk Language Server...");
65-
SnykLanguageServer.InitializeServer();
6665
} catch (Exception exception) {
6766
logError(exception);
6867
}
6968
downloading = false;
70-
69+
70+
monitor.subTask("Starting Snyk Language Server...");
71+
startLanguageServer();
72+
7173
if (Preferences.getInstance().getAuthToken().isBlank()) {
74+
monitor.subTask("Starting Snyk Wizard to configure initial settings...");
7275
SnykWizard wizard = new SnykWizard();
7376
WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell(), wizard);
7477
dialog.setBlockOnOpen(true);
7578
dialog.open();
7679
}
80+
7781
});
78-
82+
7983
return Status.OK_STATUS;
8084
}
85+
86+
private void startLanguageServer() {
87+
var definition = LanguageServersRegistry.getInstance().getDefinition(SnykLanguageServer.LANGUAGE_SERVER_ID);
88+
try {
89+
LanguageServiceAccessor.startLanguageServer(definition);
90+
} catch (IOException e) {
91+
logError(e);
92+
}
93+
}
8194
};
8295
initJob.setPriority(Job.LONG);
8396
initJob.schedule();

plugin/src/main/java/io/snyk/languageserver/LsConfigurationUpdater.java

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.snyk.eclipse.plugin.Activator;
44
import io.snyk.eclipse.plugin.properties.preferences.Preferences;
55
import io.snyk.eclipse.plugin.utils.SnykLogger;
6+
import io.snyk.languageserver.protocolextension.SnykExtendedLanguageClient;
67

78
import java.io.File;
89
import java.util.Collections;
@@ -23,27 +24,10 @@ public void configurationChanged() {
2324
var params = new DidChangeConfigurationParams();
2425
params.setSettings(getCurrentSettings());
2526

26-
var definition = LanguageServersRegistry.getInstance().getDefinition(SnykLanguageServer.LANGUAGE_SERVER_ID);
27-
28-
if (definition == null) {
29-
return;
30-
}
31-
for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
32-
if (project.isAccessible()) {
33-
try {
34-
var servers = Collections
35-
.unmodifiableCollection(LanguageServiceAccessor.getLanguageServers(project, null));
36-
for (LanguageServer ls : servers) {
37-
var currentDefinition = LanguageServiceAccessor.resolveServerDefinition(ls);
38-
if (currentDefinition.isEmpty() || !currentDefinition.get().id.equals(definition.id))
39-
continue;
40-
WorkspaceService workspaceService = ls.getWorkspaceService();
41-
workspaceService.didChangeConfiguration(params);
42-
}
43-
} catch (Exception e) {
44-
SnykLogger.logError(e);
45-
}
46-
}
27+
SnykExtendedLanguageClient lc = SnykExtendedLanguageClient.getInstance();
28+
if (lc != null) {
29+
var languageServer = lc.getConnectedLanguageServer();
30+
languageServer.getWorkspaceService().didChangeConfiguration(params);
4731
}
4832
}
4933

plugin/src/main/java/io/snyk/languageserver/SnykLanguageServer.java

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.snyk.eclipse.plugin.utils.Lists;
2323
import io.snyk.eclipse.plugin.utils.SnykLogger;
2424

25+
@SuppressWarnings("restriction")
2526
public class SnykLanguageServer extends ProcessStreamConnectionProvider implements StreamConnectionProvider {
2627
public static final String LANGUAGE_SERVER_ID = "io.snyk.languageserver";
2728
private final LsRuntimeEnvironment runtimeEnvironment;
@@ -46,18 +47,6 @@ public void start() throws IOException {
4647
setCommands(commands);
4748
setWorkingDirectory(workingDir);
4849
super.start();
49-
new Job("Snyk: Sending preferences to Language Server") {
50-
@Override
51-
protected IStatus run(IProgressMonitor monitor) {
52-
try {
53-
new LsConfigurationUpdater().configurationChanged();
54-
monitor.done();
55-
} catch (RuntimeException e) {
56-
SnykLogger.logError(e);
57-
}
58-
return Status.OK_STATUS;
59-
}
60-
}.schedule();
6150
}
6251

6352
@Override
@@ -77,19 +66,4 @@ public Object getInitializationOptions(URI rootUri) {
7766
}
7867
return currentSettings;
7968
}
80-
81-
public static void InitializeServer() {
82-
var projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
83-
for (IProject project : projects) {
84-
if (project.isAccessible()) {
85-
try {
86-
LanguageServiceAccessor.getLSWrapper(project,
87-
LanguageServersRegistry.getInstance().getDefinition(SnykLanguageServer.LANGUAGE_SERVER_ID));
88-
} catch (IOException e) {
89-
SnykLogger.logError(e);
90-
return;
91-
}
92-
}
93-
}
94-
}
9569
}

plugin/src/main/java/io/snyk/languageserver/protocolextension/SnykExtendedLanguageClient.java

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.snyk.languageserver.protocolextension;
22

33
import java.io.File;
4-
import java.time.LocalDateTime;
54
import java.util.ArrayList;
65
import java.util.Arrays;
76
import java.util.HashSet;
@@ -11,23 +10,18 @@
1110
import java.util.stream.Collectors;
1211

1312
import org.eclipse.core.resources.IProject;
14-
import org.eclipse.core.runtime.Platform;
1513
import org.eclipse.jdt.internal.core.JavaProject;
1614
import org.eclipse.jface.viewers.IStructuredSelection;
1715
import org.eclipse.jface.wizard.WizardDialog;
18-
import org.eclipse.lsp4e.LSPEclipseUtils;
1916
import org.eclipse.lsp4e.LanguageClientImpl;
20-
import org.eclipse.lsp4e.ServerMessageHandler;
2117
import org.eclipse.lsp4j.ExecuteCommandParams;
22-
import org.eclipse.lsp4j.Location;
2318
import org.eclipse.lsp4j.MessageParams;
2419
import org.eclipse.lsp4j.MessageType;
2520
import org.eclipse.lsp4j.ProgressParams;
26-
import org.eclipse.lsp4j.ShowDocumentParams;
27-
import org.eclipse.lsp4j.ShowDocumentResult;
2821
import org.eclipse.lsp4j.WorkDoneProgressCreateParams;
2922
import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
3023
import org.eclipse.lsp4j.jsonrpc.validation.NonNull;
24+
import org.eclipse.lsp4j.services.LanguageServer;
3125
import org.eclipse.ui.ISelectionService;
3226
import org.eclipse.ui.IWorkbenchWindow;
3327
import org.eclipse.ui.PlatformUI;
@@ -61,6 +55,12 @@ public static SnykExtendedLanguageClient getInstance() {
6155
return instance; // we leave instantiation to LSP4e, no lazy construction here
6256
}
6357

58+
public LanguageServer getConnectedLanguageServer() {
59+
return super.getLanguageServer();
60+
}
61+
62+
63+
6464
public void triggerScan(IWorkbenchWindow window) {
6565
if (Preferences.getInstance().getAuthToken().isBlank()) {
6666
runSnykWizard();
@@ -165,7 +165,7 @@ private void showAuthenticatedMessage() {
165165
MessageParams messageParams = new MessageParams();
166166
messageParams.setType(MessageType.Info);
167167
messageParams.setMessage("The authentication token has been stored in Snyk Preferences.");
168-
ServerMessageHandler.showMessage("Authentication with Snyk successful", messageParams);
168+
super.showMessage(messageParams);
169169
}
170170

171171
private void runForProject(String projectName) {
@@ -178,7 +178,7 @@ private void runForProject(String projectName) {
178178
private void executeCommand(@NonNull String command, List<Object> arguments) {
179179
ExecuteCommandParams params = new ExecuteCommandParams(command, arguments);
180180
try {
181-
getLanguageServer().getWorkspaceService().executeCommand(params);
181+
getConnectedLanguageServer().getWorkspaceService().executeCommand(params);
182182
} catch (Exception e) {
183183
SnykLogger.logError(e);
184184
}
@@ -194,23 +194,6 @@ protected void setAuthenticationMethod(HasAuthenticatedParam param, Preferences
194194
}
195195
}
196196

197-
// TODO: remove once LSP4e supports `showDocument` in its next release (it's
198-
// been merged to it already)
199-
@Override
200-
public CompletableFuture<ShowDocumentResult> showDocument(ShowDocumentParams params) {
201-
return CompletableFuture.supplyAsync(() -> {
202-
PlatformUI.getWorkbench().getDisplay().syncExec(() -> {
203-
var location = new Location(params.getUri(), params.getSelection());
204-
var window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
205-
if (window != null) {
206-
var page = window.getActivePage();
207-
LSPEclipseUtils.openInEditor(location, page);
208-
}
209-
});
210-
return new ShowDocumentResult(true);
211-
});
212-
}
213-
214197
/**
215198
* Refresh the token using language server. Waits up to 2s for the token change.
216199
* @return true if token has changed, false if not

0 commit comments

Comments
 (0)