如何获得给定行号的所有JDT AST语句?

克里斯

如何获得org.eclipse.jdt.core.dom.Statement给定的行号?

假设我有这个课程:

 1 package foo;
 2 public class Operations {
 3  public static int calc(int a, int b) {
 4      if (a >= b)
 5          return a - b;
 6      if (a<b || b==2)
 7          return -1;
 8      return 0;
 9  }
10 }

这是我期望的:

  • 第3行-> BlockStatement
  • 第4行-> IfStatement
  • 第5行-> ReturnStatement

该代码有效,但是有点笨拙,因为在最坏的情况下必须访问每个正文和语句。有没有更好/更简单的方法呢?

List<Statement> getStatementsAtLine(final CompilationUnit cu, final int lineNumber) {
        final List<Statement> result = new ArrayList<Statement>();
        cu.accept(new ASTVisitor() {
            @Override
            public boolean visit(MethodDeclaration node) {
                Block body = node.getBody();

                for (Statement s : (List<Statement>) body.statements()) {
                    int l=cu.getLineNumber(s.getStartPosition());
                    if (l==lineNumber){
                        result.add(s);
                    }
                }
                return true;
            }
        });

        return result;
    }
斯蒂芬·赫尔曼(Stephan Herrmann)

您可能需要使用以下命令将行号转换为(character-)位置

org.eclipse.jdt.core.dom.CompilationUnit.getPosition(int, int)

使用该偏移量,您可以使用org.eclipse.jdt.core.dom.NodeFinder检索该ASTNode位置处的,例如:

NodeFinder finder= new NodeFinder(cu, offset, 0);
ASTNode node= finder.getCoveringNode();
while (node != null && !(node instanceof Statement)) {
    node= node.getParent();
}
return node;

编辑:但是,这种方法在空格方面存在问题,因为所查找的语句未涵盖前导或尾随空格字符。

我看到了两种避免该问题的可能策略:

  1. 递增,offset直到您确定它在行的有效文本内,或者
  2. 应用以下注释中的技巧:将区域扩展到文件末尾,并要求ASTNode该区域完全覆盖最大的区域(使用getCoveredNode()代替getCoveringNode())。

策略(1)要求通过IDocument检索相关行的文本,该文本可能不容易获得。策略(2)的效果可能是,可以选择一条跨越多行的语句,不确定该语句是否违反任何要求。如果需要更高的精度,请计算length参数getPosition()作为当前行起始点与下一行起始点之间的差。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从pycparser生成的ast查找switch语句?

来自分类Dev

如何使用AST在Python中注释掉特定的语句?

来自分类Dev

JDT AST,如何生成声明

来自分类Dev

编译器AST如何实现语句和表达式

来自分类Dev

编译器AST如何实现语句和表达式

来自分类Dev

如何使用jdt.ast解决多态

来自分类Dev

如何使用JDT-AST在已知行中提取条件?

来自分类Dev

使给定行号的所有元素等于NaN

来自分类Dev

如何获得 AST 所代表的值的类型?

来自分类Dev

如何获得no results语句仅在没有结果时显示而不是在所有时间显示?

来自分类Dev

在Eclipse JDT AST中创建类型绑定

来自分类Dev

如何计算foreach语句的所有结果

来自分类Dev

如何完成所有未决的SELECT语句?

来自分类Dev

如何使用 IN 语句选择所有内容

来自分类Dev

如何查看Clang AST?

来自分类Dev

如何获得给定媒体ID的所有喜欢

来自分类Dev

如何使用番石榴获得给定包装的所有类

来自分类Dev

寻找有关如何为给定的“ AST”编码编写器的指南(DynamoDB)

来自分类Dev

如何匹配RegEx以获得not语句

来自分类Dev

是否可以在F#中的单个语句中打开给定模块的所有子模块?

来自分类Dev

语句“在给定SM上运行的所有线程都可以协作”是对还是错?

来自分类Dev

如何使用带有Cofree注释的AST?

来自分类Dev

显示给定文件的所有行和行号

来自分类Dev

如何获得给定Steam应用程序的所有所有者?

来自分类Dev

如何从AST转到后端代码?

来自分类Dev

如何进行AST转换?

来自分类Dev

如何访问LESS生成的AST?

来自分类Dev

如何从AST获取继承树?

来自分类Dev

如何漂亮打印Syn AST?

Related 相关文章

热门标签

归档