2016-08-02 61 views
0

我想在每个函数定义之前添加一个语句,例如用babel遍历新取代的节点

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

成为

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

我想用下面的访问巴别塔来实现:

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,我需要获取内部函数语句。

回答

0

这可以通过使用babel-traverse模块这样来完成:

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

第三个参数是一个范围和第六是父路径。