Skip to content

Commit 8fbd0ed

Browse files
committed
Use a separate ExecutorService in AsyncCompletionProposalPopup
This is necessary in order to effectively cancel all running futures in the popup (when one closes the popup).
1 parent a7d2795 commit 8fbd0ed

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

bundles/org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/AsyncCompletionProposalPopup.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import java.util.Set;
2626
import java.util.concurrent.CompletableFuture;
2727
import java.util.concurrent.ExecutionException;
28+
import java.util.concurrent.ExecutorService;
29+
import java.util.concurrent.Executors;
2830
import java.util.concurrent.TimeUnit;
2931
import java.util.concurrent.TimeoutException;
3032
import java.util.concurrent.atomic.AtomicInteger;
@@ -70,6 +72,8 @@ class AsyncCompletionProposalPopup extends CompletionProposalPopup {
7072

7173
private PopupVisibleTimer fPopupVisibleTimer= new PopupVisibleTimer();
7274

75+
private ExecutorService completionFuturesExecutor;
76+
7377
private static final class ComputingProposal implements ICompletionProposal, ICompletionProposalExtension {
7478

7579
private final int fOffset;
@@ -341,6 +345,9 @@ void createProposalSelector() {
341345
void cancelFutures() {
342346
toCancelFutures.forEach(future -> future.cancel(true));
343347
toCancelFutures.clear();
348+
if (completionFuturesExecutor != null) {
349+
completionFuturesExecutor.shutdownNow();
350+
}
344351
}
345352

346353
@Override
@@ -371,6 +378,8 @@ protected List<CompletableFuture<List<ICompletionProposal>>> buildCompletionFutu
371378
return Collections.emptyList();
372379
}
373380
List<CompletableFuture<List<ICompletionProposal>>> futures = new ArrayList<>(processors.size());
381+
completionFuturesExecutor= Executors.newSingleThreadExecutor();
382+
374383
for (IContentAssistProcessor processor : processors) {
375384
futures.add(CompletableFuture.supplyAsync(() -> {
376385
AtomicReference<List<ICompletionProposal>> result= new AtomicReference<>();
@@ -389,7 +398,7 @@ protected List<CompletableFuture<List<ICompletionProposal>>> buildCompletionFutu
389398
return Collections.emptyList();
390399
}
391400
return proposals;
392-
}));
401+
}, completionFuturesExecutor));
393402
}
394403
return futures;
395404
}

0 commit comments

Comments
 (0)