From 0385ecc58a89e1c2ebc3b27997e33d873699bbd1 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 25 Oct 2012 17:03:15 +0200 Subject: [PATCH] IDEA-84963 Disprefer annotations in autocomplete at places where they cannot be used --- .../codeInsight/completion/PreferByKindWeigher.java | 8 +++++++- .../PreferApplicableAnnotationsMethod.java | 6 ++++++ .../completion/NormalCompletionOrderingTest.groovy | 13 +++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/completion/normalSorting/PreferApplicableAnnotationsMethod.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java b/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java index 65e988341ead..97f03eae8ab1 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/PreferByKindWeigher.java @@ -93,7 +93,13 @@ public class PreferByKindWeigher extends LookupElementWeigher { assert annotation != null; PsiAnnotationOwner owner = annotation.getOwner(); if (owner instanceof PsiModifierList || owner instanceof PsiTypeElement || owner instanceof PsiTypeParameter) { - PsiElement member = owner instanceof PsiModifierList ? ((PsiElement)owner).getParent() : (PsiElement)owner; + PsiElement member = (PsiElement)owner; + if (member instanceof PsiModifierList) { + member = member.getParent(); + } + if (member instanceof PsiTypeElement && member.getParent() instanceof PsiMethod) { + member = member.getParent(); + } final String[] elementTypeFields = PsiAnnotationImpl.getApplicableElementTypeFields(member); return new Condition() { @Override diff --git a/java/java-tests/testData/codeInsight/completion/normalSorting/PreferApplicableAnnotationsMethod.java b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferApplicableAnnotationsMethod.java new file mode 100644 index 000000000000..345e8cccbcf0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/completion/normalSorting/PreferApplicableAnnotationsMethod.java @@ -0,0 +1,6 @@ +class Foo { + @T + public static void main(String[] args) { + + } +} \ 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 ad2ec9d61555..9b292a5f2c2e 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/NormalCompletionOrderingTest.groovy @@ -356,6 +356,19 @@ import java.lang.annotation.Target; checkPreferredItems 0, 'TMetaAnno', 'Target', 'TreeSelectionMode', 'TLocalAnno' } + public void testPreferApplicableAnnotationsMethod() throws Throwable { + myFixture.addClass ''' +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target({ElementType.TYPE}) +@interface TClassAnno {} + +@Target({ElementType.METHOD}) +@interface TMethodAnno {}''' + checkPreferredItems 0, 'TMethodAnno', 'TClassAnno' + } + public void testJComponentAddNewWithStats() throws Throwable { final LookupImpl lookup = invokeCompletion("/../smartTypeSorting/JComponentAddNew.java"); assertPreferredItems(0, "FooBean3", "JComponent", "Component");