2016-08-02 36 views
0

Ich möchte eine Aussage vor jeder Funktionsdefinition hinzufügen, z.Durchqueren Sie einen neu ersetzten Knoten mit babel

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

wird

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

Ich versuche, dies mit dem folgenden Besucher mit babel zu erreichen:

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

Wenn ich die neu eingefügte FunctionExpression gefunden wird eine andere den Pfad nicht stoppen Zeit, die zu unendlicher Rekursion führt, so ist der Stopp notwendig. Mein genaues Problem ist, dass ich nicht weiß, wie man das Traversieren von newNode.body beginnt, das ich die inneren Funktionsanweisungen erhalten würde.

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

Das dritte Argument ist ein Rahmen, und die sechste ist ein Elternteil Pfad:

Antwort

0

unter Verwendung des babel-traverse Modul wie diese Dies kann durchgeführt werden.