Доступ к интерфейсам суперклассов и супер во время метода JavaPsiScanner visitClass - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть класс, и мне нужно просмотреть все его интерфейсы и суперклассы.Если одним из этих интерфейсов является интерфейс 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()),
        "");
  }
}

}

...