mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 15:09:39 +07:00
IDEA-65856 Throwable at com.intellij.codeInsight.completion.CompletionProgressIndicator.closeAndFinish
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user