From f442c28bffd321c126dec58143fe358cf58edc66 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Thu, 15 Mar 2018 15:24:19 -0700 Subject: [PATCH] Partially working classpath change mechanics Prints messages in language server logs, but doesn't really do anything else with the change events yet. --- .../commons/commons-language-server/.classpath | 5 +++++ .../.settings/org.eclipse.core.resources.prefs | 1 + .../jdt/ls/ClasspathListenerManager.java | 5 +++-- .../languageserver/util/SimpleLanguageServer.java | 5 +++++ .../ls/extension/ClasspathListenerHandler.java | 12 ++++++++---- .../ls/extension/ClasspathListenerManager.java | 6 ++++++ .../jdt/ls/extension/ResolveClasspathHandler.java | 2 +- .../ide/vscode/boot/BootLanguageServer.java | 8 ++++---- .../ide/vscode/boot/java/utils/SpringIndexer.java | 7 +++++-- .../ide/vscode/boot/jdt/ls/JdtLsProjectCache.java | 15 ++++++++------- vscode-extensions/vscode-spring-boot/lib/Main.ts | 2 +- 11 files changed, 47 insertions(+), 21 deletions(-) diff --git a/headless-services/commons/commons-language-server/.classpath b/headless-services/commons/commons-language-server/.classpath index 5e8a55fef..cd377e474 100644 --- a/headless-services/commons/commons-language-server/.classpath +++ b/headless-services/commons/commons-language-server/.classpath @@ -23,5 +23,10 @@ + + + + + diff --git a/headless-services/commons/commons-language-server/.settings/org.eclipse.core.resources.prefs b/headless-services/commons/commons-language-server/.settings/org.eclipse.core.resources.prefs index e9441bb12..abdea9ac0 100644 --- a/headless-services/commons/commons-language-server/.settings/org.eclipse.core.resources.prefs +++ b/headless-services/commons/commons-language-server/.settings/org.eclipse.core.resources.prefs @@ -1,3 +1,4 @@ eclipse.preferences.version=1 encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 encoding/=UTF-8 diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/jdt/ls/ClasspathListenerManager.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/jdt/ls/ClasspathListenerManager.java index 91134a989..a06ed6b7d 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/jdt/ls/ClasspathListenerManager.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/jdt/ls/ClasspathListenerManager.java @@ -24,6 +24,7 @@ import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguage import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.gson.JsonElement; import reactor.core.Disposable; @@ -46,8 +47,8 @@ public class ClasspathListenerManager { List args = callbackParams.getArguments(); //Note: not sure... but args might be deserialized as com.google.gson.JsonElement's. //If so the code below is not correct (casts will fail). - String projectUri = (String) args.get(0); - boolean deleted = args.size()>=2 && (Boolean)args.get(1); + String projectUri = ((JsonElement) args.get(0)).getAsString(); + boolean deleted = args.size()>=2 && ((JsonElement)args.get(1)).getAsBoolean(); classpathListener.changed(projectUri, deleted); return "done"; })); 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 ea4d9f28c..311f436ea 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,6 +18,7 @@ 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; @@ -173,6 +174,10 @@ public class SimpleLanguageServer implements Sts4LanguageServer, LanguageClientA } protected CompletableFuture executeCommand(ExecuteCommandParams params) { + ExecuteCommandHandler handler = commands.get(params.getCommand()); + if (handler!=null) { + return handler.handle(params); + } if (CODE_ACTION_COMMAND_ID.equals(params.getCommand())) { Assert.isLegal(params.getArguments().size()==2); QuickfixResolveParams quickfixParams = new QuickfixResolveParams( diff --git a/headless-services/org.springframework.tooling.jdt.ls.extension/src/org/springframework/tooling/jdt/ls/extension/ClasspathListenerHandler.java b/headless-services/org.springframework.tooling.jdt.ls.extension/src/org/springframework/tooling/jdt/ls/extension/ClasspathListenerHandler.java index 273ed0cbd..eab5414d6 100644 --- a/headless-services/org.springframework.tooling.jdt.ls.extension/src/org/springframework/tooling/jdt/ls/extension/ClasspathListenerHandler.java +++ b/headless-services/org.springframework.tooling.jdt.ls.extension/src/org/springframework/tooling/jdt/ls/extension/ClasspathListenerHandler.java @@ -1,7 +1,8 @@ package org.springframework.tooling.jdt.ls.extension; +import static org.springframework.tooling.jdt.ls.extension.Logger.log; + import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; @@ -9,7 +10,6 @@ import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.ls.core.internal.IDelegateCommandHandler; import org.eclipse.jdt.ls.core.internal.JavaClientConnection; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; -import org.eclipse.jdt.ls.core.internal.handlers.JDTLanguageServer; import org.springframework.tooling.jdt.ls.extension.ClasspathListenerManager.ClasspathListener; @SuppressWarnings("restriction") @@ -29,11 +29,12 @@ public class ClasspathListenerHandler implements IDelegateCommandHandler { @Override public void classpathChanged(IJavaProject jp) { + log("Classpath changed "+jp.getElementName()); String project = jp.getProject().getLocationURI().toString(); boolean deleted = !jp.exists(); JavaClientConnection conn = JavaLanguageServerPlugin.getInstance().getClientConnection(); for (String callbackCommandId : subscribers) { - conn.executeCommand(callbackCommandId, Arrays.asList(project, deleted)); + conn.executeCommand(callbackCommandId, project, deleted); } } } @@ -42,14 +43,17 @@ public class ClasspathListenerHandler implements IDelegateCommandHandler { @Override public Object executeCommand(String commandId, List arguments, IProgressMonitor monitor) throws Exception { + log("ClasspathListenerHandler executeCommand "+commandId+ ", "+arguments); if (commandId.equals("sts.java.addClasspathListener")) { return addClasspathListener((String)arguments.get(0)); } - return null; + throw new IllegalArgumentException("Unknown command id: "+commandId); } private Object addClasspathListener(String callbackCommandId) { + log("ClasspathListenerHandler addClasspathListener "+callbackCommandId); classpathListener.subscribe(callbackCommandId); + log("ClasspathListenerHandler addClasspathListener "+callbackCommandId+ " => OK"); return "ok"; } diff --git a/headless-services/org.springframework.tooling.jdt.ls.extension/src/org/springframework/tooling/jdt/ls/extension/ClasspathListenerManager.java b/headless-services/org.springframework.tooling.jdt.ls.extension/src/org/springframework/tooling/jdt/ls/extension/ClasspathListenerManager.java index 5574b5220..0b0459030 100644 --- a/headless-services/org.springframework.tooling.jdt.ls.extension/src/org/springframework/tooling/jdt/ls/extension/ClasspathListenerManager.java +++ b/headless-services/org.springframework.tooling.jdt.ls.extension/src/org/springframework/tooling/jdt/ls/extension/ClasspathListenerManager.java @@ -20,6 +20,8 @@ import org.eclipse.jdt.core.IJavaElementDelta; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; +import static org.springframework.tooling.jdt.ls.extension.Logger.log; + /** * An instance of this class provides a means to register * listeners that get notified when classpath for a IJavaProject @@ -80,9 +82,12 @@ public class ClasspathListenerManager { * continually monitor them for changes from that point onward. */ public ClasspathListenerManager(ClasspathListener listener, boolean initialEvent) { + log("Setting up ClasspathListenerManager"); this.listener = listener; if (initialEvent) { + log("Sending initial event for all projects ..."); for (IProject p : ResourcesPlugin.getWorkspace().getRoot().getProjects()) { + log("project = "+p); try { if (p.isAccessible() && p.hasNature(JavaCore.NATURE_ID)) { IJavaProject jp = JavaCore.create(p); @@ -92,6 +97,7 @@ public class ClasspathListenerManager { Logger.log(e); } } + log("Sending initial event for all projects DONE"); } JavaCore.addElementChangedListener(myListener=new MyListener(), ElementChangedEvent.POST_CHANGE); } diff --git a/headless-services/org.springframework.tooling.jdt.ls.extension/src/org/springframework/tooling/jdt/ls/extension/ResolveClasspathHandler.java b/headless-services/org.springframework.tooling.jdt.ls.extension/src/org/springframework/tooling/jdt/ls/extension/ResolveClasspathHandler.java index 7e0cabcb8..430c99b8d 100644 --- a/headless-services/org.springframework.tooling.jdt.ls.extension/src/org/springframework/tooling/jdt/ls/extension/ResolveClasspathHandler.java +++ b/headless-services/org.springframework.tooling.jdt.ls.extension/src/org/springframework/tooling/jdt/ls/extension/ResolveClasspathHandler.java @@ -62,7 +62,7 @@ public class ResolveClasspathHandler implements IDelegateCommandHandler { } } Classpath classpath = new Classpath(cpEntries, javaProject.getOutputLocation().toString()); - log("classpath=" + classpath); + log("classpath=" + classpath.getEntries().size()+ " entries"); return classpath; } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/BootLanguageServer.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/BootLanguageServer.java index ed21a5ea7..0863bef58 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/BootLanguageServer.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/BootLanguageServer.java @@ -16,7 +16,6 @@ import org.springframework.ide.vscode.commons.languageserver.composable.Composab import org.springframework.ide.vscode.commons.languageserver.composable.CompositeLanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.composable.LanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.util.LSFactory; -import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; public class BootLanguageServer extends ComposableLanguageServer { @@ -24,11 +23,12 @@ public class BootLanguageServer extends Comp super(extensionId, _components); } - public static ComposableLanguageServer create(LSFactory params) { + public static ComposableLanguageServer create(LSFactory _params) { return new ComposableLanguageServer<>("vscode-boot", s -> { + BootLanguageServerParams params = _params.create(s); CompositeLanguageServerComponents.Builder components = new CompositeLanguageServerComponents.Builder(); - components.add(new BootPropertiesLanguageServerComponents(s, params)); - components.add(new BootJavaLanguageServerComponents(s, params)); + components.add(new BootPropertiesLanguageServerComponents(s, (ignore) -> params)); + components.add(new BootJavaLanguageServerComponents(s, (ignore) -> params)); return components.build(s); }); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java index c9450129d..a163daab4 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java @@ -72,6 +72,8 @@ import org.springframework.ide.vscode.commons.util.UriUtil; import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.util.text.TextDocument; +import com.google.common.collect.ImmutableList; + /** * @author Martin Lippert */ @@ -146,7 +148,7 @@ public class SpringIndexer { } } }, "Spring Annotation Index Update Worker"); - updateWorker.start(); + server.onInitialized(updateWorker::start); getWorkspaceService().onDidChangeWorkspaceFolders(evt -> { log.debug("workspace roots have changed event arrived - added: " + evt.getEvent().getAdded() + " - removed: " + evt.getEvent().getRemoved()); @@ -329,7 +331,8 @@ public class SpringIndexer { public List getAdditonalInformation(String docURI) { waitForInitializeTask(); - return this.addonInformationByDoc.get(docURI); + List info = this.addonInformationByDoc.get(docURI); + return info == null ? ImmutableList.of() : info; } private List searchMatchingSymbols(List allsymbols, String query) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java index 0db4e5573..34168521e 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java @@ -52,13 +52,14 @@ public class JdtLsProjectCache implements JavaProjectFinder, ProjectObserver { public JdtLsProjectCache(SimpleLanguageServer server) { this.server = server; CompletableFuture disposable = new CompletableFuture(); - this.server.onInitialized(() -> disposable.complete(server.addClasspathListener(new ClasspathListener() { - - @Override - public void changed(String projectUri, boolean deleted) { - log.info("Classpath changed: "+projectUri); - } - }))); + this.server.onInitialized(() -> + disposable.complete(server.addClasspathListener(new ClasspathListener() { + @Override + public void changed(String projectUri, boolean deleted) { + log.info("Classpath changed: "+projectUri); + } + })) + ); this.server.onShutdown(() -> disposable.thenAccept(Disposable::dispose)); } diff --git a/vscode-extensions/vscode-spring-boot/lib/Main.ts b/vscode-extensions/vscode-spring-boot/lib/Main.ts index 6673402a2..07de35d22 100644 --- a/vscode-extensions/vscode-spring-boot/lib/Main.ts +++ b/vscode-extensions/vscode-spring-boot/lib/Main.ts @@ -20,7 +20,7 @@ const JAVA_LANGUAGE_ID = "java"; export function activate(context: VSCode.ExtensionContext) { let options : commons.ActivatorOptions = { DEBUG: false, - CONNECT_TO_LS: false, + CONNECT_TO_LS: true, extensionId: 'vscode-spring-boot', preferJdk: true, checkjvm: (context: VSCode.ExtensionContext, jvm: commons.JVM) => {