2016-08-20 15 views
0

JavaParser로 놀고 있는데, 모든 System.out.println()을 필터링하는 방법을 찾고 있습니다. 나는 인수와 일치하는 새로운 된 methodStatement 매번를 만들 필요가 있기 때문에JavaParser comparison

나는 내가 그 솔루션을 좋아하지 않아 다음 방법

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 만들고 입력 된 매개 변수를 상수와 비교하고 싶습니다.

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

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

등호 방법 이외의 JParser에 문을 비교하는 방법이 있나요

같은 뭔가?

답변

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; 
    }`