【问题标题】:JavaParser how to get the original line-size of a block-statement?JavaParser 如何获取块语句的原始行大小?
【发布时间】:2019-10-08 23:35:45
【问题描述】:

我正在将 JavaParser 用于代码分析项目,我在其中读取 Java 源文件并生成 AST(抽象语法树)进行分析。我需要确定来自 AST 的给定块语句跨越的原始行数。

基本上我有这样的方法:

int numberOfLines(Node astNode){
....
}

我需要返回跨越的行数。示例:

void something()
{
// hello world

}

将返回 5。

我尝试转换为字符串并计算行数,如下所示:new BufferedReader(new StringReader(nodeHere.toString())).lines().count(),但这由于缺乏词汇保存而不起作用......例如单行喜欢这样:“class TestClass {int x ; int y; int zz(int a){return a;} }" 变成 10 行:

class TestClass {

    int x;

    int y;

    int zz(int a) {
        return a;
    }
}

当生成 AST,然后转换回字符串时,本质上是“美化”它......但是,JavaParser 确实在 range 属性中保留了原始“坐标”,所以也许可以以某种方式使用它?

谢谢

【问题讨论】:

  • 这取决于您使用的词法分析器和解析器是否在 AST 中保留了足够的信息来获取行数。
  • 只使用了Javaparser...

标签: java javaparser


【解决方案1】:

您可以使用rangetokenRange 属性。即类似range.end.line - range.begin.line

【讨论】:

    【解决方案2】:

    这个答案可能很晚,但这对我有用......

    public void visit(MethodDeclaration method) {
         int methodBodyLength = method.getRange().map(range -> range.begin.line - range.end.line).orElse(0);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-09
      • 2012-08-28
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 2017-05-29
      相关资源
      最近更新 更多