diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/PreferAbstractWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/DispreferImplementationsWeigher.java similarity index 59% rename from java/java-impl/src/com/intellij/codeInsight/completion/PreferAbstractWeigher.java rename to java/java-impl/src/com/intellij/codeInsight/completion/DispreferImplementationsWeigher.java index 7f121d4a2dea..7de50008b2b9 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferAbstractWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/DispreferImplementationsWeigher.java @@ -16,35 +16,25 @@ package com.intellij.codeInsight.completion; import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.patterns.PsiJavaPatterns; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; /** * @author peter */ -public class PreferAbstractWeigher extends CompletionWeigher { +public class DispreferImplementationsWeigher extends CompletionWeigher { public Comparable weigh(@NotNull final LookupElement item, @NotNull final CompletionLocation location) { - if (location.getCompletionType() != CompletionType.SMART) { - return null; - } - - final PsiElement position = location.getCompletionParameters().getPosition(); - final PsiElement parent = position.getParent(); - if (!(parent instanceof PsiJavaCodeReferenceElement) || - !(parent.getParent() instanceof PsiTypeElement) || - !(parent.getParent().getParent() instanceof PsiInstanceOfExpression)) { - return null; - } - final Object object = item.getObject(); if (object instanceof PsiClass) { - final PsiClass aClass = (PsiClass)object; - if (aClass.isInterface()) { - return 2; + if (PsiJavaPatterns.psiElement().afterLeaf(PsiKeyword.NEW).accepts(location.getCompletionParameters().getPosition())) { + return 0; } - if (aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { - return 1; + + final String qname = ((PsiClass)object).getQualifiedName(); + if (qname != null && qname.endsWith("Impl")) { + return -1; } } 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 352a255c6dc7..c9b165718d8b 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 @@ -41,6 +41,13 @@ public class ExplicitlyImportedWeigher extends ProximityWeigher { if (position == null){ return null; } + + final PsiFile elementFile = element.getContainingFile(); + final PsiFile positionFile = position.getContainingFile(); + if (positionFile != null && elementFile != null && positionFile.getOriginalFile().equals(elementFile.getOriginalFile())) { + return true; + } + if (element instanceof PsiClass) { final String qname = ((PsiClass) element).getQualifiedName(); if (qname != null) { diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/DispreferImpls.java b/java/java-tests/testData/codeInsight/completion/normalSorting/DispreferImpls.java new file mode 100644 index 000000000000..f385d4d4ecf5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/DispreferImpls.java @@ -0,0 +1,11 @@ +public class Aaaaaaa { + private final String aaa; + + Aaaaaaa(Object aabbb) { + Xx + } + +} + +class XxxImpl {} +class Xxy {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/DontDispreferImplsAfterNew.java b/java/java-tests/testData/codeInsight/completion/normalSorting/DontDispreferImplsAfterNew.java new file mode 100644 index 000000000000..b55dc4e18219 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/DontDispreferImplsAfterNew.java @@ -0,0 +1,11 @@ +public class Aaaaaaa { + private final String aaa; + + Aaaaaaa(Object aabbb) { + new Xx + } + +} + +class XxxImpl {} +class Xxy {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/completion/smartTypeSorting/PreferInterfaces.java b/java/java-tests/testData/codeInsight/completion/smartTypeSorting/PreferInterfaces.java deleted file mode 100644 index c0b42e609d3e..000000000000 --- a/java/java-tests/testData/codeInsight/completion/smartTypeSorting/PreferInterfaces.java +++ /dev/null @@ -1,14 +0,0 @@ -package zzzzz; - -public class Holder { - { - Foo foo = null; - if (foo instanceof ) - } - -} - -interface Foo {} -interface IFoo extends Foo {} -abstract class Goo implements IFoo {} -class Bar extends Goo {} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.java index 886c1ee6558a..a346afe71cb5 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/HeavyNormalCompletionTest.java @@ -63,8 +63,8 @@ public class HeavyNormalCompletionTest extends CompletionTestCase{ LookupImpl lookup = (LookupImpl)LookupManager.getActiveLookup(myEditor); myItems = lookup.getItems().toArray(LookupElement.EMPTY_ARRAY); assertEquals(2, myItems.length); - assertEquals("AxBxCxDxEx", myItems[0].getLookupString()); - assertEquals("AyByCyDyEy", myItems[1].getLookupString()); + assertEquals("AxBxCxDxEx", myItems[1].getLookupString()); + assertEquals("AyByCyDyEy", myItems[0].getLookupString()); } } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.java index 7e0958540ef8..eb12841955b6 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.java @@ -4,8 +4,9 @@ package com.intellij.codeInsight.completion; -import com.intellij.codeInsight.lookup.impl.LookupImpl; import com.intellij.codeInsight.CodeInsightSettings; +import com.intellij.codeInsight.lookup.impl.LookupImpl; +import com.intellij.openapi.vfs.VfsUtil; import com.intellij.psi.PsiMethod; @SuppressWarnings({"ALL"}) @@ -105,6 +106,16 @@ public class NormalCompletionOrderingTest extends CompletionSortingTestCase { checkPreferredItems(0, "aabbb", "aaa"); } + public void testDispreferImpls() throws Throwable { + VfsUtil.saveText(getSourceRoot().createChildDirectory(this, "foo").createChildData(this, "Xxx.java"), "package foo; public class Xxx {}"); + checkPreferredItems(0, "Xxy", "Xxx", "XxxImpl"); + } + + public void testDontDispreferImplsAfterNew() throws Throwable { + VfsUtil.saveText(getSourceRoot().createChildDirectory(this, "foo").createChildData(this, "Xxx.java"), "package foo; public class Xxx {}"); + checkPreferredItems(0, "XxxImpl", "Xxy", "Xxx"); + } + public void testPreferLessParameters() throws Throwable { checkPreferredItems(0, "foo", "foo", "foo", "fox"); assertEquals(0, ((PsiMethod)myItems[0].getObject()).getParameterList().getParametersCount()); diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.java index 6b54d620eeb7..941230f43c37 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartTypeCompletionOrderingTest.java @@ -203,10 +203,6 @@ public class SmartTypeCompletionOrderingTest extends CompletionSortingTestCase { checkPreferredItems(0, "Goo", "InnerGoo", "Bar", "AGoo"); } - public void testPreferInterfaces() throws Throwable { - checkPreferredItems(0, "IFoo", "Goo", "Bar"); - } - public void testLocalVariablesOutweighStats() throws Throwable { final LookupImpl lookup = invokeCompletion(BASE_PATH + "/" + getTestName(false) + ".java"); assertPreferredItems(0, "foo", "param", "this", "bar", "goo"); diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 7f499a5444fc..b472d5100535 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -800,10 +800,10 @@ - + order="after implementations"/>