From 88d1f66b6da5af3168e11d3721bf69ed923fa342 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 5 Sep 2012 11:24:51 +0200 Subject: [PATCH] don't hang after exceptions in completion thread (IDEA-90638) --- .../CompletionProgressIndicator.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java index 4127bbd7d17d..ce8fbb45ea7e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java @@ -41,6 +41,7 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.util.ProgressIndicatorBase; import com.intellij.openapi.progress.util.ProgressWrapper; @@ -725,22 +726,34 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement class CalculateItems implements Runnable { @Override public void run() { - duringCompletion(initContext); - ProgressManager.checkCanceled(); - - LookupElement[] result = CompletionService.getCompletionService().performCompletion(myParameters, weigher); - ProgressManager.checkCanceled(); - - weigher.waitFor(); - ProgressManager.checkCanceled(); - - data.set(result); + try { + data.set(calculateItems(initContext, weigher)); + } + catch (ProcessCanceledException ignore) { + } + catch (Throwable t) { + LOG.error(t); + cancel(); + } } } strategy.startThread(this, new CalculateItems()); return data; } + private LookupElement[] calculateItems(CompletionInitializationContext initContext, WeighingDelegate weigher) { + duringCompletion(initContext); + ProgressManager.checkCanceled(); + + LookupElement[] result = CompletionService.getCompletionService().performCompletion(myParameters, weigher); + ProgressManager.checkCanceled(); + + weigher.waitFor(); + ProgressManager.checkCanceled(); + + return result; + } + private static class ModifierTracker extends KeyAdapter { private final JComponent myContentComponent;