如何根据Java AST中的源位置查找元素?

时间:2012-02-01 23:32:32

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

我的问题听起来有点微不足道;但是,我无法在谷歌上找到任何有用的东西。所以在这里,如果我知道它的起始位置,是否有办法获得给定AST的元素?

我想找到在编译单元中被标记为错误的格式错误的元素,我已经通过调用函数getSourceStart()来了解源位置。任何想法,链接,评论都非常感谢。

代码:

    IResource res = delta.getResource();
    if (res instanceof IFile && res.isAccessible()) {
        IJavaElement element = JavaCore.create((IFile)res);
        if (element instanceof ICompilationUnit) {
            ICompilationUnit icu = (ICompilationUnit)element;

            ASTParser parser = ASTParser.newParser(AST.JLS3);
            parser.setKind(ASTParser.K_COMPILATION_UNIT);
            parser.setSource(icu);
            parser.setResolveBindings(true); 
            final CompilationUnit cu = (CompilationUnit) parser.createAST(null);

            IProblem[] problems = cu.getProblems(); 
            for(IProblem problem : problems) {
                String args[] = problem.getArguments();
                int source = problem.getSourceStart();

                //Get Element that is at that point...
                //Should I traverse the AST?

                //Also problem.getArguments() if not null will provide the type of that element, not the name.
            }    
        }
    }

1 个答案:

答案 0 :(得分:3)

我假设您正在寻找跨越问题源位置的最小AST节点。由于您专门研究问题,您可能会发现当存在某些类型的语法错误时,生成的AST非常古怪。

尽管如此,我有点惊讶的是没有预先解决的问题。您必须创建自己的ASTVisitor。它看起来像这样:

class MyFinder extends ASTVisitor {
  public void postVisit(ASTNode node) {
    if (spansProblemLocation(node)) {
      throw new VisitComplete(node);
    }
  }
}
class VisitComplete extends Throwable {
  ASTNode result;
  ...
}

由于我们覆盖了postVisit方法,因此我们保证获得最小的ASTNode作为结果。要使用此访问者,请将accept的调用包装在处理VisitComplete的try-catch块中。