我需要创建像 Utiliy.initialize(" value")之类的FunctionCall语句,并将其添加到js文件的每个函数的第一行。
以下是我尝试创建FunctionCall
的代码private FunctionCall getFunctionCall() {
FunctionCall functionCall = new FunctionCall();
Name name = new Name();
name.setIdentifier("initialize");
functionCall.setTarget(name);
}
下面是我在每个functionNode中添加的代码
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以及如何打印创建的FunctionCall语句进行测试。 有没有工具可以查看像Java ASTVIEW viewer这样的javascript节点?
答案 0 :(得分:1)
你必须创建StringLiteral作为参数并将其添加到functionCall,在其他情况下它可以是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。我希望这会有所帮助。