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だけでも広大だのう.