У меня есть класс, и мне нужно просмотреть все его интерфейсы и суперклассы.Если одним из этих интерфейсов является интерфейс XX или один из его суперклассов в иерархии реализует интерфейс XX, мне нужно проверить, есть ли в исходном классе метод YY, и если нет, поднять проблему.Но после некоторых игр с PSI я не уверен, что это возможно, поскольку, когда я пытаюсь рекурсивно перемещаться вверх по иерархии, я получаю только немедленное супер, а после этого я получаю объект при вызове getSuperClass () (и это имеет смысл, так как суперкласс не особо PSI "посещал").Я что-то упускаю или невозможно путешествовать по иерархии во время посещения PSI в классе?
Полный пример кода здесь:
https://pastebin.com/wGy1P2Pv
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()),
"");
}
}
}