关于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) {
}
},});
答案 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的要求。