如何在AST eclipse中检索有关类的继承信息?

时间:2013-07-01 02:44:52

标签: java eclipse eclipse-plugin abstract-syntax-tree

我目前正在尝试实现一个Eclipse插件来计算Java应用程序的一些OO指标,如DIT(继承树的深度)。但是,我无法检索有关Class继承树的信息(类到Object之间的距离)。假设一个类是CompilationUnit,我试图通过TypeDeclaration进入类来比较类,例如,Dog(extends Animal)是否是Object的一个实例。如果没有,则对访问方法进行递归调用,将Animal类作为参数传递,直到该类为Object。

编辑我设法使用typeDec.getSuperClassType()恢复超类,但是我需要获取此超类的TypeDeclaration以递归方式调用visit方法,并将此TypeDeclaration作为参数传递。

这是我的代码的想法:

public class ClassVisitor extends ASTVisitor { 

 depthOfInheritanceTreeIndex = 1;

 public boolean visit(CompilationUnit unit) {
    for (Object type :unit.types()){

        TypeDeclaration typeDec = (TypeDeclaration) type;

        Type superClassType = typeDec.getSuperClassType();

        TypeDeclaration superClazz;
        if (superClassType.equals(Object.class.getSimpleName())){
            return continue;
        }else{
            depthOfInheritanceTreeIndex++;
            superClazz = (TypeDeclaration) superClassType.getParent();
            return super.visit(superClazz);
        }
    }
    return false;
 }
}

你们对我做错了什么或怎么做有什么想法吗?任何帮助都会得到赞赏!

2 个答案:

答案 0 :(得分:2)

这里最好的办法是避免使用AST API并改为使用Java模型API。 AST旨在操纵和分析Java源代码,但模型API旨在分析和操作Java程序的结构。

API植根于IJavaElement界面。你需要做这样的事情:

IFile myJavaFile = <get the file>
ICompilationUnit unit = JavaCore.createFromFile(myJavaFile);
IType[] types = unit.getAllTypes();
for (IType type : types) {
  ITypeHierarchy th= type.newTypeHierarchy(null);
  // do something with the hierarchy
}

这将比基于AST生成层次结构更灵活。但是有一些警告:

  1. 这可能需要很长时间才能计算(特别是对于大型层次结构)
  2. 因此,您可能希望仅使用超类型层次结构,这样计算起来要快得多。

答案 1 :(得分:2)

您可以使用typeDec.resolveBinding().getSuperclass()将超类作为ITypeBinding。从那里,您可以通过递归调用getSuperClass()向上移动继承树,直到它返回nullunit.getAST().resolveWellKnownType("java.lang.Object")