Cleanup: NotNull/Nullable
[idea/community.git] / java / java-psi-api / src / com / intellij / patterns / PsiExpressionPattern.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
3 package com.intellij.patterns;
4
5 import com.intellij.psi.*;
6 import com.intellij.util.ProcessingContext;
7 import com.intellij.util.containers.ContainerUtil;
8 import org.jetbrains.annotations.NotNull;
9
10 /**
11  * @author peter
12  */
13 public class PsiExpressionPattern<T extends PsiExpression, Self extends PsiExpressionPattern<T,Self>> extends PsiJavaElementPattern<T,Self> {
14   protected PsiExpressionPattern(final Class<T> aClass) {
15     super(aClass);
16   }
17
18   public Self ofType(@NotNull final ElementPattern pattern) {
19     return with(new PatternCondition<T>("ofType") {
20       @Override
21       public boolean accepts(@NotNull final T t, final ProcessingContext context) {
22         return pattern.accepts(t.getType(), context);
23       }
24     });
25   }
26
27   public PsiMethodCallPattern methodCall(final ElementPattern<? extends PsiMethod> method) {
28     final PsiNamePatternCondition nameCondition = ContainerUtil.findInstance(method.getCondition().getConditions(), PsiNamePatternCondition.class);
29     return new PsiMethodCallPattern().and(this).with(new PatternCondition<PsiMethodCallExpression>("methodCall") {
30       @Override
31       public boolean accepts(@NotNull PsiMethodCallExpression callExpression, ProcessingContext context) {
32         PsiReferenceExpression methodExpression = callExpression.getMethodExpression();
33         if (nameCondition != null && !nameCondition.getNamePattern().accepts(methodExpression.getReferenceName())) {
34           return false;
35         }
36
37         for (JavaResolveResult result : methodExpression.multiResolve(true)) {
38           if (method.accepts(result.getElement(), context)) {
39             return true;
40           }
41         }
42         return false;
43       }
44     });
45   }
46
47   public Self skipParentheses(final ElementPattern<? extends PsiExpression> expressionPattern) {
48     return with(new PatternCondition<T>("skipParentheses") {
49       @Override
50       public boolean accepts(@NotNull T t, ProcessingContext context) {
51         PsiExpression expression = t;
52         while (expression instanceof PsiParenthesizedExpression) {
53           expression = ((PsiParenthesizedExpression)expression).getExpression();
54         }
55         return expressionPattern.accepts(expression, context);
56       }
57     });
58   }
59
60   public static class Capture<T extends PsiExpression> extends PsiExpressionPattern<T, Capture<T>> {
61     public Capture(final Class<T> aClass) {
62       super(aClass);
63     }
64
65   }
66 }