PSI自分めも(その2)

といってもStruts AssistantにあったPsiMethodCallFilterを貼るだけよ.

public class PsiMethodCallFilter implements ElementFilter {
  private String myClassName;
  private Set<String> myMethodNames;

  public PsiMethodCallFilter(String className, String... methodNames) {
    myClassName = className;
    myMethodNames = new HashSet<String>(Arrays.asList(methodNames));
  }

  public boolean isAcceptable(Object element, PsiElement context) {
    if (element instanceof PsiMethodCallExpression) {
      final PsiMethodCallExpression callExpression = (PsiMethodCallExpression) element;
      final PsiMethod psiMethod = callExpression.resolveMethod();
      if (psiMethod != null) {
        if (!myMethodNames.contains(psiMethod.getName())) {
          return false;
        }
        final PsiClass psiClass = psiMethod.getContainingClass();
        final PsiClass expectedClass = PsiManager.getInstance(psiClass.getProject()).findClass(myClassName, psiClass.getResolveScope());
        return InheritanceUtil.isInheritorOrSelf(psiClass, expectedClass, true);
      }
    }
    return false;
  }

  public boolean isClassAcceptable(Class hintClass) {
    return PsiMethodCallExpression.class.isAssignableFrom(hintClass);
  }
}

ElementFilterかぁ.OpenAPIどころかPSIだけでも広大だのう.