2014-11-27 4 views
1

Utiliy.initialize ("value")과 같은 FunctionCall 문을 작성하여 js 파일의 모든 함수의 첫 번째 행에 추가해야합니다. 다음은 인수로 FunctionCall 문을 작성하고 함수를 추가하는 방법

코드가 나는 아래
private FunctionCall getFunctionCall() { 
     FunctionCall functionCall = new FunctionCall(); 
     Name name = new Name(); 
     name.setIdentifier("initialize"); 
     functionCall.setTarget(name); 
} 

내가

class FunctionVisitor implements NodeVisitor { 
     @Override 
     public boolean visit(AstNode node) { 
      if (node.getClass() == FunctionNode.class) { 
       FunctionNode fun = (FunctionNode) node; 
       fun.addChildrenToFront(getFunctionCall()); 
      } 
      return true; 
     } 

    } 

내가 함께 FunctionCall을 만들 수있는 방법을 제안하십시오 모든 functionNode에 추가 사용하고있는 코드입니다 FunctionCall를 만들려고하고있는 사용이다 인수 및 테스트를 위해 생성 된 FunctionCall 문을 어떻게 인쇄 할 수 있습니까? 자바 ASTVIEW 뷰어와 같은 자바 스크립트 노드를 볼 수있는 도구가 있습니까?

+0

이 자바 또는 자바 스크립트입니까? 질문에는 두 태그가 없어야합니다. – jfriend00

+0

@ jfriend00 : Rhino가 자바로 작성된 자바 스크립트 엔진이기 때문에이 특별한 경우에는 괜찮습니다. – georg

+0

@georg - 코드는 Java 또는 Javascript (Java로 표시됨)이며 OP에 관심을 가져 주므로 태그가 있어야합니다. – jfriend00

답변

1

당신은 인수로 StringLiteral을 만들고 functionCall에 추가해야 othere 케이스에 등 NumberLiteral, ArrrayLiteral 될 수있다 (참조 : http://javadox.com/org.mozilla/rhino/1.7R4/org/mozilla/javascript/ast/AstNode.html를)

private FunctionCall getFunctionCall() { 
     FunctionCall functionCall = new FunctionCall(); 
     Name name = new Name(); 
     name.setIdentifier("initialize"); 
     functionCall.setTarget(name); 
     StringLiteral arg = new StringLiteral(); 
     arg.setValue("value"); 
     arg.setQuoteCharacter('"'); 
     functionCall.addArgument(arg); 
     return functionCall; 
} 

class FunctionVisitor implements NodeVisitor { 
     @Override 
     public boolean visit(AstNode node) { 
      if (node.getClass() == FunctionNode.class) { 
       FunctionNode fun = (FunctionNode) node; 
       if(fun.getName().equals("initialize")) //prevents infinit loop 
       { 
        return true; 
       } 
       fun.getBody().addChildrenToFront(new EmptyStatement()); // adds ';', I don't know if required 
       fun.getBody().addChildrenToFront(getFunctionCall());//no fun.addChildrenToFront 
      } 
      return true; 
     } 

    } 

당신은 toSource에 의해 모든 corect AstNode를 인쇄 할 수 있습니다 () 방법. 이것이 도움이되기를 바랍니다.

+0

@@ Dominik Kunicki : thnakx는 EmptyStatement 행을 제외하고는 잘 작동합니다. mozilla에는 EmptyStatement 가져 오기 및 오류가 없습니다. "어떻게 추가 할 수 있니?" – Karan

+1

클래스가 있습니다 : org.mozilla.javascript.ast.EmptyStatement; Rhino 1.7R4에서 가져올 수 있습니까? 어쩌면 당신의 구현에서 이것은 다른 클래스입니다. 내가 추천 할 수있는 것은 FunctionVisitor에서 중단 점을 설정하고 어떤 클래스가 ';'을 나타내는 지 확인하는 것입니다. 노드를 구현합니다. 니가 뭔가를 찾으면 알려줘. –

+0

@@ Dominik Kunicki : 대단한 !!! EmptyStatement도 작동하고 ";"을 추가합니다. 고맙습니다. – Karan

관련 문제