From 1c977bd5dd591c3b994ed1d0b9292e1c90635139 Mon Sep 17 00:00:00 2001 From: peter Date: Sat, 13 May 2017 07:48:27 +0200 Subject: [PATCH] IDEA-170406 Prefer expected enum constants in annotation attribute, despite statistics --- .../completion/JavaCompletionStatistician.java | 13 +++++++++++++ ...erExpectedEnumConstantInAnnotationAttribute.java | 3 +++ .../completion/NormalCompletionOrderingTest.groovy | 9 +++++++++ 3 files changed, 25 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/completion/normalSorting/PreferExpectedEnumConstantInAnnotationAttribute.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java index 0156a5fb1a07..762ee099f40c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionStatistician.java @@ -22,6 +22,8 @@ import com.intellij.patterns.ElementPattern; import com.intellij.psi.*; import com.intellij.psi.statistics.JavaStatisticsManager; import com.intellij.psi.statistics.StatisticsInfo; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.Nullable; import static com.intellij.patterns.PsiJavaPatterns.psiElement; @@ -50,12 +52,23 @@ public class JavaCompletionStatistician extends CompletionStatistician{ } ExpectedTypeInfo firstInfo = getExpectedTypeInfo(location); + if (firstInfo != null && isInEnumAnnotationParameter(position, firstInfo)) { + return StatisticsInfo.EMPTY; + } + if (o instanceof PsiClass) { return getClassInfo((PsiClass)o, position, firstInfo); } return getFieldOrMethodInfo((PsiMember)o, element, firstInfo); } + private static boolean isInEnumAnnotationParameter(PsiElement position, ExpectedTypeInfo firstInfo) { + if (PsiTreeUtil.getParentOfType(position, PsiNameValuePair.class) == null) return false; + + PsiClass expectedClass = PsiUtil.resolveClassInType(firstInfo.getType()); + return expectedClass != null && expectedClass.isEnum(); + } + @Nullable private static ExpectedTypeInfo getExpectedTypeInfo(CompletionLocation location) { ExpectedTypeInfo[] infos = JavaCompletionUtil.EXPECTED_TYPES.getValue(location); diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/PreferExpectedEnumConstantInAnnotationAttribute.java b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferExpectedEnumConstantInAnnotationAttribute.java new file mode 100644 index 000000000000..38f2222fc098 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferExpectedEnumConstantInAnnotationAttribute.java @@ -0,0 +1,3 @@ +@interface Anno { MyEnum value(); } +enum MyEnum { foo, bar } +@Anno(value=) \ 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 0b49e6240790..247d98e605c6 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -781,4 +781,13 @@ class ContainerUtil extends ContainerUtilRt { checkPreferredItems 0, 'Point.JSON', 'JSON' } + void testPreferExpectedEnumConstantInAnnotationAttribute() { + checkPreferredItems 0, 'MyEnum.bar', 'MyEnum', 'MyEnum.foo' + def unrelatedItem = myFixture.lookupElementStrings.findIndexOf { it.contains('Throwable') } + incUseCount(lookup, unrelatedItem) + //nothing should change + assertPreferredItems 0, 'MyEnum.bar', 'MyEnum', 'MyEnum.foo' + + } + }