如何通过javascript(esprima)将一个节点插入抽象语法树

时间:2019-01-08 01:52:55

标签: abstract-syntax-tree esprima

关于esprima和插入ast节点的问题。

我尝试生成一个ast节点,用新节点(node = newNode)替换其他节点,但这不起作用。

    estraverse.traverse(tree, {
enter(node, parent) {
try {
    if (node.type === "ExpressionStatement") {
        if(node.expression.right.type == "FunctionExpression"){
            // the id attribution can be replaced
            node.expression.right.id = node.expression.left;
            // but node can not be replaced
            node = node.expression.right;
            node.type = "FunctionDeclaration";
        }
    }
} catch (error) {

}
},});

1 个答案:

答案 0 :(得分:0)

基于共享的代码段,您正在使用estraverse来解析AST。要替换节点,您需要使用estraverse.replace API。您可以在文档中查看estraverse.replace的详细信息,但是通常在找到要替换的节点时(例如,if(node =='Expression Statement'){....}),您需要返回新节点此功能将替换当前节点。

// node替换为Newnode

result = estraverse.replace(AST, {
    leave: function (node) {
        if (node.type == 'Expression Statement')
            return Newnode;
    }
});

您需要注意的一点是确保Newnode无论如何都不会破坏AST语法。我发现的最佳方法是通过将代码片段转换为AST,然后从中获取相应的节点来获取Newnode。这样可以确保该结构保持符合ecmascript的要求。