|
1 år sedan | |
---|---|---|
.. | ||
node_modules | 1 år sedan | |
CHANGELOG.md | 1 år sedan | |
README.md | 1 år sedan | |
index.js | 1 år sedan | |
package.json | 1 år sedan |
Merge multiple visitors for estraverse into one
var mergedVisitor = mergeVisitors(arrayOfVisitors)
npm install merge-estraverse-visitors
For given code,
function tenTimes (cb) {
for (var i = 0; i < 10; i += 1) {
cb();
}
}
Merge multiple estraverse visitors into one then run against target AST.
var visitor1 = {
enter: function (currentNode, parentNode) {
switch(currentNode.type) {
case 'ForStatement':
console.log('v1: going to skip ' + currentNode.type);
this.skip();
break;
case 'CallExpression':
case 'FunctionDeclaration':
console.log('v1: entering ' + currentNode.type);
break;
}
return undefined;
},
leave: function (currentNode, parentNode) {
switch(currentNode.type) {
case 'ForStatement':
case 'CallExpression':
case 'FunctionDeclaration':
console.log('v1: leaving ' + currentNode.type);
break;
}
}
};
var visitor2 = {
enter: function (currentNode, parentNode) {
switch(currentNode.type) {
case 'ForStatement':
case 'CallExpression':
case 'FunctionDeclaration':
console.log('v2: entering ' + currentNode.type);
break;
}
},
leave: function (currentNode, parentNode) {
switch(currentNode.type) {
case 'ForStatement':
case 'CallExpression':
case 'FunctionDeclaration':
console.log('v2: leaving ' + currentNode.type);
break;
}
}
};
var mergeVisitors = require('merge-estraverse-visitors');
var estraverse = require('estraverse');
var acorn = require('acorn');
var ast = acorn.parse(code);
estraverse.traverse(ast, mergeVisitors([ visitor1, visitor2 ]));
Results in:
v1: entering FunctionDeclaration
v2: entering FunctionDeclaration
v1: going to skip ForStatement
v2: entering ForStatement
v2: entering CallExpression
v2: leaving CallExpression
v2: leaving ForStatement
v1: leaving ForStatement
v2: leaving FunctionDeclaration
v1: leaving FunctionDeclaration
Licensed under the MIT license.