Partially working classpath change mechanics

Prints messages in language server logs, but doesn't really do anything else with the change events yet.
This commit is contained in:
Kris De Volder
2018-03-15 15:24:19 -07:00
parent 93f58f77b9
commit f442c28bff
11 changed files with 47 additions and 21 deletions

View File

@@ -23,5 +23,10 @@
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>

View File

@@ -1,3 +1,4 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding/<project>=UTF-8

View File

@@ -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<Object> 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";
}));

View File

@@ -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<Object> 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(

View File

@@ -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<Object> 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";
}

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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<C extends LanguageServerComponents> extends ComposableLanguageServer<C> {
@@ -24,11 +23,12 @@ public class BootLanguageServer<C extends LanguageServerComponents> extends Comp
super(extensionId, _components);
}
public static ComposableLanguageServer<CompositeLanguageServerComponents> create(LSFactory<BootLanguageServerParams> params) {
public static ComposableLanguageServer<CompositeLanguageServerComponents> create(LSFactory<BootLanguageServerParams> _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);
});
}

View File

@@ -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<? extends SymbolAddOnInformation> getAdditonalInformation(String docURI) {
waitForInitializeTask();
return this.addonInformationByDoc.get(docURI);
List<SymbolAddOnInformation> info = this.addonInformationByDoc.get(docURI);
return info == null ? ImmutableList.of() : info;
}
private List<SymbolInformation> searchMatchingSymbols(List<SymbolInformation> allsymbols, String query) {

View File

@@ -52,13 +52,14 @@ public class JdtLsProjectCache implements JavaProjectFinder, ProjectObserver {
public JdtLsProjectCache(SimpleLanguageServer server) {
this.server = server;
CompletableFuture<Disposable> disposable = new CompletableFuture<Disposable>();
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));
}

View File

@@ -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) => {