在JavaPsiScanner visitClass方法期间访问Super类接口和super

时间:2018-12-13 05:24:30

标签: java static-analysis lint

我有一个类,我需要遍历它的所有接口和超类。如果这些接口之一是接口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()),
        "");
  }
}

}

0 个答案:

没有答案