2016-08-20 2 views
0

Я играю с JavaParser, и я ищу способ фильтровать все System.out.println();Сравнение JavaParser

Я могу сделать это с помощью следующих методов

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()); 
} 

Есть ли способ, чтобы сравнить заявления в JParser вне методов Equals?

ответ

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; 
    }` 
Смежные вопросы