diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/AbstractExpectedTypeSkipper.java b/java/java-impl/src/com/intellij/codeInsight/completion/AbstractExpectedTypeSkipper.java index 69937b2bc077..63e1a53ff0b4 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/AbstractExpectedTypeSkipper.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/AbstractExpectedTypeSkipper.java @@ -47,7 +47,8 @@ public class AbstractExpectedTypeSkipper extends CompletionPreselectSkipper { private static Result getSkippingStatus(final LookupElement item, final CompletionLocation location) { if (location.getCompletionType() != CompletionType.SMART && !hasEmptyPrefix(location)) return Result.ACCEPT; - final PsiExpression expression = PsiTreeUtil.getParentOfType(location.getCompletionParameters().getPosition(), PsiExpression.class); + CompletionParameters parameters = location.getCompletionParameters(); + PsiExpression expression = PsiTreeUtil.getParentOfType(parameters.getPosition(), PsiExpression.class); if (!(expression instanceof PsiNewExpression)) return Result.ACCEPT; final Object object = item.getObject(); @@ -88,7 +89,10 @@ public class AbstractExpectedTypeSkipper extends CompletionPreselectSkipper { if (toImplement > 0) return Result.ACCEPT; - if (psiClass.hasModifierProperty(PsiModifier.ABSTRACT)) return Result.ABSTRACT; + if (psiClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + if (toImplement == 0 && parameters.getCompletionType() == CompletionType.BASIC) return Result.ACCEPT; + return Result.ABSTRACT; + } if (!isDefaultType && CommonClassNames.JAVA_LANG_STRING.equals(psiClass.getQualifiedName())) return Result.STRING; if (CommonClassNames.JAVA_LANG_OBJECT.equals(psiClass.getQualifiedName())) return Result.NON_DEFAULT; diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/SelectAbstractClassWithNoAbstractMethods.java b/java/java-tests/testData/codeInsight/completion/normalSorting/SelectAbstractClassWithNoAbstractMethods.java new file mode 100644 index 000000000000..cdfe29d00000 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/SelectAbstractClassWithNoAbstractMethods.java @@ -0,0 +1,24 @@ +class PopupThirdItem { + { + setListener(new ); + } + + void setListener(Listener listener) {} +} + +interface Listener { + void methodA(); + void methodB(); + void methodC(); +} + +abstract class AbstractListener implements Listener { + @Override + public void methodA() {} + + @Override + public void methodB() {} + + @Override + public void methodC() {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionOrderingTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionOrderingTest.groovy index c674f7867c40..6c6bddbbb2f7 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -387,8 +387,6 @@ interface TxANotAnno {} final LookupImpl lookup = invokeCompletion("/../smartTypeSorting/JComponentAddNew.java") assertPreferredItems(0, "FooBean3", "JComponent", "Component") incUseCount(lookup, 2) //Component - assertPreferredItems(1, "Component", "FooBean3", "JComponent") - incUseCount(lookup, 0) //Component assertPreferredItems(0, "Component", "FooBean3", "JComponent") } @@ -875,6 +873,10 @@ class Foo { checkPreferredItems 0, 'addInt', 'append', 'c', 'd', 'mayCallManyTimes', 'putLong' } + void testSelectAbstractClassWithNoAbstractMethods() { + checkPreferredItems 0, 'AbstractListener', 'Listener' + } + void testPreferPrintln() { myFixture.configureByText 'a.java', 'class Foo { { System.out.prix } }' myFixture.completeBasic()