Пройдите через новый узел с вавилоном

Я хотел бы добавить оператор перед каждым определением функции, например

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);

Третий аргумент - это область действия, а четвертый - родительский путь.

Другие вопросы по тегам