From d4b6dd4e170f637b84f62a3f601abbdc72ed2bef Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Mon, 23 Oct 2017 13:53:54 -0700 Subject: [PATCH] Disable live hover watchdog when no interesting files are open. --- .../boot/java/BootJavaLanguageServer.java | 28 +++++----- .../java/utils/SpringLiveHoverWatchdog.java | 53 ++++++++++++++++--- 2 files changed, 61 insertions(+), 20 deletions(-) diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java index fe31307e7..148606493 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java @@ -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 result = super.initialize(params); this.indexer.initialize(this.getWorkspaceRoot()); - this.liveHoverWatchdog.start(); return result; } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringLiveHoverWatchdog.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringLiveHoverWatchdog.java index e941c49a9..8124bc127 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringLiveHoverWatchdog.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringLiveHoverWatchdog.java @@ -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 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(); } }