Skip to content

Commit a433467

Browse files
author
Thomas Mäder
committed
Fix up command id for jdt.ls code actions
1 parent 241917c commit a433467

4 files changed

Lines changed: 95 additions & 1 deletion

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.eclipse.che.plugin.java.languageserver;
2+
3+
import java.lang.reflect.Proxy;
4+
import org.eclipse.che.api.languageserver.util.DynamicWrapper;
5+
import org.eclipse.lsp4j.services.LanguageServer;
6+
import org.eclipse.lsp4j.services.TextDocumentService;
7+
8+
public class JavaLSWrapper {
9+
private LanguageServer wrapped;
10+
11+
public JavaLSWrapper(LanguageServer wrapped) {
12+
this.wrapped = wrapped;
13+
}
14+
15+
public TextDocumentService getTextDocumentService() {
16+
return (TextDocumentService)
17+
Proxy.newProxyInstance(
18+
getClass().getClassLoader(),
19+
new Class[] {TextDocumentService.class},
20+
new DynamicWrapper(
21+
new JavaTextDocumentServiceWraper(wrapped.getTextDocumentService()),
22+
wrapped.getTextDocumentService()));
23+
}
24+
}

plugins/plugin-java/che-plugin-java-server/src/main/java/org/eclipse/che/plugin/java/languageserver/JavaLanguageServerLauncher.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.google.inject.Inject;
1414
import com.google.inject.Singleton;
1515
import java.io.IOException;
16+
import java.lang.reflect.Proxy;
1617
import java.nio.file.Files;
1718
import java.nio.file.Path;
1819
import java.nio.file.Paths;
@@ -21,6 +22,7 @@
2122
import org.eclipse.che.api.languageserver.launcher.LanguageServerLauncherTemplate;
2223
import org.eclipse.che.api.languageserver.registry.DocumentFilter;
2324
import org.eclipse.che.api.languageserver.registry.LanguageServerDescription;
25+
import org.eclipse.che.api.languageserver.util.DynamicWrapper;
2426
import org.eclipse.che.plugin.java.inject.JavaModule;
2527
import org.eclipse.lsp4j.jsonrpc.Launcher;
2628
import org.eclipse.lsp4j.services.LanguageClient;
@@ -57,7 +59,14 @@ protected LanguageServer connectToLanguageServer(
5759
languageServerProcess.getInputStream(),
5860
languageServerProcess.getOutputStream());
5961
launcher.startListening();
60-
return launcher.getRemoteProxy();
62+
LanguageServer proxy = launcher.getRemoteProxy();
63+
LanguageServer wrapped =
64+
(LanguageServer)
65+
Proxy.newProxyInstance(
66+
getClass().getClassLoader(),
67+
new Class[] {LanguageServer.class},
68+
new DynamicWrapper(new JavaLSWrapper(proxy), proxy));
69+
return wrapped;
6170
}
6271

6372
protected Process startLanguageServerProcess(String projectPath) throws LanguageServerException {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package org.eclipse.che.plugin.java.languageserver;
2+
3+
import java.util.List;
4+
import java.util.concurrent.CompletableFuture;
5+
import org.eclipse.lsp4j.CodeActionParams;
6+
import org.eclipse.lsp4j.Command;
7+
import org.eclipse.lsp4j.services.TextDocumentService;
8+
9+
public class JavaTextDocumentServiceWraper {
10+
private TextDocumentService wrapped;
11+
12+
public JavaTextDocumentServiceWraper(TextDocumentService wrapped) {
13+
this.wrapped = wrapped;
14+
}
15+
16+
public CompletableFuture<List<? extends Command>> codeAction(CodeActionParams params) {
17+
CompletableFuture<List<? extends Command>> result = wrapped.codeAction(params);
18+
return result.thenApply(
19+
(List<? extends Command> commands) -> {
20+
commands.forEach(
21+
cmd -> {
22+
if ("java.apply.workspaceEdit".equals(cmd.getCommand())) {
23+
cmd.setCommand("lsp.applyWorkspaceEdit");
24+
}
25+
});
26+
return commands;
27+
});
28+
}
29+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.eclipse.che.api.languageserver.util;
2+
3+
import java.lang.reflect.InvocationHandler;
4+
import java.lang.reflect.Method;
5+
6+
/**
7+
* This class forwards invocation of methods from a wrapped instance to another object, if it
8+
* declares the method in question. It serves to create wrapper classes without having to implement
9+
* a large protocol
10+
*
11+
* @author thomas
12+
*/
13+
public class DynamicWrapper implements InvocationHandler {
14+
private Object overrides;
15+
private Object wrapped;
16+
17+
public DynamicWrapper(Object overrides, Object wrapped) {
18+
this.overrides = overrides;
19+
this.wrapped = wrapped;
20+
}
21+
22+
@Override
23+
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
24+
try {
25+
Method declaredMethod =
26+
overrides.getClass().getDeclaredMethod(method.getName(), method.getParameterTypes());
27+
return declaredMethod.invoke(overrides, args);
28+
} catch (NoSuchMethodException e) {
29+
return method.invoke(wrapped, args);
30+
}
31+
}
32+
}

0 commit comments

Comments
 (0)