2016-08-02 119 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); 

第三個參數是一個範圍和第六是父路徑。