如何使用参数创建FunctionCall语句并添加函数

时间:2014-11-27 07:44:46

标签: java javascript mozilla rhino

我需要创建像 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节点?

1 个答案:

答案 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。我希望这会有所帮助。