From d796ecea555e1c247c5d66617816b179f1a6fc46 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 9 Mar 2012 20:36:04 +0400 Subject: [PATCH] normal methods should have higher priority than Collections.emptyList --- ...referLocalVariablesLiteralsAndAnnoMethodsWeigher.java | 9 +++++++-- .../com/intellij/psi/filters/getters/MembersGetter.java | 9 ++++++--- .../smartTypeSorting/PreferCollectionsEmptyList.java | 8 ++++++-- .../completion/SmartTypeCompletionOrderingTest.groovy | 6 +++--- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/PreferLocalVariablesLiteralsAndAnnoMethodsWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/PreferLocalVariablesLiteralsAndAnnoMethodsWeigher.java index 5899de6213c5..7c1a3b877601 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferLocalVariablesLiteralsAndAnnoMethodsWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferLocalVariablesLiteralsAndAnnoMethodsWeigher.java @@ -19,6 +19,7 @@ import com.intellij.codeInsight.completion.scope.JavaCompletionProcessor; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementWeigher; import com.intellij.psi.*; +import com.intellij.psi.filters.getters.MembersGetter; import com.intellij.psi.util.PropertyUtil; import org.jetbrains.annotations.NotNull; @@ -44,8 +45,9 @@ public class PreferLocalVariablesLiteralsAndAnnoMethodsWeigher extends LookupEle qualifiedWithField, qualifiedWithGetter, superMethodParameters, - collectionFactory, normal, + collectionFactory, + expectedTypeMember, nonInitialized, classLiteral, className, @@ -75,7 +77,10 @@ public class PreferLocalVariablesLiteralsAndAnnoMethodsWeigher extends LookupEle if (item.getUserData(CollectionsUtilityMethodsProvider.COLLECTION_FACTORY) != null) { return MyResult.collectionFactory; } - + if (Boolean.TRUE.equals(item.getUserData(MembersGetter.EXPECTED_TYPE_INHERITOR_MEMBER))) { + return MyResult.expectedTypeMember; + } + final JavaChainLookupElement chain = item.as(JavaChainLookupElement.CLASS_CONDITION_KEY); if (chain != null) { Object qualifier = chain.getQualifier().getObject(); diff --git a/java/java-impl/src/com/intellij/psi/filters/getters/MembersGetter.java b/java/java-impl/src/com/intellij/psi/filters/getters/MembersGetter.java index a6af89daad40..8923ff7ba34a 100644 --- a/java/java-impl/src/com/intellij/psi/filters/getters/MembersGetter.java +++ b/java/java-impl/src/com/intellij/psi/filters/getters/MembersGetter.java @@ -22,6 +22,7 @@ import com.intellij.codeInsight.completion.StaticMemberProcessor; import com.intellij.codeInsight.lookup.AutoCompletionPolicy; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Key; import com.intellij.psi.*; import com.intellij.psi.filters.TrueFilter; import com.intellij.psi.scope.processor.FilterScopeProcessor; @@ -43,6 +44,7 @@ import java.util.Set; * @author peter */ public abstract class MembersGetter { + public static final Key EXPECTED_TYPE_INHERITOR_MEMBER = Key.create("EXPECTED_TYPE_INHERITOR_MEMBER"); public void processMembers(@NotNull final PsiElement context, final Consumer results, @Nullable final PsiClass where, final boolean acceptMethods, boolean searchInheritors, @@ -85,7 +87,7 @@ public abstract class MembersGetter { final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(context.getProject()).getResolveHelper(); - PsiClassType baseType = JavaPsiFacade.getElementFactory(where.getProject()).createType(where); + final PsiClassType baseType = JavaPsiFacade.getElementFactory(where.getProject()).createType(where); Consumer consumer = new Consumer() { @Override public void consume(PsiType psiType) { @@ -97,7 +99,7 @@ public abstract class MembersGetter { return; } } - processClassDeclaredMembers(psiClass, context, acceptMethods, results, resolveHelper, importedStatically); + processClassDeclaredMembers(psiClass, context, acceptMethods, results, resolveHelper, importedStatically, psiType != baseType); } } }; @@ -110,7 +112,7 @@ public abstract class MembersGetter { private void processClassDeclaredMembers(PsiClass where, PsiElement context, boolean acceptMethods, - Consumer results, final PsiResolveHelper resolveHelper, final Set importedStatically) { + Consumer results, final PsiResolveHelper resolveHelper, final Set importedStatically, boolean isInheritor) { final FilterScopeProcessor processor = new FilterScopeProcessor(TrueFilter.INSTANCE); where.processDeclarations(processor, ResolveState.initial(), null, context); @@ -123,6 +125,7 @@ public abstract class MembersGetter { if (result instanceof PsiMethod && acceptMethods) continue; final LookupElement item = result instanceof PsiMethod ? createMethodElement((PsiMethod)result) : createFieldElement((PsiField)result); if (item != null) { + item.putUserData(EXPECTED_TYPE_INHERITOR_MEMBER, isInheritor); results.consume(AutoCompletionPolicy.NEVER_AUTOCOMPLETE.applyPolicy(item)); } } diff --git a/java/java-tests/testData/codeInsight/completion/smartTypeSorting/PreferCollectionsEmptyList.java b/java/java-tests/testData/codeInsight/completion/smartTypeSorting/PreferCollectionsEmptyList.java index 2770782a68bc..0b6920c6ed53 100644 --- a/java/java-tests/testData/codeInsight/completion/smartTypeSorting/PreferCollectionsEmptyList.java +++ b/java/java-tests/testData/codeInsight/completion/smartTypeSorting/PreferCollectionsEmptyList.java @@ -1,8 +1,12 @@ +import java.util.List; + public class Aaaaaaa { + List locMethod() {} + { - java.util.List local = null; - java.util.List l = + List local = null; + List l = } } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy index 2480cc6bca78..0c853406a0ab 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.groovy @@ -291,9 +291,9 @@ public class SmartTypeCompletionOrderingTest extends CompletionSortingTestCase { myFixture.addClass("package foo; public class FList implements java.util.List { public static FList emptyList() {} }"); configureNoCompletion(getTestName(false) + ".java"); myFixture.complete(CompletionType.SMART, 2); - assertPreferredItems(0, "local", "local.subList", "emptyList", "singletonList", "unmodifiableList"); - assert 'Collections.emptyList' in lookup.items[2].allLookupStrings - assert 'FList.emptyList' in lookup.items[5].allLookupStrings + assertPreferredItems(0, "local", "local.subList", "locMethod", "locMethod().subList", "emptyList", "singletonList", "unmodifiableList", "emptyList"); + assert 'Collections.emptyList' in lookup.items[4].allLookupStrings + assert 'FList.emptyList' in lookup.items[7].allLookupStrings } public void testDispreferGetterInSetterCall() {