私は 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 のステートメントを比較する方法はありますか?