我有SpiderMonkey AST,这是javascript对象。我使用“Esprima”,“Acorn”或其他库从javascript文件生成AST。我的AST由Mozilla解析器API指定。
我想从javascript中操作此AST - 删除/添加/编辑其中的节点。怎么安全地做? 例如,我想用!1或!0替换所有布尔文字。
现在我使用来自“Acorn”lib的walker:
acornWalk.simple(tree, {
Literal: function(node, scope) {
if(typeof node.value === 'boolean'){
var expressionTrue = {
"type": "UnaryExpression",
"operator": "!",
"prefix": true,
"argument": {
"type": "Literal",
"value": 0,
"raw": "0"
}
},
expressionFalse = {
"type": "UnaryExpression",
"operator": "!",
"prefix": true,
"argument": {
"type": "Literal",
"value": 1,
"raw": "1"
}
},
replace = function(node, newNode){
for(var prop in newNode){
node[prop] = newNode[prop];
}
};
replace(node, node.value ? expressionTrue : expressionFalse);
}
}
});
但它似乎不是一个好习惯,因为节点中的“start”,“end”属性没有改变,它可以破坏从该AST生成的代码。我是对的吗?