[performancePlugin] command supports implementation detail plugins
[idea/community.git] / java / java-psi-api / src / com / intellij / patterns / PsiAnnotationPattern.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.patterns;
3
4 import com.intellij.psi.PsiAnnotation;
5 import com.intellij.psi.PsiArrayInitializerMemberValue;
6 import com.intellij.psi.PsiElement;
7 import com.intellij.util.ProcessingContext;
8 import org.jetbrains.annotations.NonNls;
9 import org.jetbrains.annotations.NotNull;
10
11 import static com.intellij.patterns.PsiJavaPatterns.psiNameValuePair;
12
13 /**
14  * @author peter
15  */
16 public final class PsiAnnotationPattern extends PsiElementPattern<PsiAnnotation, PsiAnnotationPattern> {
17   static final PsiAnnotationPattern PSI_ANNOTATION_PATTERN = new PsiAnnotationPattern();
18
19   private PsiAnnotationPattern() {
20     super(PsiAnnotation.class);
21   }
22
23   public PsiAnnotationPattern qName(final ElementPattern<String> pattern) {
24     return with(new PatternCondition<PsiAnnotation>("qName") {
25       @Override
26       public boolean accepts(@NotNull final PsiAnnotation psiAnnotation, final ProcessingContext context) {
27         return pattern.accepts(psiAnnotation.getQualifiedName(), context);
28       }
29     });
30   }
31   public PsiAnnotationPattern qName(@NonNls final String qname) {
32     return with(new PatternCondition<PsiAnnotation>("qName") {
33       @Override
34       public boolean accepts(@NotNull final PsiAnnotation psiAnnotation, final ProcessingContext context) {
35         return psiAnnotation.hasQualifiedName(qname);
36       }
37     });
38   }
39
40   public PsiAnnotationPattern insideAnnotationAttribute(@NotNull final String attributeName, @NotNull final ElementPattern<? extends PsiAnnotation> parentAnnoPattern) {
41     return with(new PatternCondition<PsiAnnotation>("insideAnnotationAttribute") {
42       final PsiNameValuePairPattern attrPattern = psiNameValuePair().withName(attributeName).withSuperParent(2, parentAnnoPattern);
43
44       @Override
45       public boolean accepts(@NotNull PsiAnnotation annotation, ProcessingContext context) {
46         PsiElement attr = getParentElement(annotation);
47         if (attr instanceof PsiArrayInitializerMemberValue) attr = getParentElement(attr);
48         return attrPattern.accepts(attr);
49       }
50     });
51   }
52
53   private PsiElement getParentElement(@NotNull PsiElement element) {
54     return getParent(element);
55   }
56 }