diff --git a/java/java-psi-api/src/com/intellij/patterns/PsiAnnotationPattern.java b/java/java-psi-api/src/com/intellij/patterns/PsiAnnotationPattern.java index b80b5da4bf2d..f4234d9210b4 100644 --- a/java/java-psi-api/src/com/intellij/patterns/PsiAnnotationPattern.java +++ b/java/java-psi-api/src/com/intellij/patterns/PsiAnnotationPattern.java @@ -16,15 +16,21 @@ package com.intellij.patterns; import com.intellij.psi.PsiAnnotation; +import com.intellij.psi.PsiArrayInitializerMemberValue; +import com.intellij.psi.PsiElement; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import static com.intellij.patterns.PsiJavaPatterns.psiNameValuePair; + /** * @author peter */ public class PsiAnnotationPattern extends PsiElementPattern { - protected PsiAnnotationPattern() { + static final PsiAnnotationPattern PSI_ANNOTATION_PATTERN = new PsiAnnotationPattern(); + + private PsiAnnotationPattern() { super(PsiAnnotation.class); } @@ -38,4 +44,17 @@ public class PsiAnnotationPattern extends PsiElementPattern parentAnnoPattern) { + return with(new PatternCondition("insideAnnotationAttribute") { + final PsiNameValuePairPattern attrPattern = psiNameValuePair().withName(attributeName).withSuperParent(2, parentAnnoPattern); + + @Override + public boolean accepts(@NotNull PsiAnnotation annotation, ProcessingContext context) { + PsiElement attr = getParent(annotation); + if (attr instanceof PsiArrayInitializerMemberValue) attr = getParent(attr); + return attrPattern.accepts(attr); + } + }); + } } diff --git a/java/java-psi-api/src/com/intellij/patterns/PsiJavaPatterns.java b/java/java-psi-api/src/com/intellij/patterns/PsiJavaPatterns.java index 93676f373d31..563bfeab2ca8 100644 --- a/java/java-psi-api/src/com/intellij/patterns/PsiJavaPatterns.java +++ b/java/java-psi-api/src/com/intellij/patterns/PsiJavaPatterns.java @@ -144,11 +144,11 @@ public class PsiJavaPatterns extends StandardPatterns{ } public static PsiAnnotationPattern psiAnnotation() { - return new PsiAnnotationPattern(); + return PsiAnnotationPattern.PSI_ANNOTATION_PATTERN; } public static PsiNameValuePairPattern psiNameValuePair() { - return new PsiNameValuePairPattern(); + return PsiNameValuePairPattern.NAME_VALUE_PAIR_PATTERN; } public static PsiTypePattern psiType() { diff --git a/java/java-psi-api/src/com/intellij/patterns/PsiNameValuePairPattern.java b/java/java-psi-api/src/com/intellij/patterns/PsiNameValuePairPattern.java index 9612c87b7e1c..041148b6fe6d 100644 --- a/java/java-psi-api/src/com/intellij/patterns/PsiNameValuePairPattern.java +++ b/java/java-psi-api/src/com/intellij/patterns/PsiNameValuePairPattern.java @@ -25,7 +25,9 @@ import org.jetbrains.annotations.NotNull; * @author peter */ public class PsiNameValuePairPattern extends PsiElementPattern { - protected PsiNameValuePairPattern() { + static final PsiNameValuePairPattern NAME_VALUE_PAIR_PATTERN = new PsiNameValuePairPattern(); + + private PsiNameValuePairPattern() { super(PsiNameValuePair.class); }