From f8d1f220b83b9814dff472f1b127b8684560300b Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 28 Jun 2012 19:56:18 +0200 Subject: [PATCH] local members are more preferrable than global static ones --- .../completion/JavaCompletionContributor.java | 20 ++++- .../completion/JavaCompletionUtil.java | 2 +- ...GlobalMemberNameCompletionContributor.java | 84 ------------------- .../completion/JavaStaticMemberProcessor.java | 69 +++++++++++++++ ...ariablesLiteralsAndAnnoMethodsWeigher.java | 9 +- .../filters/getters/JavaMembersGetter.java | 2 +- ...eferLocalsToStaticsInSecondCompletion.java | 7 ++ .../NormalCompletionOrderingTest.groovy | 10 ++- resources/src/META-INF/IdeaPlugin.xml | 2 - 9 files changed, 111 insertions(+), 94 deletions(-) delete mode 100644 java/java-impl/src/com/intellij/codeInsight/completion/JavaGlobalMemberNameCompletionContributor.java create mode 100644 java/java-impl/src/com/intellij/codeInsight/completion/JavaStaticMemberProcessor.java create mode 100644 java/java-tests/testData/codeInsight/completion/normalSorting/PreferLocalsToStaticsInSecondCompletion.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index 062b3f443994..a5052d78bc29 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -22,7 +22,7 @@ import com.intellij.codeInsight.hint.ShowParameterInfoHandler; import com.intellij.codeInsight.lookup.*; import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.lang.LangBundle; -import com.intellij.lang.StdLanguages; +import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; @@ -208,7 +208,7 @@ public class JavaCompletionContributor extends CompletionContributor { } final PsiElement position = parameters.getPosition(); - if (!position.getContainingFile().getLanguage().isKindOf(StdLanguages.JAVA)) { + if (!position.getContainingFile().getLanguage().isKindOf(JavaLanguage.INSTANCE)) { return; } @@ -230,8 +230,9 @@ public class JavaCompletionContributor extends CompletionContributor { new TypeArgumentCompletionProvider(false, inheritors).addCompletions(parameters, new ProcessingContext(), result); } + PrefixMatcher matcher = result.getPrefixMatcher(); if (JavaSmartCompletionContributor.AFTER_NEW.accepts(position)) { - new JavaInheritorsGetter(ConstructorInsertHandler.BASIC_INSTANCE).generateVariants(parameters, result.getPrefixMatcher(), inheritors); + new JavaInheritorsGetter(ConstructorInsertHandler.BASIC_INSTANCE).generateVariants(parameters, matcher, inheritors); } if (IMPORT_REFERENCE.accepts(position)) { @@ -250,6 +251,19 @@ public class JavaCompletionContributor extends CompletionContributor { } addAllClasses(parameters, result, inheritors); + + final PsiElement parent = position.getParent(); + if (parent instanceof PsiReferenceExpression && + !((PsiReferenceExpression)parent).isQualified() && + parameters.isExtendedCompletion() && + StringUtil.isNotEmpty(matcher.getPrefix())) { + new JavaStaticMemberProcessor(parameters).processStaticMethodsGlobally(matcher, new Consumer() { + @Override + public void consume(LookupElement element) { + result.addElement(element); + } + }); + } result.stopHere(); } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index 04243dab1710..65f40e0f00d6 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -464,7 +464,7 @@ public class JavaCompletionUtil { } if (javaReference instanceof PsiJavaCodeReferenceElement && !((PsiJavaCodeReferenceElement)javaReference).isQualified()) { - final StaticMemberProcessor memberProcessor = JavaGlobalMemberNameCompletionContributor.completeStaticMembers(parameters); + final StaticMemberProcessor memberProcessor = new JavaStaticMemberProcessor(parameters); memberProcessor.processMembersOfRegisteredClasses(matcher, new PairConsumer() { @Override public void consume(PsiMember member, PsiClass psiClass) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaGlobalMemberNameCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaGlobalMemberNameCompletionContributor.java deleted file mode 100644 index cad821ea1fde..000000000000 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaGlobalMemberNameCompletionContributor.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.intellij.codeInsight.completion; - -import com.intellij.codeInsight.lookup.AutoCompletionPolicy; -import com.intellij.codeInsight.lookup.LookupElement; -import com.intellij.codeInsight.lookup.VariableLookupItem; -import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.Consumer; -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -/** - * @author peter - */ -public class JavaGlobalMemberNameCompletionContributor extends CompletionContributor { - - @Override - public void fillCompletionVariants(CompletionParameters parameters, final CompletionResultSet result) { - if (!parameters.isExtendedCompletion()) { - return; - } - - if (result.getPrefixMatcher().getPrefix().length() == 0) { - return; - } - - final PsiElement position = parameters.getPosition(); - final PsiElement parent = position.getParent(); - if (!(parent instanceof PsiReferenceExpression)) { - return; - } - final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)parent; - if (referenceExpression.isQualified()) { - return; - } - - completeStaticMembers(parameters).processStaticMethodsGlobally(result.getPrefixMatcher(), new Consumer() { - @Override - public void consume(LookupElement element) { - result.addElement(element); - } - }); - } - - public static StaticMemberProcessor completeStaticMembers(CompletionParameters parameters) { - final PsiElement position = parameters.getPosition(); - final PsiElement originalPosition = parameters.getOriginalPosition(); - final StaticMemberProcessor processor = new StaticMemberProcessor(position) { - @NotNull - @Override - protected LookupElement createLookupElement(@NotNull PsiMember member, @NotNull final PsiClass containingClass, boolean shouldImport) { - shouldImport |= originalPosition != null && PsiTreeUtil.isAncestor(containingClass, originalPosition, false); - - if (member instanceof PsiMethod) { - return AutoCompletionPolicy.NEVER_AUTOCOMPLETE.applyPolicy(new JavaMethodCallElement((PsiMethod)member, shouldImport, false)); - } - return AutoCompletionPolicy.NEVER_AUTOCOMPLETE.applyPolicy(new VariableLookupItem((PsiField)member, shouldImport)); - } - - @Override - protected LookupElement createLookupElement(@NotNull List overloads, - @NotNull PsiClass containingClass, - boolean shouldImport) { - shouldImport |= originalPosition != null && PsiTreeUtil.isAncestor(containingClass, originalPosition, false); - - final JavaMethodCallElement element = new JavaMethodCallElement(overloads.get(0), shouldImport, true); - element.putUserData(JavaCompletionUtil.ALL_METHODS_ATTRIBUTE, overloads); - return element; - } - }; - final PsiFile file = position.getContainingFile(); - if (file instanceof PsiJavaFile) { - final PsiImportList importList = ((PsiJavaFile)file).getImportList(); - if (importList != null) { - for (PsiImportStaticStatement statement : importList.getImportStaticStatements()) { - processor.importMembersOf(statement.resolveTargetClass()); - } - } - } - - return processor; - } -} diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaStaticMemberProcessor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaStaticMemberProcessor.java new file mode 100644 index 000000000000..224fa3e4e24d --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaStaticMemberProcessor.java @@ -0,0 +1,69 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInsight.completion; + +import com.intellij.codeInsight.lookup.AutoCompletionPolicy; +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.VariableLookupItem; +import com.intellij.psi.*; +import com.intellij.psi.util.PsiTreeUtil; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** +* @author peter +*/ +public class JavaStaticMemberProcessor extends StaticMemberProcessor { + private final PsiElement myOriginalPosition; + + public JavaStaticMemberProcessor(CompletionParameters parameters) { + super(parameters.getPosition()); + myOriginalPosition = parameters.getOriginalPosition(); + + final PsiFile file = parameters.getPosition().getContainingFile(); + if (file instanceof PsiJavaFile) { + final PsiImportList importList = ((PsiJavaFile)file).getImportList(); + if (importList != null) { + for (PsiImportStaticStatement statement : importList.getImportStaticStatements()) { + importMembersOf(statement.resolveTargetClass()); + } + } + } + } + + @NotNull + @Override + protected LookupElement createLookupElement(@NotNull PsiMember member, @NotNull final PsiClass containingClass, boolean shouldImport) { + shouldImport |= myOriginalPosition != null && PsiTreeUtil.isAncestor(containingClass, myOriginalPosition, false); + + if (member instanceof PsiMethod) { + return AutoCompletionPolicy.NEVER_AUTOCOMPLETE.applyPolicy(new JavaMethodCallElement((PsiMethod)member, shouldImport, false)); + } + return AutoCompletionPolicy.NEVER_AUTOCOMPLETE.applyPolicy(new VariableLookupItem((PsiField)member, shouldImport)); + } + + @Override + protected LookupElement createLookupElement(@NotNull List overloads, + @NotNull PsiClass containingClass, + boolean shouldImport) { + shouldImport |= myOriginalPosition != null && PsiTreeUtil.isAncestor(containingClass, myOriginalPosition, false); + + final JavaMethodCallElement element = new JavaMethodCallElement(overloads.get(0), shouldImport, true); + element.putUserData(JavaCompletionUtil.ALL_METHODS_ATTRIBUTE, overloads); + return element; + } +} 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 d64ab398b42a..e73261a3e6d9 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferLocalVariablesLiteralsAndAnnoMethodsWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferLocalVariablesLiteralsAndAnnoMethodsWeigher.java @@ -53,7 +53,7 @@ public class PreferLocalVariablesLiteralsAndAnnoMethodsWeigher extends LookupEle expectedTypeMember, nonInitialized, classLiteral, - className, + classNameOrGlobalStatic, } @NotNull @@ -105,6 +105,11 @@ public class PreferLocalVariablesLiteralsAndAnnoMethodsWeigher extends LookupEle } if (myCompletionType == CompletionType.BASIC) { + StaticallyImportable callElement = item.as(StaticallyImportable.CLASS_CONDITION_KEY); + if (callElement != null && callElement.canBeImported() && !callElement.willBeImported()) { + return MyResult.classNameOrGlobalStatic; + } + if (object instanceof PsiKeyword && PsiKeyword.CLASS.equals(item.getLookupString())) { return MyResult.classLiteral; } @@ -114,7 +119,7 @@ public class PreferLocalVariablesLiteralsAndAnnoMethodsWeigher extends LookupEle } if (object instanceof PsiClass) { - return MyResult.className; + return MyResult.classNameOrGlobalStatic; } if (object instanceof PsiField && myNonInitializedFields.contains(object)) { diff --git a/java/java-impl/src/com/intellij/psi/filters/getters/JavaMembersGetter.java b/java/java-impl/src/com/intellij/psi/filters/getters/JavaMembersGetter.java index fb076b9683be..bd425957fcc5 100644 --- a/java/java-impl/src/com/intellij/psi/filters/getters/JavaMembersGetter.java +++ b/java/java-impl/src/com/intellij/psi/filters/getters/JavaMembersGetter.java @@ -45,7 +45,7 @@ public class JavaMembersGetter extends MembersGetter { } public void addMembers(CompletionParameters parameters, boolean searchInheritors, final Consumer results) { - final StaticMemberProcessor processor = JavaGlobalMemberNameCompletionContributor.completeStaticMembers(parameters); + final StaticMemberProcessor processor = new JavaStaticMemberProcessor(parameters); final PsiElement position = parameters.getPosition(); if (myExpectedType instanceof PsiPrimitiveType && PsiType.DOUBLE.isAssignableFrom(myExpectedType)) { addConstantsFromTargetClass(position, results, searchInheritors, processor); diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/PreferLocalsToStaticsInSecondCompletion.java b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferLocalsToStaticsInSecondCompletion.java new file mode 100644 index 000000000000..d12688f6d32e --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferLocalsToStaticsInSecondCompletion.java @@ -0,0 +1,7 @@ +class Util { + void foox() { + int fooy; + foo + } + +} \ No newline at end of file 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 05afbdf21c13..0f73a23f289f 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -206,7 +206,7 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { } public void testLocalVarsOverMethods() { - checkPreferredItems(0, "value", "valueOf"); + checkPreferredItems(0, "value", "validate", "validateTree", "valueOf"); } public void testCurrentClassBest() { @@ -370,4 +370,12 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { checkPreferredItems 0, 'Calendar', 'Calendar.FIELD_COUNT' } + public void testPreferLocalsToStaticsInSecondCompletion() { + myFixture.addClass('public class FooZoo { public static void fooBar() {} }') + myFixture.addClass('public class fooAClass {}') + configureNoCompletion(getTestName(false) + ".java"); + myFixture.complete(CompletionType.BASIC, 2); + assertPreferredItems(0, 'fooy', 'foox', 'fooAClass', 'fooBar'); + } + } diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 71164c9ec776..1c988355c824 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -241,8 +241,6 @@ order="before javaLegacy"/> -