From 4035b66f262142708d960ffc3c135641a812c96b Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 28 Jan 2016 14:37:19 +0100 Subject: [PATCH] IDEA-150909 Ambiguous class static method completion has confusing behaviour --- .../completion/JavaChainLookupElement.java | 3 +++ .../completion/JavaCompletionSorting.java | 2 +- .../completion/JavaCompletionUtil.java | 15 +++++++++++++++ .../impl/quickfix/StaticMembersProcessor.java | 17 +---------------- ...DeprecatedMethodWithUnresolvedQualifier.java | 7 +++++++ .../NormalCompletionOrderingTest.groovy | 14 ++++++++++++++ 6 files changed, 41 insertions(+), 17 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normalSorting/DispreferDeprecatedMethodWithUnresolvedQualifier.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java index 928ffe49d232..67ad744e305b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaChainLookupElement.java @@ -102,6 +102,9 @@ public class JavaChainLookupElement extends LookupElementDecorator implements Processor< if (file instanceof PsiJavaFile //do not show methods from default package && !((PsiJavaFile)file).getPackageName().isEmpty()) { - if (isEffectivelyDeprecated(member)) { + if (JavaCompletionUtil.isEffectivelyDeprecated((PsiDocCommentOwner)member)) { myDeprecated.putValue(containingClass, member); return processCondition(); } @@ -149,21 +149,6 @@ abstract class StaticMembersProcessor implements Processor< return processCondition(); } - private boolean isEffectivelyDeprecated(T member) { - if (((PsiDocCommentOwner)member).isDeprecated()) { - return true; - } - - PsiClass aClass = member.getContainingClass(); - while (aClass != null) { - if (aClass.isDeprecated()) { - return true; - } - aClass = aClass.getContainingClass(); - } - return false; - } - private boolean processCondition() { return mySuggestions.size() + myDeprecated.size() < 50; } diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/DispreferDeprecatedMethodWithUnresolvedQualifier.java b/java/java-tests/testData/codeInsight/completion/normalSorting/DispreferDeprecatedMethodWithUnresolvedQualifier.java new file mode 100644 index 000000000000..2aaf07602fae --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/DispreferDeprecatedMethodWithUnresolvedQualifier.java @@ -0,0 +1,7 @@ +public class MainClass1 { + + { + Assert.ast + } +} + 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 bb2f099d9c50..23b250eddbf3 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -721,4 +721,18 @@ interface TxANotAnno {} checkPreferredItems 0, 'unmodifiableList', 'unmodifiableCollection' } + public void testDispreferDeprecatedMethodWithUnresolvedQualifier() { + myFixture.addClass("package foo; public class Assert { public static void assertTrue() {} }") + myFixture.addClass("package bar; @Deprecated public class Assert { public static void assertTrue() {}; public static void assertTrue2() {} }") + checkPreferredItems 0, 'Assert.assertTrue', 'Assert.assertTrue', 'Assert.assertTrue2' + + def p = LookupElementPresentation.renderElement(myFixture.lookup.items[0]) + assert p.tailText.contains('foo') + assert !p.strikeout + + p = LookupElementPresentation.renderElement(myFixture.lookup.items[1]) + assert p.tailText.contains('bar') + assert p.strikeout + } + }