From d30c4471e5589cc9656851771c5eaecc4dc01a16 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 14 Nov 2012 21:13:25 +0100 Subject: [PATCH] IDEA-94821 Don't autoinsert a single completion item if it's provided via middle matching --- .../completion/JavaLookupElementBuilder.java | 7 +++++- .../normal/DontAutoInsertMiddleMatch.java | 5 +++++ .../DontAutoInsertMiddleMatch_after.java | 5 +++++ .../completion/NormalCompletionTest.groovy | 6 +++++ .../completion/CodeCompletionHandlerBase.java | 1 + .../completion/impl/CamelHumpMatcher.java | 22 ++++++++++++++++++- 6 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normal/DontAutoInsertMiddleMatch.java create mode 100644 java/java-tests/testData/codeInsight/completion/normal/DontAutoInsertMiddleMatch_after.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaLookupElementBuilder.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaLookupElementBuilder.java index 151d072b56c6..b92ca4d3ac52 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaLookupElementBuilder.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaLookupElementBuilder.java @@ -17,6 +17,7 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.openapi.util.Iconable; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiFormatUtilBase; @@ -82,8 +83,12 @@ public class JavaLookupElementBuilder { public static LookupElementBuilder forClass(@NotNull PsiClass psiClass, final String lookupString, final boolean withLocation) { - final LookupElementBuilder builder = + LookupElementBuilder builder = LookupElementBuilder.create(psiClass, lookupString).withIcon(psiClass.getIcon(Iconable.ICON_FLAG_VISIBILITY)); + String name = psiClass.getName(); + if (StringUtil.isNotEmpty(name)) { + builder = builder.withLookupString(name); + } if (withLocation) { return builder.withTailText(" (" + PsiFormatUtil.getPackageDisplayName(psiClass) + ")", true); } diff --git a/java/java-tests/testData/codeInsight/completion/normal/DontAutoInsertMiddleMatch.java b/java/java-tests/testData/codeInsight/completion/normal/DontAutoInsertMiddleMatch.java new file mode 100644 index 000000000000..9e4ac2ea1133 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/DontAutoInsertMiddleMatch.java @@ -0,0 +1,5 @@ +public class A { + void foo(Foo myXxxxxxxxx) { + Xxxxx + } +} diff --git a/java/java-tests/testData/codeInsight/completion/normal/DontAutoInsertMiddleMatch_after.java b/java/java-tests/testData/codeInsight/completion/normal/DontAutoInsertMiddleMatch_after.java new file mode 100644 index 000000000000..9e4ac2ea1133 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normal/DontAutoInsertMiddleMatch_after.java @@ -0,0 +1,5 @@ +public class A { + void foo(Foo myXxxxxxxxx) { + Xxxxx + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy index 717a30166363..5634445c09fc 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -1310,5 +1310,11 @@ public class ListUtils { assert myFixture.lookupElementStrings.containsAll(['foo', 'bar']) } + public void testDontAutoInsertMiddleMatch() { + configure() + checkResult() + assert lookup.items.size() == 1 + } + } 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 39b9527a993e..71d988663b6f 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -395,6 +395,7 @@ public class CodeCompletionHandlerBase { final AutoCompletionPolicy policy = getAutocompletionPolicy(item); if (policy == AutoCompletionPolicy.NEVER_AUTOCOMPLETE) return AutoCompletionDecision.SHOW_LOOKUP; if (policy == AutoCompletionPolicy.ALWAYS_AUTOCOMPLETE) return AutoCompletionDecision.insertItem(item); + if (!indicator.getLookup().itemMatcher(item).isStartMatch(item)) return AutoCompletionDecision.SHOW_LOOKUP; } if (!isAutocompleteOnInvocation(parameters.getCompletionType())) { return AutoCompletionDecision.SHOW_LOOKUP; diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java index b2b9f9384d4b..1901ca31e02e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java @@ -5,11 +5,13 @@ import com.intellij.codeInsight.CodeInsightSettings; import com.intellij.codeInsight.completion.PrefixMatcher; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.openapi.Disposable; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.codeStyle.MinusculeMatcher; import com.intellij.psi.codeStyle.NameUtil; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.TestOnly; @@ -18,6 +20,7 @@ import org.jetbrains.annotations.TestOnly; */ public class CamelHumpMatcher extends PrefixMatcher { private final MinusculeMatcher myMatcher; + private final MinusculeMatcher myCaseInsensitiveMatcher; private final boolean myCaseSensitive; private static boolean ourForceStartMatching; @@ -30,6 +33,7 @@ public class CamelHumpMatcher extends PrefixMatcher { super(prefix); myCaseSensitive = caseSensitive; myMatcher = createMatcher(myCaseSensitive); + myCaseInsensitiveMatcher = createMatcher(false); } @Override @@ -37,6 +41,22 @@ public class CamelHumpMatcher extends PrefixMatcher { return myMatcher.isStartMatch(name); } + @Override + public boolean isStartMatch(LookupElement element) { + if (super.isStartMatch(element)) { + return true; + } + if (element.isCaseSensitive()) { + return false; + } + return ContainerUtil.or(element.getAllLookupStrings(), new Condition() { + @Override + public boolean value(String s) { + return myCaseInsensitiveMatcher.isStartMatch(s); + } + }); + } + @Override public boolean prefixMatches(@NotNull final String name) { return myMatcher.matches(name); @@ -53,7 +73,7 @@ public class CamelHumpMatcher extends PrefixMatcher { return true; } if (itemCaseInsensitive && CodeInsightSettings.ALL != CodeInsightSettings.getInstance().COMPLETION_CASE_SENSITIVE) { - if (createMatcher(false).matches(name)) { + if (myCaseInsensitiveMatcher.matches(name)) { return true; } }