Bug 550964 - call get with timeout instead of join to avoid UI freeze when operation takes too long
Change-Id: I3db1527d59841d81fe8c51b56acf855042d3fea6
Signed-off-by: Martin Lippert <mlippert@gmail.com>
diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/WorkspaceSymbolsQuickAccessProvider.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/WorkspaceSymbolsQuickAccessProvider.java
index ee1f189..b848b3f 100644
--- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/WorkspaceSymbolsQuickAccessProvider.java
+++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/WorkspaceSymbolsQuickAccessProvider.java
@@ -15,10 +15,14 @@
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.lsp4e.LanguageServerPlugin;
import org.eclipse.lsp4e.LanguageServiceAccessor;
import org.eclipse.lsp4j.WorkspaceSymbolParams;
import org.eclipse.lsp4j.services.LanguageServer;
@@ -53,10 +57,17 @@
}
WorkspaceSymbolParams params = new WorkspaceSymbolParams(query);
List<QuickAccessElement> res = Collections.synchronizedList(new ArrayList<>());
- CompletableFuture.allOf(usedLanguageServers.stream().map(ls ->
- ls.getWorkspaceService().symbol(params).thenAcceptAsync(symbols ->
- res.addAll(symbols.stream().map(WorkspaceSymbolQuickAccessElement::new).collect(Collectors.toList()))
- )).toArray(CompletableFuture[]::new)).join();
+
+ try {
+ CompletableFuture.allOf(usedLanguageServers.stream().map(ls ->
+ ls.getWorkspaceService().symbol(params).thenAcceptAsync(symbols ->
+ res.addAll(symbols.stream().map(WorkspaceSymbolQuickAccessElement::new).collect(Collectors.toList()))
+ )).toArray(CompletableFuture[]::new)).get(1000, TimeUnit.MILLISECONDS);
+ }
+ catch (ExecutionException | TimeoutException | InterruptedException e) {
+ LanguageServerPlugin.logError(e);
+ }
+
return res.toArray(new QuickAccessElement[res.size()]);
}