Пройдите через новый узел с вавилоном
Я хотел бы добавить оператор перед каждым определением функции, например
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 ответ
Это может быть сделано с помощью модуля babel-traverse следующим образом:
traverse(newNode, findFunctionVisitor, path.scope, path);
Третий аргумент - это область действия, а четвертый - родительский путь.