使用babel遍历新替换的节点

时间:2016-08-02 10:16:14

标签: javascript babeljs abstract-syntax-tree visitor

我想在每个函数定义之前添加一个语句,例如

function a() {
  var b = function c() {};
}

变为

foo(function a() {
  var b = foo(function c() {});
});

我正试图通过以下访问者与babel实现这一目标:

var findFunctionVisitor = {
  Function: function (path) {
    // Traversing further leads to infinite loop as same node is found again
    path.stop();
    var node = path.node;

    // Move every FunctionDeclaration to FunctionExpression
    var newNode = t.functionExpression(
      node.id,
      node.params,
      node.body,
      node.generator,
      node.async
    );

    path.replaceWith(
      t.CallExpression(instrumentationCall, [newNode])
    )

    // traverse the part in newNode.body
  }
};

如果我没有停止路径,则会再次发现新插入的FunctionExpression导致无限递归,因此需要停止。 我的确切问题是,我不知道如何开始遍历newNode.body,我需要获取内部函数语句。

1 个答案:

答案 0 :(得分:0)

这可以通过使用babel-traverse模块完成,如下所示:

traverse(newNode, findFunctionVisitor, path.scope, path);

第三个参数是范围,第四个参数是父路径。