From 3241305b74f074e3db2df86fc76f411adfee42dd Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 17 Jul 2015 14:56:44 +0200 Subject: [PATCH] IDEA-142746 Completion should prefer local variable, not equals() --- .../completion/JavaCompletionSorting.java | 2 +- .../completion/PreferByKindWeigher.java | 54 ++++++++++--------- .../PreferLocalToExpectedTypedMethod.java | 5 ++ .../NormalCompletionOrderingTest.groovy | 4 ++ .../completion/NormalCompletionTest.groovy | 1 + 5 files changed, 40 insertions(+), 26 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normalSorting/PreferLocalToExpectedTypedMethod.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java index 9fe5d5ab806f..05d574bd2495 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionSorting.java @@ -76,10 +76,10 @@ public class JavaCompletionSorting { if (!smart) { ContainerUtil.addIfNotNull(afterPrefix, preferStatics(position, expectedTypes)); } + afterPrefix.add(new PreferByKindWeigher(type, position)); if (!smart && !afterNew) { afterPrefix.add(new PreferExpected(false, expectedTypes)); } - afterPrefix.add(new PreferByKindWeigher(type, position)); ContainerUtil.addIfNotNull(afterPrefix, recursion(parameters, expectedTypes)); Collections.addAll(afterPrefix, new PreferSimilarlyEnding(expectedTypes), new PreferNonGeneric(), new PreferAccessible(position), new PreferSimple()); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java index f5c34b6caa33..f8b5bac76b4d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java @@ -38,6 +38,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Set; +import static com.intellij.patterns.PsiJavaPatterns.elementType; import static com.intellij.patterns.PsiJavaPatterns.psiElement; import static com.intellij.patterns.StandardPatterns.or; @@ -173,6 +174,9 @@ public class PreferByKindWeigher extends LookupElementWeigher { if (PsiKeyword.INTERFACE.equals(keyword) && psiElement().afterLeaf("@").accepts(myPosition)) { return MyResult.improbableKeyword; } + if (PsiKeyword.NULL.equals(keyword) && psiElement().afterLeaf(psiElement().withElementType(elementType().oneOf(JavaTokenType.EQEQ, JavaTokenType.NE))).accepts(myPosition)) { + return MyResult.probableKeyword; + } } if (item.as(CastingLookupElementDecorator.CLASS_CONDITION_KEY) != null) { @@ -187,32 +191,32 @@ public class PreferByKindWeigher extends LookupElementWeigher { return MyResult.superMethodParameters; } + if (object instanceof PsiMethod) { + PsiClass containingClass = ((PsiMethod)object).getContainingClass(); + if (containingClass != null && CommonClassNames.JAVA_UTIL_COLLECTIONS.equals(containingClass.getQualifiedName())) { + return MyResult.collectionFactory; + } + } + Boolean expectedTypeMember = item.getUserData(MembersGetter.EXPECTED_TYPE_MEMBER); + if (expectedTypeMember != null) { + return expectedTypeMember ? (object instanceof PsiField ? MyResult.expectedTypeConstant : MyResult.expectedTypeMethod) : MyResult.classNameOrGlobalStatic; + } + final JavaChainLookupElement chain = item.as(JavaChainLookupElement.CLASS_CONDITION_KEY); + if (chain != null) { + Object qualifier = chain.getQualifier().getObject(); + if (qualifier instanceof PsiLocalVariable || qualifier instanceof PsiParameter) { + return MyResult.localOrParameter; + } + if (qualifier instanceof PsiField) { + return MyResult.qualifiedWithField; + } + if (isGetter(qualifier)) { + return MyResult.qualifiedWithGetter; + } + } + + if (myCompletionType == CompletionType.SMART) { - if (object instanceof PsiMethod) { - PsiClass containingClass = ((PsiMethod)object).getContainingClass(); - if (containingClass != null && CommonClassNames.JAVA_UTIL_COLLECTIONS.equals(containingClass.getQualifiedName())) { - return MyResult.collectionFactory; - } - } - Boolean expectedTypeMember = item.getUserData(MembersGetter.EXPECTED_TYPE_MEMBER); - if (expectedTypeMember != null) { - return expectedTypeMember ? (object instanceof PsiField ? MyResult.expectedTypeConstant : MyResult.expectedTypeMethod) : MyResult.classNameOrGlobalStatic; - } - - final JavaChainLookupElement chain = item.as(JavaChainLookupElement.CLASS_CONDITION_KEY); - if (chain != null) { - Object qualifier = chain.getQualifier().getObject(); - if (qualifier instanceof PsiLocalVariable || qualifier instanceof PsiParameter) { - return MyResult.localOrParameter; - } - if (qualifier instanceof PsiField) { - return MyResult.qualifiedWithField; - } - if (isGetter(qualifier)) { - return MyResult.qualifiedWithGetter; - } - } - if (object instanceof PsiField) return MyResult.field; if (isGetter(object)) return MyResult.getter; diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/PreferLocalToExpectedTypedMethod.java b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferLocalToExpectedTypedMethod.java new file mode 100644 index 000000000000..bd5238607d16 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferLocalToExpectedTypedMethod.java @@ -0,0 +1,5 @@ +class Foo { + public Object get(Object event) { + if (e) + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy index 5334efaf0893..c32e509252d1 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -677,4 +677,8 @@ interface TxANotAnno {} assert lookup.items[-1].lookupString == 'ritar' } + public void testPreferLocalToExpectedTypedMethod() { + checkPreferredItems 0, 'event', 'equals' + } + } 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 d589d394798c..1e79ca0a017a 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionTest.groovy @@ -1078,6 +1078,7 @@ public class ListUtils { public void testKeywordSmartEnter() { configure() + myFixture.assertPreferredCompletionItems 0, 'null', 'nullity' myFixture.performEditorAction(IdeActions.ACTION_CHOOSE_LOOKUP_ITEM_COMPLETE_STATEMENT) checkResult() }