[maven] remove unfinished quick fix
[idea/community.git] / java / java-psi-api / src / com / intellij / patterns / PsiClassPattern.java
1 // Copyright 2000-2018 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.PsiClass;
5 import com.intellij.psi.PsiField;
6 import com.intellij.psi.PsiMethod;
7 import com.intellij.psi.util.InheritanceUtil;
8 import com.intellij.util.ProcessingContext;
9 import org.jetbrains.annotations.NonNls;
10 import org.jetbrains.annotations.NotNull;
11
12 import static com.intellij.patterns.StandardPatterns.string;
13
14 /**
15  * @author peter
16  */
17 public class PsiClassPattern extends PsiMemberPattern<PsiClass, PsiClassPattern>{
18   protected PsiClassPattern() {
19     super(PsiClass.class);
20   }
21
22   public PsiClassPattern inheritorOf(final boolean strict, final PsiClassPattern pattern) {
23     return with(new PatternCondition<PsiClass>("inheritorOf") {
24       @Override
25       public boolean accepts(@NotNull PsiClass psiClass, final ProcessingContext context) {
26         return isInheritor(psiClass, pattern, context, !strict);
27       }
28     });
29   }
30
31   private static boolean isInheritor(PsiClass psiClass, ElementPattern pattern, final ProcessingContext matchingContext, boolean checkThisClass) {
32     if (psiClass == null) return false;
33     if (checkThisClass && pattern.accepts(psiClass, matchingContext)) return true;
34     if (isInheritor(psiClass.getSuperClass(), pattern, matchingContext, true)) return true;
35     for (final PsiClass aClass : psiClass.getInterfaces()) {
36       if (isInheritor(aClass, pattern, matchingContext, true)) return true;
37     }
38     return false;
39   }
40
41   public PsiClassPattern inheritorOf(final boolean strict, final String className) {
42     return with(new PatternCondition<PsiClass>("inheritorOf") {
43       @Override
44       public boolean accepts(@NotNull PsiClass psiClass, final ProcessingContext context) {
45         return InheritanceUtil.isInheritor(psiClass, strict, className);
46       }
47     });
48   }
49
50   public PsiClassPattern isInterface() {
51     return with(new PatternCondition<PsiClass>("isInterface") {
52       @Override
53       public boolean accepts(@NotNull final PsiClass psiClass, final ProcessingContext context) {
54         return psiClass.isInterface();
55       }
56     });}
57   public PsiClassPattern isAnnotationType() {
58     return with(new PatternCondition<PsiClass>("isAnnotationType") {
59       @Override
60       public boolean accepts(@NotNull final PsiClass psiClass, final ProcessingContext context) {
61         return psiClass.isAnnotationType();
62       }
63     });}
64
65   public PsiClassPattern withMethod(final boolean checkDeep, final ElementPattern<? extends PsiMethod> memberPattern) {
66     return with(new PatternCondition<PsiClass>("withMethod") {
67       @Override
68       public boolean accepts(@NotNull final PsiClass psiClass, final ProcessingContext context) {
69         for (PsiMethod method : (checkDeep ? psiClass.getAllMethods() : psiClass.getMethods())) {
70           if (memberPattern.accepts(method, context)) {
71             return true;
72           }
73         }
74         return false;
75       }
76     });
77   }
78   public PsiClassPattern withField(final boolean checkDeep, final ElementPattern<? extends PsiField> memberPattern) {
79     return with(new PatternCondition<PsiClass>("withField") {
80       @Override
81       public boolean accepts(@NotNull final PsiClass psiClass, final ProcessingContext context) {
82         for (PsiField field : (checkDeep ? psiClass.getAllFields() : psiClass.getFields())) {
83           if (memberPattern.accepts(field, context)) {
84             return true;
85           }
86         }
87         return false;
88       }
89     });
90   }
91
92   public PsiClassPattern nonAnnotationType() {
93     return with(new PatternCondition<PsiClass>("nonAnnotationType") {
94       @Override
95       public boolean accepts(@NotNull final PsiClass psiClass, final ProcessingContext context) {
96         return !psiClass.isAnnotationType();
97       }
98     });
99   }
100
101   public PsiClassPattern withQualifiedName(@NonNls @NotNull final String qname) {
102     return with(new PsiClassNamePatternCondition(string().equalTo(qname)));
103   }
104
105   public PsiClassPattern withQualifiedName(@NonNls @NotNull final ElementPattern<String> qname) {
106     return with(new PsiClassNamePatternCondition(qname));
107   }
108 }