diff --git a/java/java-impl/src/com/intellij/psi/util/proximity/ExplicitlyImportedWeigher.java b/java/java-impl/src/com/intellij/psi/util/proximity/ExplicitlyImportedWeigher.java index 53c059e95aa8..516b6cf27ae9 100644 --- a/java/java-impl/src/com/intellij/psi/util/proximity/ExplicitlyImportedWeigher.java +++ b/java/java-impl/src/com/intellij/psi/util/proximity/ExplicitlyImportedWeigher.java @@ -24,6 +24,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.util.ProximityLocation; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.NotNullFunction; import com.intellij.util.NullableFunction; @@ -58,9 +59,11 @@ public class ExplicitlyImportedWeigher extends ProximityWeigher { if (importList == null) return Collections.emptyList(); List importedNames = ContainerUtil.newArrayList(); - for (final PsiImportStatement importStatement : importList.getImportStatements()) { - ContainerUtil.addIfNotNull(importedNames, importStatement.getQualifiedName()); + for (PsiImportStatementBase statement : importList.getAllImportStatements()) { + PsiJavaCodeReferenceElement reference = statement.getImportReference(); + ContainerUtil.addIfNotNull(importedNames, reference == null ? null : reference.getQualifiedName()); } + return importedNames; } }); @@ -126,6 +129,11 @@ public class ExplicitlyImportedWeigher extends ProximityWeigher { } if (element instanceof PsiMember) { + String qname = PsiUtil.getMemberQualifiedName((PsiMember)element); + if (qname != null && PLACE_IMPORTED_NAMES.getValue(location).contains(qname)) { + return 400; + } + final PsiPackage placePackage = PLACE_PACKAGE.getValue(location); if (placePackage != null) { Module elementModule = ModuleUtilCore.findModuleForPsiElement(element); diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/PreferExplicitlyImportedStaticMembers.java b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferExplicitlyImportedStaticMembers.java new file mode 100644 index 000000000000..a43bac76367c --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferExplicitlyImportedStaticMembers.java @@ -0,0 +1,8 @@ +import static ContainerUtil.newHashSet; + +public class TestClass { + public static void main(String[] args) { + newHashSet(); + newHashSet + } +} \ 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 f7cfbcc491b4..be5f695f72a7 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -758,4 +758,19 @@ interface TxANotAnno {} checkPreferredItems 0, 'false', 'factory' } + public void testPreferExplicitlyImportedStaticMembers() { + myFixture.addClass(""" +class ContainerUtilRt { + static void newHashSet(); + static void newHashSet2(); +} +class ContainerUtil extends ContainerUtilRt { + static void newHashSet(); + static void newHashSet3(); +} +""") + checkPreferredItems 0, 'newHashSet', 'newHashSet', 'newHashSet3', 'newHashSet2' + assert (myFixture.lookupElements[0].psiElement as PsiMethod).containingClass.name == 'ContainerUtil' + } + }