From 427ab9cbb6c6700e18f1862d01f46d010819b7f8 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 25 Jan 2011 18:13:50 +0100 Subject: [PATCH] don't close lookup on appending prefix during completion --- .../completion/JavaAutoPopupTest.groovy | 15 ++++++ .../completion/CodeCompletionHandlerBase.java | 2 +- .../CompletionProgressIndicator.java | 30 +++++++---- .../impl/CodeInsightTestFixtureImpl.java | 54 +++++++++++-------- 4 files changed, 66 insertions(+), 35 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy index 55b7e8904ad6..6bdd6f45061b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy @@ -316,4 +316,19 @@ class JavaAutoPopupTest extends CompletionAutoPopupTestCase { assert 'ArrayIndexOutOfBoundsException' in myFixture.lookupElementStrings } + public void testTypingDuringExplicitCompletion() { + myFixture.configureByText("a.java", """ + class A { + { Runnable r = new } + } + """) + myFixture.complete CompletionType.SMART + edt { myFixture.type 'Thr' } + joinCompletion() + assert lookup + assert 'Thread' in myFixture.lookupElementStrings + } + + + } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index 76ebf9b1a037..d0a86084bb90 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -285,7 +285,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { final AtomicReference data = startCompletionThread(parameters, indicator, initContext); - if (!invokedExplicitly && (!ApplicationManager.getApplication().isUnitTestMode() || CompletionAutoPopupHandler.ourTestingAutopopup)) { + if ((!invokedExplicitly && !ApplicationManager.getApplication().isUnitTestMode()) || CompletionAutoPopupHandler.ourTestingAutopopup) { indicator.notifyBackgrounded(); return; } 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 a848f6d6791f..3b3dbc4690dd 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java @@ -401,16 +401,14 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement LOG.assertTrue(this == CompletionServiceImpl.getCompletionService().getCurrentCompletion()); Lookup lookup = LookupManager.getActiveLookup(myEditor); - if (lookup != null) { - LOG.assertTrue(lookup == myLookup); - myLookup.removeLookupListener(myLookupListener); - finishCompletionProcess(); + LOG.assertTrue(lookup == myLookup); + myLookup.removeLookupListener(myLookupListener); + finishCompletionProcess(); + myState.assertDisposed(); + CompletionServiceImpl.assertPhase(CompletionPhase.NoCompletion.getClass()); - if (hideLookup) { - LookupManager.getInstance(getProject()).hideActiveLookup(); - } - } else { - myState.assertDisposed(); + if (hideLookup) { + LookupManager.getInstance(getProject()).hideActiveLookup(); } } @@ -451,10 +449,19 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement public void run() { if (isOutdated()) return; if (!isBackgrounded()) return; - if (isCanceled() && !myState.isRestartScheduled()) return; + + if (isCanceled() && myState.isRestartScheduled()) { + CompletionServiceImpl.assertPhase(CompletionPhase.Restarted.class); + return; + } myLookup.setCalculating(false); + if (isCanceled()) { + CompletionServiceImpl.assertPhase(CompletionPhase.NoCompletion.getClass()); + return; + } + if (CompletionServiceImpl.isPhase(CompletionPhase.BgCalculation.class) && hideAutopopupIfMeaningless()) { return; } @@ -466,7 +473,8 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement final CompletionProgressIndicator current = CompletionServiceImpl.getCompletionService().getCurrentCompletion(); LOG.assertTrue(current == null, current + "!=" + CompletionProgressIndicator.this); - CompletionServiceImpl.setCompletionPhase(myHandler.handleEmptyLookup(getProject(), myEditor, myParameters, CompletionProgressIndicator.this)); + CompletionServiceImpl + .setCompletionPhase(myHandler.handleEmptyLookup(getProject(), myEditor, myParameters, CompletionProgressIndicator.this)); } } else { diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index bf88b90692d8..57f3011f0f12 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -54,6 +54,7 @@ import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.Result; +import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; @@ -839,35 +840,42 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig public LookupElement[] complete(final CompletionType type, final int invocationCount) { assertInitialized(); myEmptyLookup = false; - new WriteCommandAction(getProject()) { + UIUtil.invokeAndWaitIfNeeded(new Runnable() { @Override - protected void run(Result result) throws Exception { - final CodeCompletionHandlerBase handler = new CodeCompletionHandlerBase(type) { + public void run() { + CommandProcessor.getInstance().executeCommand(getProject(), new Runnable() { @Override - protected PsiFile createFileCopy(final PsiFile file) { - final PsiFile copy = super.createFileCopy(file); - if (myFileContext != null) { - final PsiElement contextCopy = myFileContext.copy(); - final PsiFile containingFile = contextCopy.getContainingFile(); - if (containingFile instanceof PsiFileImpl) { - ((PsiFileImpl)containingFile).setOriginalFile(myFileContext.getContainingFile()); + public void run() { + final CodeCompletionHandlerBase handler = new CodeCompletionHandlerBase(type) { + @Override + protected PsiFile createFileCopy(final PsiFile file) { + final PsiFile copy = super.createFileCopy(file); + if (myFileContext != null) { + final PsiElement contextCopy = myFileContext.copy(); + final PsiFile containingFile = contextCopy.getContainingFile(); + if (containingFile instanceof PsiFileImpl) { + ((PsiFileImpl)containingFile).setOriginalFile(myFileContext.getContainingFile()); + } + setContext(copy, contextCopy); + } + return copy; } - setContext(copy, contextCopy); - } - return copy; - } - @Override - protected void completionFinished(final int offset1, final int offset2, final CompletionProgressIndicator indicator, - final LookupElement[] items) { - myEmptyLookup = items.length == 0; - super.completionFinished(offset1, offset2, indicator, items); + @Override + protected void completionFinished(final int offset1, final int offset2, final CompletionProgressIndicator indicator, + final LookupElement[] items) { + myEmptyLookup = items.length == 0; + super.completionFinished(offset1, offset2, indicator, items); + } + }; + Editor editor = getCompletionEditor(); + handler.invokeCompletion(getProject(), editor, PsiUtilBase.getPsiFileInEditor(editor, getProject()), invocationCount); + } - }; - Editor editor = getCompletionEditor(); - handler.invokeCompletion(getProject(), editor, PsiUtilBase.getPsiFileInEditor(editor, getProject()), invocationCount); + }, null, null); } - }.execute(); + }); + return getLookupElements(); }