有没有办法在不手动遍历AST的情况下获取方法中的所有语句
Is there a way to get all the statements in a method without manually traversing the AST
只是想知道是否有一种方法可以在不手动遍历方法的 AST 的情况下获取方法中的所有语句。
到目前为止,我已经尝试通过手动遍历树来获取所有语句,这通常是一个坏主意,而且做起来也很棘手。
public void visit(MethodDeclaration n, Object arg) {
int total = 0;
NodeList<Statement> statements = n.getBody().get().getStatements();
for(Node node: statements) {
//System.out.println(node.getClass());
if(node instanceof ExpressionStmt) {
if(node.toString().contains("=")) {
total++;
}
}
}
super.visit(n, arg);
System.out.println(total);
}
上面的代码有效,但它只获取树的同一深度级别的语句,而不是 AST 所有深度级别的所有语句
如果有人能提供帮助,将不胜感激。
如果要遍历AST所有深度级别的所有语句,则需要使用另一个访问器。
根据你的例子:
/**
* Visitor which counts expression statements
*/
GenericVisitorAdapter<ExpressionStmt, Integer> expressionsCountVisitor = new GenericVisitorAdapter<ExpressionStmt, Integer>() {
/**
* This is based on your example
*/
@Override
public ExpressionStmt visit(ExpressionStmt expressionStmt, Integer count) {
if(expressionStmt.toString().contains("=")) {
count++;
}
return super.visit(expressionStmt, count);
}
/**
* But better to check for AssignExpr instead of ".contains("=")"
*/
@Override
public ExpressionStmt visit(AssignExpr assignExpr, Integer count) {
// counts each "=" assign expression
count++;
return super.visit(assignExpr, count);
}
};
// And then use this visitor for each MethodDecalration
public void visit(MethodDeclaration methodDeclaration, Object arg) {
Integer total = 0;
// traverses down the hierarchy of this method declaration
methodDeclaration.accept(expressionsCountVisitor, total);
super.visit(methodDeclaration, arg);
System.out.println(total);
}
只是想知道是否有一种方法可以在不手动遍历方法的 AST 的情况下获取方法中的所有语句。
到目前为止,我已经尝试通过手动遍历树来获取所有语句,这通常是一个坏主意,而且做起来也很棘手。
public void visit(MethodDeclaration n, Object arg) {
int total = 0;
NodeList<Statement> statements = n.getBody().get().getStatements();
for(Node node: statements) {
//System.out.println(node.getClass());
if(node instanceof ExpressionStmt) {
if(node.toString().contains("=")) {
total++;
}
}
}
super.visit(n, arg);
System.out.println(total);
}
上面的代码有效,但它只获取树的同一深度级别的语句,而不是 AST 所有深度级别的所有语句 如果有人能提供帮助,将不胜感激。
如果要遍历AST所有深度级别的所有语句,则需要使用另一个访问器。
根据你的例子:
/**
* Visitor which counts expression statements
*/
GenericVisitorAdapter<ExpressionStmt, Integer> expressionsCountVisitor = new GenericVisitorAdapter<ExpressionStmt, Integer>() {
/**
* This is based on your example
*/
@Override
public ExpressionStmt visit(ExpressionStmt expressionStmt, Integer count) {
if(expressionStmt.toString().contains("=")) {
count++;
}
return super.visit(expressionStmt, count);
}
/**
* But better to check for AssignExpr instead of ".contains("=")"
*/
@Override
public ExpressionStmt visit(AssignExpr assignExpr, Integer count) {
// counts each "=" assign expression
count++;
return super.visit(assignExpr, count);
}
};
// And then use this visitor for each MethodDecalration
public void visit(MethodDeclaration methodDeclaration, Object arg) {
Integer total = 0;
// traverses down the hierarchy of this method declaration
methodDeclaration.accept(expressionsCountVisitor, total);
super.visit(methodDeclaration, arg);
System.out.println(total);
}