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 并将输入参数与常量进行比较。

就像是

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

0

我不确定我是否完全理解您想要实现的目标,但我认为这将是一种过滤掉 System.out.println("anythingHere") 的方法,您可以使用MethodCallExpr. 像这样的东西:

    public void visit(MethodCallExpr n, Object a) {

        boolean isIt = isItSOP(n);

        super.visit(n, a);

    }

    private boolean isItSOP(MethodCallExpr n) {
        Node child = n.getChildrenNodes().get(0);

        String sChild=child.toString();

        if(sChild.equals("System.out")&&n.getName().equals("println")){
            return true;
        }
        return false;
    }`
于 2017-01-09T02:40:34.933 回答