首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaParser比较

JavaParser比较
EN

Stack Overflow用户
提问于 2016-08-21 01:06:11
回答 1查看 625关注 0票数 0

我正在玩JavaParser,我正在寻找一种过滤所有System.out.println()的方法;

我可以通过以下方法来实现

代码语言:javascript
复制
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,并将输入参数与常量进行比较。

就像这样

代码语言:javascript
复制
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中的语句?

EN

回答 1

Stack Overflow用户

发布于 2017-01-09 10:40:35

我不确定我是否准确地理解了您要实现的目标,但我认为这将是一种过滤System.out.println("anythingHere")的方法,您可以使用MethodCallExpr。如下所示:

代码语言:javascript
复制
    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;
    }`
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39056717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档