0

私は JavaParser で遊んでいて、すべての System.out.println(); をフィルタリングする方法を探しています。

私は次の方法でそれを行うことができます

public class SystemOutFilter extends ModifierVisitorAdapter{



    @Override
    public Node visit(ExpressionStmt n, Object arg) {
        if(isSystemOut(n)){
            return null;
        }
        return super.visit(n, arg);
    }



private boolean isSystemOut(ExpressionStmt n){
    if(n.getExpression() instanceof  MethodCallExpr){
        MethodCallExpr methodExpr = (MethodCallExpr) n.getExpression();
        if(methodExpr.getScope() instanceof FieldAccessExpr){
            FieldAccessExpr fieldExpr = (FieldAccessExpr) methodExpr.getScope();
            NameExpr nameExpr = (NameExpr) fieldExpr.getScope();

            if(nameExpr.getName().equals("System") && fieldExpr.getField().equals("out")){
                return true;
            };
        }
    }
    return false;
}

private boolean isSystemOut_1(ExpressionStmt n){
    NameExpr clazz = new NameExpr("System");
    FieldAccessExpr field = new FieldAccessExpr(clazz, "out");
    MethodCallExpr method = new MethodCallExpr(field, "println");
    if(n.getExpression() instanceof MethodCallExpr){
        MethodCallExpr inputExpr = (MethodCallExpr) n.getExpression();
        if(inputExpr.getName().equals(method.getName()) && inputExpr.getScope().equals(method.getScope()))
            return true;
    }
    return false;
}

private boolean isSystemOut_2(ExpressionStmt n) {
    NameExpr clazz = new NameExpr("System");
    FieldAccessExpr field = new FieldAccessExpr(clazz, "out");
    MethodCallExpr method = new MethodCallExpr(field, "println");
    if(n.getExpression() instanceof MethodCallExpr){
        MethodCallExpr inputExpr = (MethodCallExpr) n.getExpression();
        method.setArgs(inputExpr.getArgs());
        return inputExpr.equals(method);
    }
    return false;
}

private boolean isSystemOut_3(ExpressionStmt n){
    try{
        Statement expr = JavaParser.parseStatement("System.out.println();");

        if(expr instanceof  ExpressionStmt) {
            ExpressionStmt methodStmt = (ExpressionStmt) expr;
            if (n.getExpression() instanceof MethodCallExpr) {
                MethodCallExpr inputExpr = (MethodCallExpr) n.getExpression();
                MethodCallExpr methodExpr = (MethodCallExpr) methodStmt.getExpression();
                methodExpr.setArgs(inputExpr.getArgs());
                return inputExpr.equals(methodExpr);
            }
        }
    }catch(ParseException pe){
        pe.printStackTrace();
    }

    return false;
}

}

引数を一致させるために毎回新しい MethodExpression を作成する必要があるため、その解決策は好きではありません。静的な最終 MethodExpression を 1 つ作成し、入力パラメーターを定数と比較したいと思います。

何かのようなもの

private static final ExpressionStmt  systemOutExpr =      (ExpressionStmt)JavaParser.parseStatement("System.out.println();");

private boolean isSystemOut(ExpressionStmt n){
    return n.match(systemOutExpr).withArgs(Matchers.any());
}

equals メソッド以外で JParser のステートメントを比較する方法はありますか?

4

1 に答える 1