UNPKG

2.41 kBJavaScriptView Raw
1var util = require('util');
2var assert = require('assert');
3
4var traverse = module.exports = function (node, options, func) {
5 if (!func) func = options;
6 function go(node) {
7 if (node === null || typeof(node) === 'string' || typeof(node) === 'number'
8 || typeof(node) === 'boolean' || typeof(node) === 'undefined'
9 || util.isRegExp(node)) {
10 return node;
11 }
12 assert(node.type);
13 if (options.currentScope) {
14 if (node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression') {
15 return func(node);
16 }
17 }
18 Object.keys(node).forEach(function (key) {
19 if (key === 'type' || key === 'name' || key === 'label') {
20 //Optimization for leaf node
21 return;
22 }
23 var prop = node[key];
24 if (util.isArray(prop)) {
25 var newArray = [];
26 prop.forEach(function (subNode, i) {
27 subNode = go(subNode);
28 if (util.isArray(subNode)) {
29 newArray = newArray.concat(subNode);
30 } else if (subNode !== null) {
31 newArray.push(subNode);
32 }
33 });
34 node[key] = newArray;
35 } else {
36 node[key] = go(prop);
37 }
38 });
39 return func(node);
40 }
41 go(node);
42};
43
44traverse.getIdentifiersInBlock = function(blockStatement) {
45 var identifiersMap = {};
46 var addIdentifier = function (id) {
47 if (id.type === 'Identifier') {
48 identifiersMap[id.name] = true;
49 }
50 };
51
52 traverse(blockStatement, function (node) {
53 switch (node.type) {
54 case 'AssignmentExpression':
55 case 'BinaryExpression':
56 addIdentifier(node.left);
57 addIdentifier(node.right);
58 break;
59 case 'CallExpression':
60 addIdentifier(node.callee);
61 break;
62 case 'ExpressionStatement':
63 addIdentifier(node.expression);
64 break;
65 case 'FunctionDeclaration':
66 case 'FunctionExpression':
67 addIdentifier(node.id);
68 break;
69 case 'Identifier':
70 addIdentifier(node);
71 break;
72 case 'MemberExpression':
73 addIdentifier(node.object);
74 addIdentifier(node.property);
75 break;
76 case 'VariableDeclarator':
77 addIdentifier(node.id);
78 break;
79 default:
80 }
81 return node;
82 });
83
84 return Object.keys(identifiersMap);
85};
86
87traverse.replaceIdentifierInBlock = function(blockStatement, oldId, newId) {
88 //TODO to be implemented
89};