我需要创建像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节点?
最佳答案
您必须创建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。我希望这将有所帮助。
关于java - 如何使用参数创建FunctionCall语句并添加函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27165521/