我需要创建像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/

10-12 15:51