【发布时间】:2016-10-10 15:41:59
【问题描述】:
我正在构建一个插件,通过调用path.insertBefore 在每个现有函数调用前面插入enterFunction()。所以我的代码是从:
myFunction();
收件人:
enterFunction();
myFunction();
问题是当我插入节点时,Babel 再次遍历插入的节点。这是日志输出:
'CallExpression','myFunction'
'CallExpression', 'enterFunction'
如何防止 Babel 进入 enterFunction 调用表达式及其子代?
这是我目前用于 Babel 插件的代码:
function(babel) {
return {
visitor: {
CallExpression: function(path) {
console.log("CallExpression", path.node.callee.name)
if (path.node.ignore) {
return;
}
path.node.ignore = true
var enterCall = babel.types.callExpression(
babel.types.identifier("enterFunction"), []
)
enterCall.ignore = true;
path.insertBefore(enterCall)
}
}
}
}
【问题讨论】:
-
某处,需要存储待遍历路径的信息。问题只是如何。关门怎么办?
f = function () { var x = 0; return function () { if (x > 0) return; do_meaningful_things(); x++ } }; -
@meisterluk 我想知道的是,我怎样才能将它传达给 Babel? insertBefore 正在触发新的遍历。
-
对不起,我应该在评论之前更好地理解您的示例代码。现在,我能找到的最佳答案是 github.com/babel/babel/issues/4956 也许 path.skip() 有效? astexplorer.net/#/efhJqnJv5a/1
-
@meisterluk 是的,skip() 和 skipKeys 正是我想要的!您可以将其发布为答案吗?
-
完成 - 很高兴能提供任何帮助
标签: babeljs