babel-plugin-loop-optimizer
Version:
Optimizes statements such as `forEach` and `map` to for loops.
2 lines • 2.42 kB
JavaScript
Object.defineProperty(exports,"__esModule",{value:true});exports.default=function(babel){var t=babel.types;return{visitor:{IfStatement:function IfStatement(path){if(!t.isBlockStatement(path.node.consequent)){path.node.consequent=t.blockStatement([path.node.consequent])}},ForStatement:function ForStatement(path){if(!t.isBlockStatement(path.node.body)){path.node.body=t.blockStatement([path.node.body])}},WhileStatement:function WhileStatement(path){if(!t.isBlockStatement(path.node.body)){path.node.body=t.blockStatement([path.node.body])}},ArrowFunctionExpression:function ArrowFunctionExpression(path){if(!t.isBlockStatement(path.node.body)){path.node.body=t.blockStatement([t.returnStatement(path.node.body)])}},CallExpression:function CallExpression(path){var parent=path.getStatementParent();// Don't modify if in ternary
var excludeTernary=path.findParent(function(path){return path.isConditionalExpression()});if(excludeTernary)return;var comments;if((comments=parent.node.leadingComments)&&comments[comments.length-1]&&/^\s*O:\s*KEEP/.test(comments[comments.length-1].value)){return}if(checkName(path)&&path.node.arguments.length===1){var name=path.node.callee.property.name;var arrayName=path.scope.generateUidIdentifier("a");var funcName=path.scope.generateUidIdentifier("f");var resArrName=path.scope.generateUidIdentifier("r");var iterator=path.scope.generateUidIdentifier("i");var call=t.callExpression(funcName,[t.memberExpression(arrayName,iterator,true),iterator,arrayName]);var resArray=name==="forEach"?[]:[t.variableDeclaration("var",[t.variableDeclarator(resArrName,t.arrayExpression())])];var expr=t.callExpression(t.memberExpression(resArrName,t.identifier("push")),[call]);path.getStatementParent().insertBefore([t.variableDeclaration("var",[t.variableDeclarator(arrayName,path.node.callee.object)]),t.variableDeclaration("var",[t.variableDeclarator(funcName,path.node.arguments[0])])].concat(resArray,[t.forStatement(t.variableDeclaration("var",[t.variableDeclarator(iterator,t.numericLiteral(0))]),t.binaryExpression("<",iterator,t.memberExpression(arrayName,t.identifier("length"))),t.updateExpression("++",iterator),t.expressionStatement(name==="forEach"?call:expr))]));path.replaceWith(name==="forEach"?t.identifier("undefined"):resArrName)}}}}};var FUNCS=["map","forEach"];function checkName(path){return path.node.callee.property&&FUNCS.indexOf(path.node.callee.property.name)>-1}
;