diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java index d1166c749091..6bb6999eee23 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java @@ -30,6 +30,7 @@ import com.intellij.psi.*; import com.intellij.psi.filters.ClassFilter; import com.intellij.psi.filters.ElementFilter; import com.intellij.psi.filters.TrueFilter; +import com.intellij.psi.filters.classes.AnnotationTypeFilter; import com.intellij.psi.filters.element.ExcludeDeclaredFilter; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; @@ -85,7 +86,9 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { final PsiElement insertedElement = parameters.getPosition(); final ElementFilter filter = - IN_TYPE_PARAMETER.accepts(insertedElement) ? new ExcludeDeclaredFilter(new ClassFilter(PsiTypeParameter.class)) : TrueFilter.INSTANCE; + IN_TYPE_PARAMETER.accepts(insertedElement) ? new ExcludeDeclaredFilter(new ClassFilter(PsiTypeParameter.class)) : + JavaCompletionContributor.ANNOTATION_NAME.accepts(insertedElement) ? new AnnotationTypeFilter() : + TrueFilter.INSTANCE; final boolean inJavaContext = parameters.getPosition() instanceof PsiIdentifier; final boolean afterNew = AFTER_NEW.accepts(insertedElement); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java index 083649aeb1a6..40919bd33042 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionContributor.java @@ -39,6 +39,7 @@ import com.intellij.patterns.PsiNameValuePairPattern; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.filters.*; +import com.intellij.psi.filters.classes.AnnotationTypeFilter; import com.intellij.psi.filters.classes.AssignableFromContextFilter; import com.intellij.psi.filters.element.ExcludeDeclaredFilter; import com.intellij.psi.filters.element.ModifierFilter; @@ -75,6 +76,9 @@ public class JavaCompletionContributor extends CompletionContributor { ourCompletionData.put(LanguageLevel.JDK_1_3, new JavaCompletionData()); } + public static final ElementPattern ANNOTATION_NAME = psiElement(). + withParents(PsiJavaCodeReferenceElement.class, PsiAnnotation.class).afterLeaf("@"); + private static JavaCompletionData getCompletionData(LanguageLevel level) { final Set> entries = ourCompletionData.entrySet(); for (Map.Entry entry : entries) { @@ -113,6 +117,10 @@ public class JavaCompletionContributor extends CompletionContributor { return new AndFilter(ElementClassFilter.CLASS, new NotFilter(new AssignableFromContextFilter())); } + if (ANNOTATION_NAME.accepts(position)) { + return new AnnotationTypeFilter(); + } + if (JavaCompletionData.DECLARATION_START.accepts(position) || JavaCompletionData.isInsideParameterList(position) || psiElement().inside(psiElement(PsiJavaCodeReferenceElement.class).withParent(psiAnnotation())).accepts(position)) { diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java index 931fd9d22445..5cd2a13ee2a1 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiJavaCodeReferenceElementImpl.java @@ -24,7 +24,6 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.JavaCodeStyleSettingsFacade; import com.intellij.psi.filters.*; -import com.intellij.psi.filters.classes.AnnotationTypeFilter; import com.intellij.psi.filters.element.ModifierFilter; import com.intellij.psi.impl.CheckUtil; import com.intellij.psi.impl.DebugUtil; @@ -805,11 +804,11 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme } switch (getKind()) { case CLASS_OR_PACKAGE_NAME_KIND: - addClassFilter(filter); + filter.addFilter(ElementClassFilter.CLASS); filter.addFilter(ElementClassFilter.PACKAGE_FILTER); break; case CLASS_NAME_KIND: - addClassFilter(filter); + filter.addFilter(ElementClassFilter.CLASS); if (isQualified()) { filter.addFilter(ElementClassFilter.PACKAGE_FILTER); } @@ -867,15 +866,6 @@ public class PsiJavaCodeReferenceElementImpl extends CompositePsiElement impleme return false; } - private void addClassFilter(final OrFilter filter) { - if (getParent() instanceof PsiAnnotation) { - filter.addFilter(new AnnotationTypeFilter()); - } - else { - filter.addFilter(ElementClassFilter.CLASS); - } - } - @Override public PsiElement getReferenceNameElement() { return SourceTreeToPsiMap.treeElementToPsi(getReferenceNameNode());