我正在将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属性中保留了原始的“坐标”,因此也许可以以某种方式使用它?
谢谢
答案 0 :(得分:0)
可以使用range和tokenRange属性。即类似range.end.line - range.begin.line
答案 1 :(得分:0)
这个答案可能很晚了,但这对我有用...
public void visit(MethodDeclaration method) {
int methodBodyLength = method.getRange().map(range -> range.begin.line - range.end.line).orElse(0);
}