From aaf16eabb293809787a751afc2f79b1cfb8ba4c3 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Tue, 2 Mar 2021 12:14:58 +0100 Subject: [PATCH] added timeout for hover computation inside of language server --- .../util/SimpleTextDocumentService.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java index a43d9c133..4d8d695fb 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java @@ -17,6 +17,7 @@ import java.util.concurrent.CancellationException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -287,17 +288,17 @@ public class SimpleTextDocumentService implements TextDocumentService, DocumentE public CompletableFuture hover(HoverParams hoverParams) { log.debug("hover requested for {}", hoverParams.getPosition()); - return CompletableFutures.computeAsync(cancelToken -> { + CompletableFuture result = CompletableFutures.computeAsync(cancelToken -> { return computeHover(cancelToken, hoverParams); }); - - // TODO: timeout still necessary ????? - -// long timeout = props.getHoverTimeout(); -// return timeout <= 0 ? async.invoke(() -> computeHover(hoverParams)) : async.invoke(Duration.ofMillis(timeout), () -> computeHover(hoverParams), Mono.fromRunnable(() -> { -// log.error("Hover Request handler timed out after {} ms.", timeout); -// })); + long timeout = props.getHoverTimeout(); + if (timeout <= 0) { + return result; + } + else { + return result.completeOnTimeout(NO_HOVER, timeout, TimeUnit.MILLISECONDS); + } } private Hover computeHover(CancelChecker cancelToken, HoverParams hoverParams) {