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 a1a96746fb7d..073d301a6154 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -21,8 +21,6 @@ import com.intellij.codeInsight.CodeInsightSettings; import com.intellij.codeInsight.TailType; import com.intellij.codeInsight.completion.impl.CompletionServiceImpl; import com.intellij.codeInsight.editorActions.CompletionAutoPopupHandler; -import com.intellij.codeInsight.hint.EditorHintListener; -import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.lookup.*; import com.intellij.codeInsight.lookup.impl.LookupImpl; import com.intellij.featureStatistics.FeatureUsageTracker; @@ -62,11 +60,9 @@ import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.util.PsiUtilBase; import com.intellij.reference.SoftReference; -import com.intellij.ui.LightweightHint; import com.intellij.util.Consumer; import com.intellij.util.ThreeState; import com.intellij.util.concurrency.Semaphore; -import com.intellij.util.messages.MessageBusConnection; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -478,7 +474,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { final LookupElement[] items) { if (items.length == 0) { LookupManager.getInstance(indicator.getProject()).hideActiveLookup(); - handleEmptyLookup(indicator); + indicator.handleEmptyLookup(); return; } @@ -603,38 +599,6 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { return invokedExplicitly && CodeInsightSettings.getInstance().AUTOCOMPLETE_COMMON_PREFIX; } - protected void handleEmptyLookup(final CompletionProgressIndicator indicator) { - indicator.assertDisposed(); - assert !indicator.isAutopopupCompletion(); - - if (!ApplicationManager.getApplication().isUnitTestMode() && invokedExplicitly) { - for (final CompletionContributor contributor : CompletionContributor.forParameters(indicator.getParameters())) { - final String text = contributor.handleEmptyLookup(indicator.getParameters(), indicator.getEditor()); - if (StringUtil.isNotEmpty(text)) { - LightweightHint hint = showErrorHint(indicator.getProject(), indicator.getEditor(), text); - CompletionServiceImpl.setCompletionPhase(indicator.areModifiersChanged() ? CompletionPhase.NoCompletion : new CompletionPhase.NoSuggestionsHint(hint, indicator)); - return; - } - } - } - CompletionServiceImpl.setCompletionPhase(CompletionPhase.NoCompletion); - } - - private static LightweightHint showErrorHint(Project project, Editor editor, String text) { - final LightweightHint[] result = {null}; - final EditorHintListener listener = new EditorHintListener() { - public void hintShown(final Project project, final LightweightHint hint, final int flags) { - result[0] = hint; - } - }; - final MessageBusConnection connection = project.getMessageBus().connect(); - connection.subscribe(EditorHintListener.TOPIC, listener); - assert text != null; - HintManager.getInstance().showErrorHint(editor, text); - connection.disconnect(); - return result[0]; - } - private static void lookupItemSelected(final CompletionProgressIndicator indicator, @NotNull final LookupElement item, final char completionChar, final List items) { if (indicator.getHandler().autopopup) { 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 9f8aa59a604b..ec56830d06d8 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java @@ -17,6 +17,8 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.completion.impl.CompletionServiceImpl; +import com.intellij.codeInsight.hint.EditorHintListener; +import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.lookup.*; import com.intellij.codeInsight.lookup.impl.LookupImpl; import com.intellij.openapi.actionSystem.IdeActions; @@ -42,9 +44,11 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiReference; import com.intellij.psi.ReferenceRange; import com.intellij.psi.util.PsiUtilBase; +import com.intellij.ui.LightweightHint; import com.intellij.util.ObjectUtils; import com.intellij.util.concurrency.Semaphore; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.ui.update.MergingUpdateQueue; import com.intellij.util.ui.update.Update; import org.jetbrains.annotations.NotNull; @@ -464,7 +468,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement final CompletionProgressIndicator current = CompletionServiceImpl.getCompletionService().getCurrentCompletion(); LOG.assertTrue(current == null, current + "!=" + CompletionProgressIndicator.this); - myHandler.handleEmptyLookup(CompletionProgressIndicator.this); + handleEmptyLookup(); } } else { @@ -619,4 +623,40 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement public String toString() { return myState.toString(); } + + protected void handleEmptyLookup() { + assertDisposed(); + assert !isAutopopupCompletion(); + + if (ApplicationManager.getApplication().isUnitTestMode() || !myHandler.invokedExplicitly) { + CompletionServiceImpl.setCompletionPhase(CompletionPhase.NoCompletion); + return; + } + + for (final CompletionContributor contributor : CompletionContributor.forParameters(getParameters())) { + final String text = contributor.handleEmptyLookup(getParameters(), getEditor()); + if (StringUtil.isNotEmpty(text)) { + LightweightHint hint = showErrorHint(getProject(), getEditor(), text); + CompletionServiceImpl.setCompletionPhase( + areModifiersChanged() ? CompletionPhase.NoCompletion : new CompletionPhase.NoSuggestionsHint(hint, this)); + return; + } + } + CompletionServiceImpl.setCompletionPhase(CompletionPhase.NoCompletion); + } + + private static LightweightHint showErrorHint(Project project, Editor editor, String text) { + final LightweightHint[] result = {null}; + final EditorHintListener listener = new EditorHintListener() { + public void hintShown(final Project project, final LightweightHint hint, final int flags) { + result[0] = hint; + } + }; + final MessageBusConnection connection = project.getMessageBus().connect(); + connection.subscribe(EditorHintListener.TOPIC, listener); + assert text != null; + HintManager.getInstance().showErrorHint(editor, text); + connection.disconnect(); + return result[0]; + } }