java - 如何在给定元素在 Java AST 中的源位置的情况下查找该元素?

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

我的问题听起来有点琐碎;但是,我无法在谷歌上找到任何有用的东西。那么,如果我知道给定 AST 的起始位置,是否有办法获取给定 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.
            }    
        }
    }

最佳答案

我假设您正在寻找跨越问题源位置的最小 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 block 中。

关于java - 如何在给定元素在 Java AST 中的源位置的情况下查找该元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9105019/

相关文章:

c++ - Bison/Flex 教程,包括 C++、AST 和可重入词法分析器和解析器

haskell - 如何在 Haskell 中评估这个通用抽象语法树?

parsing - 理解 Haskell 中实现的递归下降解析器

java - 显示标签在jsp中不显示详细信息

java - Eclipse for Java 和 Eclipse for WEBMethods 可以位于同一硬盘上吗?

eclipse-plugin - 在 Eclipse RCP 中以编程方式修改命令标签

java - 导出的 eclipse-plugin 无法执行 python 脚本

eclipse - 通过Eclipse插件以编程方式更改菜单项

java - 使用java htmlunit搜索具有动态ID的元素

java - 有没有一种有效的方法通过java程序裁剪PDF并另存为图像(.JPG)?