有没有办法在不手动遍历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);
}