parent
09c98ed1de
commit
1030ea58cc
@ -1,59 +0,0 @@ |
|||||||
'use strict' |
|
||||||
/** |
|
||||||
* Crawl the given AST through the function walk(ast, callback) |
|
||||||
*/ |
|
||||||
function AstWalker () {} // eslint-disable-line
|
|
||||||
|
|
||||||
/** |
|
||||||
* visit all the AST nodes |
|
||||||
* |
|
||||||
* @param {Object} ast - AST node |
|
||||||
* @param {Object or Function} callback - if (Function) the function will be called for every node. |
|
||||||
* - if (Object) callback[<Node Type>] will be called for |
|
||||||
* every node of type <Node Type>. callback["*"] will be called for all other nodes. |
|
||||||
* in each case, if the callback returns false it does not descend into children. |
|
||||||
* If no callback for the current type, children are visited. |
|
||||||
*/ |
|
||||||
AstWalker.prototype.walk = function (ast, callback) { |
|
||||||
if (callback instanceof Function) { |
|
||||||
callback = {'*': callback} |
|
||||||
} |
|
||||||
if (!('*' in callback)) { |
|
||||||
callback['*'] = function () { return true } |
|
||||||
} |
|
||||||
if (ast) { |
|
||||||
const nodes = ast.nodes || (ast.body && ast.body.statements) || ast.declarations || [] |
|
||||||
if (ast.body && ast.initializationExpression) { // 'for' loop handling
|
|
||||||
nodes.push(ast.initializationExpression) |
|
||||||
} |
|
||||||
if (manageCallBack(ast, callback) && nodes && nodes.length > 0) { |
|
||||||
for (let k in nodes) { |
|
||||||
const child = nodes[k] |
|
||||||
this.walk(child, callback) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* walk the given @astList |
|
||||||
* |
|
||||||
* @param {Object} sourcesList - sources list (containing root AST node) |
|
||||||
* @param {Function} - callback used by AstWalker to compute response |
|
||||||
*/ |
|
||||||
AstWalker.prototype.walkAstList = function (sourcesList, callback) { |
|
||||||
const walker = new AstWalker() |
|
||||||
for (let k in sourcesList) { |
|
||||||
walker.walk(sourcesList[k].ast, callback) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
function manageCallBack (node, callback) { |
|
||||||
if (node.nodeType in callback) { |
|
||||||
return callback[node.nodeType](node) |
|
||||||
} else { |
|
||||||
return callback['*'](node) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
module.exports = AstWalker |
|
Loading…
Reference in new issue