2016-08-02 12 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 
    } 
}; 

Если я не остановить путь вновь вставленный ВыражениеФункции найден другой время, которое приводит к бесконечной рекурсии, поэтому остановка необходима. Моя конкретная проблема заключается в том, что я не знаю, как начать обход newNode.body, и мне нужно будет получить инструкции внутренней функции.

ответ

0

Это может быть сделано с помощью модуля babel-traverse так:

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

Третий аргумент является охват и шестым является порождающий путь.