IDEA-65856 Throwable at com.intellij.codeInsight.completion.CompletionProgressIndicator.closeAndFinish

This commit is contained in:
peter
2011-02-24 16:24:31 +01:00
parent 7e8f752346
commit 5329e9bb75
4 changed files with 47 additions and 27 deletions

View File

@@ -17,11 +17,11 @@ package com.intellij.codeInsight.completion
import com.intellij.codeInsight.lookup.Lookup
import com.intellij.codeInsight.lookup.LookupManager
import com.intellij.ide.ui.UISettings
import com.intellij.openapi.actionSystem.IdeActions
import com.intellij.openapi.command.CommandProcessor
import com.intellij.ide.ui.UISettings
/**
/**
* @author peter
*/
class JavaAutoPopupTest extends CompletionAutoPopupTestCase {
@@ -485,5 +485,25 @@ public interface Test {
assert !lookup
}
public void testCancellingDuringCalculation() {
myFixture.configureByText "a.java", """
public interface Test {
<caret>
}"""
edt { myFixture.type 'A' }
joinAlarm()
def first = lookup
assert first
edt {
assert first == lookup
lookup.hide()
myFixture.type 'a'
}
joinAlarm()
joinAlarm()
joinAlarm()
assert lookup != first
}
}

View File

@@ -27,7 +27,6 @@ import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.injected.editor.EditorWindow;
import com.intellij.lang.Language;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.openapi.application.ApplicationAdapter;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.ex.ApplicationEx;
@@ -297,14 +296,6 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler {
final CompletionProgressIndicator indicator,
final CompletionInitializationContext initContext) {
final ApplicationAdapter listener = new ApplicationAdapter() {
@Override
public void beforeWriteActionStart(Object action) {
indicator.scheduleRestart();
}
};
ApplicationManager.getApplication().addApplicationListener(listener);
final Semaphore startSemaphore = new Semaphore();
startSemaphore.down();
startSemaphore.down();
@@ -334,23 +325,18 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler {
try {
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
try {
startSemaphore.up();
ProgressManager.checkCanceled();
startSemaphore.up();
ProgressManager.checkCanceled();
final LookupElement[] result = CompletionService.getCompletionService().performCompletion(parameters, new Consumer<LookupElement>() {
public void consume(final LookupElement lookupElement) {
indicator.addItem(lookupElement);
}
});
final LookupElement[] result = CompletionService.getCompletionService().performCompletion(parameters, new Consumer<LookupElement>() {
public void consume(final LookupElement lookupElement) {
indicator.addItem(lookupElement);
}
});
indicator.ensureDuringCompletionPassed();
indicator.ensureDuringCompletionPassed();
data.set(result);
}
finally {
ApplicationManager.getApplication().removeApplicationListener(listener);
}
data.set(result);
}
});
}

View File

@@ -17,6 +17,8 @@ package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.completion.impl.CompletionServiceImpl;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationAdapter;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.CaretModel;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
@@ -78,8 +80,14 @@ public abstract class CompletionPhase implements Disposable {
boolean modifiersChanged = false;
volatile boolean focusLookupWhenDone = false;
public BgCalculation(CompletionProgressIndicator indicator) {
public BgCalculation(final CompletionProgressIndicator indicator) {
super(indicator);
ApplicationManager.getApplication().addApplicationListener(new ApplicationAdapter() {
@Override
public void beforeWriteActionStart(Object action) {
indicator.scheduleRestart();
}
}, this);
}
@Override

View File

@@ -93,7 +93,8 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement
setMergeCommand();
myOffsetMap.addOffset(CompletionInitializationContext.START_OFFSET, myEditor.getCaretModel().getOffset() - item.getLookupString().length());
myOffsetMap.addOffset(CompletionInitializationContext.START_OFFSET,
myEditor.getCaretModel().getOffset() - item.getLookupString().length());
CodeCompletionHandlerBase.selectLookupItem(item, event.getCompletionChar(), CompletionProgressIndicator.this, myLookup.getItems());
}
@@ -159,6 +160,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement
}
for (CompletionContributor contributor : CompletionContributor.forLanguage(initContext.getPositionLanguage())) {
ProgressManager.checkCanceled();
if (DumbService.getInstance(initContext.getProject()).isDumb() && !DumbService.isDumbAware(contributor)) {
continue;
}
@@ -602,6 +604,10 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement
cancel();
ApplicationManager.getApplication().assertIsDispatchThread();
final CompletionProgressIndicator current = CompletionServiceImpl.getCompletionService().getCurrentCompletion();
LOG.assertTrue(this == current, current + "!=" + this);
final CompletionPhase phase = new CompletionPhase.Restarted(this);
CompletionServiceImpl.setCompletionPhase(phase);