我有一个类,我需要遍历它的所有接口和超类。如果这些接口之一是接口XX或他的上级类中的一个实现了接口XX,则我需要检查原始类是否具有方法YY,如果没有,则引发问题。 但是在使用PSI进行了一些游戏之后,我不太确定是否有可能,因为当我尝试递归地遍历层次结构时,我只能到达立即超级,然后在调用getSuperClass()时得到一个对象(而且从超级开始有点有意义)类不是真正的“访问过的PSI”)。 我是否缺少某些东西,或者在上课进行PSI期间无法按层次旅行?
完整的示例代码在这里:
private static class Visitor extends JavaElementVisitor {
private static final String HASH_CODE_METHOD = "hashCodeSpecificMethod";
private final JavaContext mContext;
public Visitor(JavaContext context) {
mContext = context;
}
@Override
public void visitClass(PsiClass aClass) {
if (!mContext.getDriver().isSuppressed(mContext, ISSUE, aClass)) {
if (checkSuperClassesForSpecificMethodIfc(aClass)) {
checkHashCodeSpecificMethod(aClass);
}
}
super.visitClass(aClass);
}
private boolean checkInterfacesForHashCodeSpecificMethod(PsiClass aClass) {for (PsiClass anInterface : aClass.getInterfaces()) {
if (anInterface.getName().equals("HashCodeSpecificMethodInterface")) {
return true;
}
}
return false;
}
private boolean checkSuperClassesForSpecificMethodIfc(PsiClass currentClass) {
boolean foundInInterfaces = checkInterfacesForHashCodeSpecificMethod(currentClass);
if (foundInInterfaces) {
return true;
}
PsiClass superClass = currentClass.getSuperClass();
if (superClass != null) {
return checkSuperClassesForSpecificMethodIfc(superClass);
}
return false;
}
private void checkHashCodeSpecificMethod(PsiClass aClass) {
PsiMethod[] hashCodeMethods = aClass.findMethodsByName(HASH_CODE_METHOD, false);
if (hashCodeMethods == null || hashCodeMethods.length == 0) {
mContext.report(
ISSUE,
Location.create(
mContext.file,
mContext.getContents(),
aClass.getNameIdentifier().getTextOffset(),
aClass.getNameIdentifier().getTextOffset()
+ aClass.getNameIdentifier().getTextLength()),
"");
}
}
}