Disable live hover watchdog when no interesting files are open.

This commit is contained in:
Kris De Volder
2017-10-23 13:53:54 -07:00
parent 8bccbeafc6
commit d4b6dd4e17
2 changed files with 61 additions and 20 deletions

View File

@@ -106,17 +106,6 @@ public class BootJavaLanguageServer extends SimpleLanguageServer {
BootJavaHoverProvider hoverInfoProvider = createHoverHandler(javaProjectFinder, serverParams.runningAppProvider);
documents.onHover(hoverInfoProvider);
liveHoverWatchdog = new SpringLiveHoverWatchdog(this, hoverInfoProvider, serverParams.runningAppProvider);
documents.onDidChangeContent(params -> {
TextDocument doc = params.getDocument();
if (testHightlighter != null) {
getClient().highlight(new HighlightParams(params.getDocument().getId(), testHightlighter.apply(doc)));
} else {
liveHoverWatchdog.watchDocument(doc.getUri());
liveHoverWatchdog.update(doc.getUri());
}
});
ReferencesHandler referencesHandler = createReferenceHandler(this, javaProjectFinder);
documents.onReferences(referencesHandler);
@@ -134,6 +123,20 @@ public class BootJavaLanguageServer extends SimpleLanguageServer {
documents.onCodeLens(codeLensHandler::createCodeLenses);
documents.onCodeLensResolve(codeLensHandler::resolveCodeLens);
projectFinder = serverParams.projectFinder;
projectObserver = serverParams.projectObserver;
liveHoverWatchdog = new SpringLiveHoverWatchdog(this, hoverInfoProvider, serverParams.runningAppProvider, projectFinder, projectObserver);
documents.onDidChangeContent(params -> {
TextDocument doc = params.getDocument();
if (testHightlighter != null) {
getClient().highlight(new HighlightParams(params.getDocument().getId(), testHightlighter.apply(doc)));
} else {
liveHoverWatchdog.watchDocument(doc.getUri());
liveHoverWatchdog.update(doc.getUri());
}
});
workspaceService.onDidChangeConfiguraton(settings -> {
config.handleConfigurationChange(settings);
if (config.isBootHintsEnabled()) {
@@ -143,8 +146,6 @@ public class BootJavaLanguageServer extends SimpleLanguageServer {
}
});
projectFinder = serverParams.projectFinder;
projectObserver = serverParams.projectObserver;
}
public void setMaxCompletionsNumber(int number) {
@@ -156,7 +157,6 @@ public class BootJavaLanguageServer extends SimpleLanguageServer {
CompletableFuture<InitializeResult> result = super.initialize(params);
this.indexer.initialize(this.getWorkspaceRoot());
this.liveHoverWatchdog.start();
return result;
}

View File

@@ -15,14 +15,19 @@ import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.stream.Stream;
import org.eclipse.lsp4j.Range;
import org.eclipse.lsp4j.TextDocumentIdentifier;
import org.springframework.ide.vscode.boot.java.handlers.BootJavaHoverProvider;
import org.springframework.ide.vscode.boot.java.handlers.RunningAppProvider;
import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp;
import org.springframework.ide.vscode.commons.java.IJavaProject;
import org.springframework.ide.vscode.commons.languageserver.HighlightParams;
import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder;
import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver;
import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
import org.springframework.ide.vscode.commons.util.Log;
import org.springframework.ide.vscode.commons.util.text.TextDocument;
/**
@@ -41,16 +46,49 @@ public class SpringLiveHoverWatchdog {
private Timer timer;
private JavaProjectFinder projectFinder;
public SpringLiveHoverWatchdog(SimpleLanguageServer server, BootJavaHoverProvider hoverProvider, RunningAppProvider runningAppProvider) {
private void refreshEnablement() {
boolean shouldEnable = highlightsEnabled && hasInterestingProject(watchedDocs.stream());
if (shouldEnable) {
start();
} else {
shutdown();
}
}
private boolean hasInterestingProject(Stream<String> uris) {
return uris.anyMatch(uri -> projectFinder.find(new TextDocumentIdentifier(uri)).isPresent());
}
public SpringLiveHoverWatchdog(SimpleLanguageServer server, BootJavaHoverProvider hoverProvider, RunningAppProvider runningAppProvider, JavaProjectFinder projectFinder, ProjectObserver projectChanges) {
this.server = server;
this.hoverProvider = hoverProvider;
this.runningAppProvider = runningAppProvider;
this.projectFinder = projectFinder;
this.watchedDocs = new ConcurrentSkipListSet<>();
projectChanges.addListener(new ProjectObserver.Listener() {
@Override
public void deleted(IJavaProject project) {
refreshEnablement();
}
@Override
public void created(IJavaProject project) {
refreshEnablement();
}
@Override
public void changed(IJavaProject project) {
refreshEnablement();
}
});
}
public synchronized void start() {
private synchronized void start() {
if (highlightsEnabled && timer == null) {
Log.info("Starting SpringLiveHoverWatchdog");
this.timer = new Timer();
TimerTask task = new TimerTask() {
@@ -66,23 +104,26 @@ public class SpringLiveHoverWatchdog {
public synchronized void shutdown() {
if (timer != null) {
Log.info("Shutting down SpringLiveHoverWatchdog");
timer.cancel();
timer = null;
watchedDocs.forEach(uri -> cleanupLiveHints(uri));
}
}
public void watchDocument(String docURI) {
public synchronized void watchDocument(String docURI) {
this.watchedDocs.add(docURI);
refreshEnablement();
}
public void unwatchDocument(String docURI) {
public synchronized void unwatchDocument(String docURI) {
this.watchedDocs.remove(docURI);
cleanupLiveHints(docURI);
if (watchedDocs.size() == 0) {
cleanupResources();
}
refreshEnablement();
}
public void update(String docURI) {
@@ -123,14 +164,14 @@ public class SpringLiveHoverWatchdog {
public synchronized void enableHighlights() {
if (!highlightsEnabled) {
highlightsEnabled = true;
start();
refreshEnablement();
}
}
public synchronized void disableHighlights() {
if (highlightsEnabled) {
highlightsEnabled = false;
shutdown();
refreshEnablement();
}
}