diff --git a/lib/6to5/builders.js b/lib/6to5/builders.js deleted file mode 100644 index b015dbc0f0..0000000000 --- a/lib/6to5/builders.js +++ /dev/null @@ -1,46 +0,0 @@ -var _ = require("lodash"); - -var build = function (type, keys) { - return function () { - var args = arguments; - var node = { type: type }; - _.each(keys, function (key, i) { - node[key] = args[i]; - }); - return node; - }; -}; - -exports.identifier = build("Identifier", ["name"]); - -exports.literal = build("Literal", ["value"]); - -exports.functionExpression = build("FunctionExpression", ["id", "params", "body"]); - -exports.returnStatement = build("ReturnStatement", ["argument"]); - -exports.assignmentExpression = build("AssignmentExpression", ["operator", "left", "right"]); - -exports.ifStatement = build("IfStatement", ["test", "consequent", "alternate"]); - -exports.callExpression = build("CallExpression", ["callee", "arguments"]); - -exports.blockStatement = build("BlockStatement", ["body"]); - -exports.memberExpression = build("MemberExpression", ["object", "property", "computed"]); - -exports.variableDeclaration = build("VariableDeclaration", ["kind", "declarations"]); - -exports.variableDeclarator = build("VariableDeclarator", ["id", "init"]); - -exports.arrayExpression = build("ArrayExpression", ["elements"]); - -exports.binaryExpression = build("BinaryExpression", ["operator", "left", "right"]); - -exports.expressionStatement = build("ExpressionStatement", ["expression"]); - -exports.thisExpression = build("ThisExpression"); - -exports.objectExpression = build("ObjectExpression", ["properties"]); - -exports.property = build("Property", ["kind", "key", "value"]); diff --git a/lib/6to5/file.js b/lib/6to5/file.js index eec4ec6044..39c08f83a6 100644 --- a/lib/6to5/file.js +++ b/lib/6to5/file.js @@ -6,7 +6,7 @@ var transform = require("./transform"); var generate = require("./generator"); var acorn = require("acorn-6to5"); var util = require("./util"); -var b = require("./builders"); +var t = require("./types"); var _ = require("lodash"); function File(opts) { @@ -72,7 +72,7 @@ File.prototype.addDeclaration = function (name) { var declar = this.declarations[name]; if (declar) return declar.uid; - var uid = b.identifier(this.generateUid(name)); + var uid = t.identifier(this.generateUid(name)); this.declarations[name] = { uid: uid, node: util.template(name) diff --git a/lib/6to5/generators/jsx.js b/lib/6to5/generators/jsx.js index 3544da04ac..fa3ba6e3e7 100644 --- a/lib/6to5/generators/jsx.js +++ b/lib/6to5/generators/jsx.js @@ -78,5 +78,5 @@ exports.XJSClosingElement = function (node, print) { }; exports.XJSEmptyExpression = function () { - + this.push("null"); }; diff --git a/lib/6to5/modules/amd.js b/lib/6to5/modules/amd.js index 65e23f157c..6d8fe2a228 100644 --- a/lib/6to5/modules/amd.js +++ b/lib/6to5/modules/amd.js @@ -3,7 +3,6 @@ module.exports = AMDFormatter; var CommonJSFormatter = require("./common"); var util = require("../util"); var t = require("../types"); -var b = require("../builders"); var _ = require("lodash"); function AMDFormatter(file) { @@ -19,21 +18,21 @@ AMDFormatter.prototype.transform = function (ast) { // build an array of module names - var names = [b.literal("exports")]; + var names = [t.literal("exports")]; _.each(this.ids, function (id, name) { - names.push(b.literal(name)); + names.push(t.literal(name)); }); - names = b.arrayExpression(names); + names = t.arrayExpression(names); // build up define container var params = _.values(this.ids); - params.unshift(b.identifier("exports")); + params.unshift(t.identifier("exports")); - var container = b.functionExpression(null, params, b.blockStatement(body)); - var call = b.callExpression(b.identifier("define"), [names, container]); + var container = t.functionExpression(null, params, t.blockStatement(body)); + var call = t.callExpression(t.identifier("define"), [names, container]); - program.body = [b.expressionStatement(call)]; + program.body = [t.expressionStatement(call)]; }; AMDFormatter.prototype._push = function (node) { @@ -43,7 +42,7 @@ AMDFormatter.prototype._push = function (node) { if (ids[id]) { return ids[id]; } else { - return this.ids[id] = b.identifier(this.file.generateUid(id)); + return this.ids[id] = t.identifier(this.file.generateUid(id)); } }; @@ -57,7 +56,7 @@ AMDFormatter.prototype.importSpecifier = function (specifier, node, nodes) { // import foo from "foo"; if (specifier.default) { - id = b.identifier("default"); + id = t.identifier("default"); } var ref; @@ -67,11 +66,11 @@ AMDFormatter.prototype.importSpecifier = function (specifier, node, nodes) { ref = this._push(node); } else { // import foo from "foo"; - ref = b.memberExpression(this._push(node), id, false); + ref = t.memberExpression(this._push(node), id, false); } - nodes.push(b.variableDeclaration("var", [ - b.variableDeclarator(key, ref) + nodes.push(t.variableDeclaration("var", [ + t.variableDeclarator(key, ref) ])); }; diff --git a/lib/6to5/modules/common.js b/lib/6to5/modules/common.js index 6fe4131d4e..4a6839a3ad 100644 --- a/lib/6to5/modules/common.js +++ b/lib/6to5/modules/common.js @@ -2,7 +2,6 @@ module.exports = CommonJSFormatter; var util = require("../util"); var t = require("../types"); -var b = require("../builders"); function CommonJSFormatter(file) { this.file = file; @@ -20,7 +19,7 @@ CommonJSFormatter.prototype.importSpecifier = function (specifier, node, nodes) // import foo from "foo"; if (specifier.default) { - specifier.id = b.identifier("default"); + specifier.id = t.identifier("default"); } var templateName = "require-assign"; @@ -100,6 +99,6 @@ CommonJSFormatter.prototype._exportSpecifier = function (getRef, specifier, node CommonJSFormatter.prototype.exportSpecifier = function (specifier, node, nodes) { return this._exportSpecifier(function () { - return b.callExpression(b.identifier("require"), [node.source]); + return t.callExpression(t.identifier("require"), [node.source]); }, specifier, node, nodes); }; diff --git a/lib/6to5/modules/umd.js b/lib/6to5/modules/umd.js index ccb3d1ab87..d90774cbce 100644 --- a/lib/6to5/modules/umd.js +++ b/lib/6to5/modules/umd.js @@ -2,7 +2,7 @@ module.exports = UMDFormatter; var AMDFormatter = require("./amd"); var util = require("../util"); -var b = require("../builders"); +var t = require("../types"); var _ = require("lodash"); function UMDFormatter(file) { @@ -20,28 +20,28 @@ UMDFormatter.prototype.transform = function (ast) { var names = []; _.each(this.ids, function (id, name) { - names.push(b.literal(name)); + names.push(t.literal(name)); }); // factory var ids = _.values(this.ids); - var args = [b.identifier("exports")].concat(ids); + var args = [t.identifier("exports")].concat(ids); - var factory = b.functionExpression(null, args, b.blockStatement(body)); + var factory = t.functionExpression(null, args, t.blockStatement(body)); // runner var runner = util.template("umd-runner-body", { - AMD_ARGUMENTS: b.arrayExpression([b.literal("exports")].concat(names)), + AMD_ARGUMENTS: t.arrayExpression([t.literal("exports")].concat(names)), COMMON_ARGUMENTS: names.map(function (name) { - return b.callExpression(b.identifier("require"), [name]); + return t.callExpression(t.identifier("require"), [name]); }) }); // - var call = b.callExpression(runner, [factory]); - program.body = [b.expressionStatement(call)]; + var call = t.callExpression(runner, [factory]); + program.body = [t.expressionStatement(call)]; }; diff --git a/lib/6to5/transformers/_declarations.js b/lib/6to5/transformers/_declarations.js index 0090aa3d50..d6cf091dd5 100644 --- a/lib/6to5/transformers/_declarations.js +++ b/lib/6to5/transformers/_declarations.js @@ -1,12 +1,12 @@ -var b = require("../builders"); +var t = require("../types"); var _ = require("lodash"); module.exports = function (ast, file) { var body = ast.program.body; _.each(file.declarations, function (declar) { - body.unshift(b.variableDeclaration("var", [ - b.variableDeclarator(declar.uid, declar.node) + body.unshift(t.variableDeclaration("var", [ + t.variableDeclarator(declar.uid, declar.node) ])); }); }; diff --git a/lib/6to5/transformers/classes.js b/lib/6to5/transformers/classes.js index 628f09ff03..e651870d6e 100644 --- a/lib/6to5/transformers/classes.js +++ b/lib/6to5/transformers/classes.js @@ -1,12 +1,11 @@ var traverse = require("../traverse"); var util = require("../util"); -var b = require("../builders"); var t = require("../types"); var _ = require("lodash"); exports.ClassDeclaration = function (node, parent, file) { - return b.variableDeclaration("var", [ - b.variableDeclarator(node.id, buildClass(node, file)) + return t.variableDeclaration("var", [ + t.variableDeclarator(node.id, buildClass(node, file)) ]); }; @@ -23,7 +22,7 @@ var getMemberExpressionObject = function (node) { var buildClass = function (node, file) { var superName = node.superClass; - var className = node.id || b.identifier(file.generateUid("class")); + var className = node.id || t.identifier(file.generateUid("class")); var superClassArgument = node.superClass; var superClassCallee = node.superClass; @@ -33,7 +32,7 @@ var buildClass = function (node, file) { superClassArgument = superClassCallee = getMemberExpressionObject(superName); } else if (!t.isIdentifier(superName)) { superClassArgument = superName; - superClassCallee = superName = b.identifier(file.generateUid("ref")); + superClassCallee = superName = t.identifier(file.generateUid("ref")); } } @@ -50,7 +49,7 @@ var buildClass = function (node, file) { var returnStatement = body.pop(); if (superName) { - body.push(b.expressionStatement(b.callExpression(file.addDeclaration("extends"), [className, superName]))); + body.push(t.expressionStatement(t.callExpression(file.addDeclaration("extends"), [className, superName]))); container.arguments.push(superClassArgument); container.callee.params.push(superClassCallee); @@ -95,7 +94,7 @@ var buildClassBody = function (file, construct, body, className, superName, node if (kind === "") { kind = "value"; - util.pushMutatorMap(mutatorMap, methodName, "writable", b.identifier("true")); + util.pushMutatorMap(mutatorMap, methodName, "writable", t.identifier("true")); } util.pushMutatorMap(mutatorMap, methodName, kind, node); @@ -124,13 +123,13 @@ var buildClassBody = function (file, construct, body, className, superName, node } if (instanceProps || staticProps) { - staticProps = staticProps || b.literal(null); + staticProps = staticProps || t.literal(null); var args = [className, staticProps]; if (instanceProps) args.push(instanceProps); - body.push(b.expressionStatement( - b.callExpression(file.addDeclaration("class-props"), args) + body.push(t.expressionStatement( + t.callExpression(file.addDeclaration("class-props"), args) )); } }; @@ -140,32 +139,32 @@ var superIdentifier = function (superName, methodNode, methodName, node, parent) return; } else if (t.isCallExpression(parent) && parent.callee === node) { // super(); -> ClassName.prototype.MethodName.call(this); - parent.arguments.unshift(b.thisExpression()); + parent.arguments.unshift(t.thisExpression()); if (methodName === "constructor") { // constructor() { super(); } - return b.memberExpression(superName, b.identifier("call")); + return t.memberExpression(superName, t.identifier("call")); } else { node = superName; // foo() { super(); } if (!methodNode.static) { - node = b.memberExpression(node, b.identifier("prototype")); + node = t.memberExpression(node, t.identifier("prototype")); } - node = b.memberExpression(node, b.identifier(methodName)); - return b.memberExpression(node, b.identifier("call")); + node = t.memberExpression(node, t.identifier(methodName)); + return t.memberExpression(node, t.identifier("call")); } } else if (t.isMemberExpression(parent) && !methodNode.static) { // super.test -> ClassName.prototype.test - return b.memberExpression(superName, b.identifier("prototype")); + return t.memberExpression(superName, t.identifier("prototype")); } else { return superName; } }; var replaceInstanceSuperReferences = function (superName, method, methodNode, methodName) { - superName = superName || b.identifier("Function"); + superName = superName || t.identifier("Function"); traverse(method, function (node, parent) { if (t.isIdentifier(node) && node.name === "super") { @@ -177,7 +176,7 @@ var replaceInstanceSuperReferences = function (superName, method, methodNode, me // super.test(); -> ClassName.prototype.MethodName.call(this); callee.property.name = callee.property.name + ".call"; - node.arguments.unshift(b.thisExpression()); + node.arguments.unshift(t.thisExpression()); } }); }; diff --git a/lib/6to5/transformers/computed-property-names.js b/lib/6to5/transformers/computed-property-names.js index 1aeb9bcaa1..185503db86 100644 --- a/lib/6to5/transformers/computed-property-names.js +++ b/lib/6to5/transformers/computed-property-names.js @@ -1,5 +1,5 @@ var util = require("../util"); -var b = require("../builders"); +var t = require("../types"); var _ = require("lodash"); exports.ObjectExpression = function (node, parent, file) { @@ -33,10 +33,10 @@ exports.ObjectExpression = function (node, parent, file) { _.each(computed, function (prop) { containerBody.unshift( - b.expressionStatement( - b.assignmentExpression( + t.expressionStatement( + t.assignmentExpression( "=", - b.memberExpression(objId, prop.key, true), + t.memberExpression(objId, prop.key, true), prop.value ) ) diff --git a/lib/6to5/transformers/destructuring.js b/lib/6to5/transformers/destructuring.js index 3e987d602f..c57f0c7acf 100644 --- a/lib/6to5/transformers/destructuring.js +++ b/lib/6to5/transformers/destructuring.js @@ -1,13 +1,12 @@ -var b = require("../builders"); var t = require("../types"); var _ = require("lodash"); var buildVariableAssign = function (kind, id, init) { if (kind === false) { - return b.expressionStatement(b.assignmentExpression("=", id, init)); + return t.expressionStatement(t.assignmentExpression("=", id, init)); } else { - return b.variableDeclaration(kind, [ - b.variableDeclarator(id, init) + return t.variableDeclaration(kind, [ + t.variableDeclarator(id, init) ]); } }; @@ -27,7 +26,7 @@ var push = function (kind, nodes, elem, parentId) { var pushObjectPattern = function (kind, nodes, pattern, parentId) { _.each(pattern.properties, function (prop) { var pattern2 = prop.value; - var patternId2 = b.memberExpression(parentId, prop.key); + var patternId2 = t.memberExpression(parentId, prop.key); if (t.isPattern(pattern2)) { push(kind, nodes, pattern2, patternId2); @@ -41,17 +40,17 @@ var pushArrayPattern = function (kind, nodes, pattern, parentId) { _.each(pattern.elements, function (elem, i) { if (!elem) return; - var newPatternId = b.memberExpression(parentId, b.literal(i), true); + var newPatternId = t.memberExpression(parentId, t.literal(i), true); push(kind, nodes, elem, newPatternId); }); }; var pushPattern = function (kind, nodes, pattern, parentId, file) { if (parentId.type !== "MemberExpression" && parentId.type !== "Identifier") { - var key = b.identifier(file.generateUid("ref")); + var key = t.identifier(file.generateUid("ref")); - nodes.push(b.variableDeclaration("var", [ - b.variableDeclarator(key, parentId) + nodes.push(t.variableDeclaration("var", [ + t.variableDeclarator(key, parentId) ])); parentId = key; @@ -68,9 +67,9 @@ exports.ForOfStatement = function (node, parent, file) { var pattern = declar.declarations[0].id; if (!t.isPattern(pattern)) return; - var key = b.identifier(file.generateUid("ref")); - node.left = b.variableDeclaration(declar.kind, [ - b.variableDeclarator(key, null) + var key = t.identifier(file.generateUid("ref")); + node.left = t.variableDeclaration(declar.kind, [ + t.variableDeclarator(key, null) ]); var nodes = []; @@ -92,7 +91,7 @@ exports.Function = function (node, parent, file) { if (!t.isPattern(pattern)) return pattern; hasDestructuring = true; - var parentId = b.identifier(file.generateUid("ref")); + var parentId = t.identifier(file.generateUid("ref")); pushPattern("var", nodes, pattern, parentId, file); return parentId; }); @@ -113,9 +112,9 @@ exports.ExpressionStatement = function (node, parent, file) { var nodes = []; - var ref = b.identifier(file.generateUid("ref")); - nodes.push(b.variableDeclaration("var", [ - b.variableDeclarator(ref, expr.right) + var ref = t.identifier(file.generateUid("ref")); + nodes.push(t.variableDeclaration("var", [ + t.variableDeclarator(ref, expr.right) ])); push(false, nodes, expr.left, ref); @@ -151,7 +150,7 @@ exports.VariableDeclaration = function (node, parent, file) { var declar; _.each(nodes, function (node) { - declar = declar || b.variableDeclaration(node.kind, []); + declar = declar || t.variableDeclaration(node.kind, []); if (node.type !== "VariableDeclaration" && declar.kind !== node.kind) { throw file.errorWithNode(node, "Cannot use this node within the current parent"); diff --git a/lib/6to5/transformers/for-of.js b/lib/6to5/transformers/for-of.js index 587a06716b..798b1aa35a 100644 --- a/lib/6to5/transformers/for-of.js +++ b/lib/6to5/transformers/for-of.js @@ -1,19 +1,18 @@ var util = require("../util"); var t = require("../types"); -var b = require("../builders"); exports.ForOfStatement = function (node, parent, file) { var left = node.left; var declar; - var stepKey = b.identifier(file.generateUid("step")); - var stepValueId = b.memberExpression(stepKey, b.identifier("value")); + var stepKey = t.identifier(file.generateUid("step")); + var stepValueId = t.memberExpression(stepKey, t.identifier("value")); if (t.isIdentifier(left)) { - declar = b.expressionStatement(b.assignmentExpression("=", left, stepValueId)); + declar = t.expressionStatement(t.assignmentExpression("=", left, stepValueId)); } else if (t.isVariableDeclaration(left)) { - declar = b.variableDeclaration(left.kind, [ - b.variableDeclarator(left.declarations[0].id, stepValueId) + declar = t.variableDeclaration(left.kind, [ + t.variableDeclarator(left.declarations[0].id, stepValueId) ]); } else { return; diff --git a/lib/6to5/transformers/jsx.js b/lib/6to5/transformers/jsx.js index d4510b03be..bab915a59b 100644 --- a/lib/6to5/transformers/jsx.js +++ b/lib/6to5/transformers/jsx.js @@ -2,7 +2,6 @@ // https://github.com/RReverser/jsx-transpiler var esutils = require("esutils"); -var b = require("../builders"); var t = require("../types"); var _ = require("lodash"); @@ -18,8 +17,8 @@ exports.Program = function (node, parent, file) { }); // prebuilding AST node - file.jsx = jsx.split(".").map(b.identifier).reduce(function (object, property) { - return b.memberExpression(object, property); + file.jsx = jsx.split(".").map(t.identifier).reduce(function (object, property) { + return t.memberExpression(object, property); }); }; @@ -27,7 +26,7 @@ exports.XJSIdentifier = function (node) { if (esutils.keyword.isIdentifierName(node.name)) { node.type = "Identifier"; } else { - return b.literal(node.name); + return t.literal(node.name); } }; @@ -42,19 +41,14 @@ exports.XJSMemberExpression = { } }; -exports.XJSEmptyExpression = function (node) { - node.value = null; - node.type = "Literal"; -}; - exports.XJSExpressionContainer = function (node) { return node.expression; }; exports.XJSAttribute = { exit: function (node) { - var value = node.value || b.literal(true); - var propNode = b.property("init", node.name, value); + var value = node.value || t.literal(true); + var propNode = t.property("init", node.name, value); t.inherits(propNode, node); return propNode; } @@ -68,18 +62,18 @@ exports.XJSOpeningElement = { var tagName = tagExpr.name; if (/[a-z]/.exec(tagName[0]) || _.contains(tagName, "-")) { - tagExpr = b.memberExpression(file.jsx, tagExpr); + tagExpr = t.memberExpression(file.jsx, tagExpr); } } var props = node.attributes; if (props.length) { - props = b.objectExpression(props); + props = t.objectExpression(props); } else { - props = b.literal(null); + props = t.literal(null); } - return b.callExpression(tagExpr, [props]); + return t.callExpression(tagExpr, [props]); } }; diff --git a/lib/6to5/transformers/let-scoping.js b/lib/6to5/transformers/let-scoping.js index 157e46abf7..7859ce708b 100644 --- a/lib/6to5/transformers/let-scoping.js +++ b/lib/6to5/transformers/let-scoping.js @@ -1,7 +1,6 @@ var traverse = require("../traverse"); var util = require("../util"); var t = require("../types"); -var b = require("../builders"); var _ = require("lodash"); exports.VariableDeclaration = function (node, parent, file) { @@ -12,7 +11,7 @@ exports.VariableDeclaration = function (node, parent, file) { _.each(node.declarations, function (declar) { _.each(util.getIds(declar.id), function (id) { - ids[id] = b.identifier(file.generateUid(id)); + ids[id] = t.identifier(file.generateUid(id)); }); }); @@ -43,11 +42,11 @@ exports.VariableDeclaration = function (node, parent, file) { if (t.isFunctionDeclaration(node)) { throw new Error("`FunctionDeclaration`s that use `let` and `constant` references aren't allowed outside of the root scope"); } else { - var func = b.functionExpression(null, letReferences, b.blockStatement([ - b.returnStatement(node) + var func = t.functionExpression(null, letReferences, t.blockStatement([ + t.returnStatement(node) ])); func._aliasFunction = true; - return b.callExpression(func, letReferences); + return t.callExpression(func, letReferences); } } else { return false; diff --git a/lib/6to5/transformers/react.js b/lib/6to5/transformers/react.js index f98b0cc28d..95adf957ff 100644 --- a/lib/6to5/transformers/react.js +++ b/lib/6to5/transformers/react.js @@ -1,4 +1,3 @@ -var b = require("../builders"); var t = require("../types"); var _ = require("lodash"); @@ -34,7 +33,7 @@ var addDisplayName = function (id, call) { }); if (safe) { - props.unshift(b.property("init", b.identifier("displayName"), b.literal(id))); + props.unshift(t.property("init", t.identifier("displayName"), t.literal(id))); } }; diff --git a/lib/6to5/transformers/rest-parameters.js b/lib/6to5/transformers/rest-parameters.js index 7f020a79f0..c77055f010 100644 --- a/lib/6to5/transformers/rest-parameters.js +++ b/lib/6to5/transformers/rest-parameters.js @@ -1,6 +1,5 @@ var util = require("../util"); var t = require("../types"); -var b = require("../builders"); exports.Function = function (node, parent, file) { if (!node.rest) return; @@ -16,7 +15,7 @@ exports.Function = function (node, parent, file) { var template = util.template(templateName, { SLICE_KEY: file.addDeclaration("slice"), VARIABLE_NAME: rest, - SLICE_ARG: b.literal(node.params.length) + SLICE_ARG: t.literal(node.params.length) }); template.declarations[0].init.arguments[0]._ignoreAliasFunctions = true; diff --git a/lib/6to5/transformers/spread.js b/lib/6to5/transformers/spread.js index 01100cb48b..3fefe8c7fb 100644 --- a/lib/6to5/transformers/spread.js +++ b/lib/6to5/transformers/spread.js @@ -1,5 +1,4 @@ var util = require("../util"); -var b = require("../builders"); var t = require("../types"); var _ = require("lodash"); @@ -32,7 +31,7 @@ var build = function (props, file) { var push = function () { if (!_props.length) return; - nodes.push(b.arrayExpression(_props)); + nodes.push(t.arrayExpression(_props)); _props = []; }; @@ -59,14 +58,14 @@ exports.ArrayExpression = function (node, parent, file) { if (!nodes.length) return first; - return b.callExpression(b.memberExpression(first, b.identifier("concat")), nodes); + return t.callExpression(t.memberExpression(first, t.identifier("concat")), nodes); }; exports.CallExpression = function (node, parent, file) { var args = node.arguments; if (!hasSpread(args)) return; - var contextLiteral = b.literal(null); + var contextLiteral = t.literal(null); node.arguments = []; @@ -74,7 +73,7 @@ exports.CallExpression = function (node, parent, file) { var first = nodes.shift(); if (nodes.length) { - node.arguments.push(b.callExpression(b.memberExpression(first, b.identifier("concat")), nodes)); + node.arguments.push(t.callExpression(t.memberExpression(first, t.identifier("concat")), nodes)); } else { node.arguments.push(first); } @@ -85,14 +84,14 @@ exports.CallExpression = function (node, parent, file) { contextLiteral = callee.object; if (callee.computed) { - callee.object = b.memberExpression(callee.object, callee.property, true); - callee.property = b.identifier("apply"); + callee.object = t.memberExpression(callee.object, callee.property, true); + callee.property = t.identifier("apply"); callee.computed = false; } else { - callee.property = b.memberExpression(callee.property, b.identifier("apply")); + callee.property = t.memberExpression(callee.property, t.identifier("apply")); } } else { - node.callee = b.memberExpression(node.callee, b.identifier("apply")); + node.callee = t.memberExpression(node.callee, t.identifier("apply")); } node.arguments.unshift(contextLiteral); diff --git a/lib/6to5/transformers/template-literals.js b/lib/6to5/transformers/template-literals.js index 869a42ed64..69393bed11 100644 --- a/lib/6to5/transformers/template-literals.js +++ b/lib/6to5/transformers/template-literals.js @@ -1,9 +1,8 @@ var t = require("../types"); -var b = require("../builders"); var _ = require("lodash"); var buildBinaryExpression = function (left, right) { - return b.binaryExpression("+", left, right); + return t.binaryExpression("+", left, right); }; exports.TaggedTemplateExpression = function (node) { @@ -11,22 +10,22 @@ exports.TaggedTemplateExpression = function (node) { var quasi = node.quasi; var strings = quasi.quasis.map(function (elem) { - return b.literal(elem.value.raw); + return t.literal(elem.value.raw); }); - args.push(b.arrayExpression(strings)); + args.push(t.arrayExpression(strings)); _.each(quasi.expressions, function (expr) { args.push(expr); }); - return b.callExpression(node.tag, args); + return t.callExpression(node.tag, args); }; exports.TemplateLiteral = function (node) { var nodes = []; _.each(node.quasis, function (elem) { - nodes.push(b.literal(elem.value.raw)); + nodes.push(t.literal(elem.value.raw)); var expr = node.expressions.shift(); if (expr) nodes.push(expr); diff --git a/lib/6to5/transformers/use-strict.js b/lib/6to5/transformers/use-strict.js index c116c0990c..39ca63eff5 100644 --- a/lib/6to5/transformers/use-strict.js +++ b/lib/6to5/transformers/use-strict.js @@ -1,4 +1,4 @@ -var b = require("../builders"); +var t = require("../types"); module.exports = function (ast) { var body = ast.program.body; @@ -7,6 +7,6 @@ module.exports = function (ast) { var noStrict = !first || first.type !== "ExpressionStatement" || first.expression.type !== "Literal" || first.expression.value !== "use strict"; if (noStrict) { - body.unshift(b.expressionStatement(b.literal("use strict"))); + body.unshift(t.expressionStatement(t.literal("use strict"))); } }; diff --git a/lib/6to5/types/alias-keys.json b/lib/6to5/types/alias-keys.json new file mode 100644 index 0000000000..9917eb42d1 --- /dev/null +++ b/lib/6to5/types/alias-keys.json @@ -0,0 +1,22 @@ +{ + "ArrowFunctionExpression": ["Function"], + "FunctionDeclaration": ["Function"], + "FunctionExpression": ["Function"], + + "LogicalExpression": ["Binary"], + "BinaryExpression": ["Binary"], + + "UnaryExpression": ["UnaryLike"], + "SpreadProperty": ["UnaryLike"], + "SpreadElement": ["UnaryLike"], + + "ClassDeclaration": ["Class"], + "ClassExpression": ["Class"], + + "ForOfStatement": ["For"], + "ForInStatement": ["For"], + "ForStatement": ["For"], + + "ObjectPattern": ["Pattern"], + "ArrayPattern": ["Pattern"] +} diff --git a/lib/6to5/types/builder-keys.json b/lib/6to5/types/builder-keys.json new file mode 100644 index 0000000000..c7f0695560 --- /dev/null +++ b/lib/6to5/types/builder-keys.json @@ -0,0 +1,18 @@ +{ + "ArrayExpression": ["elements"], + "AssignmentExpression": ["operator", "left", "right"], + "BinaryExpression": ["operator", "left", "right"], + "BlockStatement": ["body"], + "CallExpression": ["callee", "arguments"], + "ExpressionStatement": ["expression"], + "FunctionExpression": ["id", "params", "body"], + "Identifier": ["name"], + "IfStatement": ["test", "consequent", "alternate"], + "Literal": ["value"], + "MemberExpression": ["object", "property", "computed"], + "ObjectExpression": ["properties"], + "Property": ["kind", "key", "value"], + "ReturnStatement": ["argument"], + "VariableDeclaration": ["kind", "declarations"], + "VariableDeclarator": ["id", "init"] +} diff --git a/lib/6to5/types.js b/lib/6to5/types/index.js similarity index 82% rename from lib/6to5/types.js rename to lib/6to5/types/index.js index f42d6d9159..cc071629c1 100644 --- a/lib/6to5/types.js +++ b/lib/6to5/types/index.js @@ -1,5 +1,4 @@ -var traverse = require("./traverse"); -var b = require("./builders"); +var traverse = require("../traverse"); var n = require("acorn-ast-types").namedTypes; var _ = require("lodash"); @@ -13,30 +12,41 @@ _.each(traverse.VISITOR_KEYS, function (keys, type) { }; }); -var buildIs = function (isKey, typeKey, types) { - t[typeKey + "_TYPES"] = types; +// - t["is" + isKey] = function (node) { - return node && _.contains(types, node.type); +t.BUILDER_KEYS = _.defaults(require("./builder-keys"), traverse.VISITOR_KEYS); + +_.each(t.BUILDER_KEYS, function (keys, type) { + t[type[0].toLowerCase() + type.slice(1)] = function () { + var args = arguments; + var node = { type: type }; + _.each(keys, function (key, i) { + node[key] = args[i]; + }); + return node; }; -}; - -buildIs("Function", "FUNCTION", ["ArrowFunctionExpression", "FunctionDeclaration", "FunctionExpression"]); -buildIs("Class", "CLASS", ["ClassDeclaration", "ClassExpression"]); -buildIs("Pattern", "PATTERN", ["ArrayPattern", "ObjectPattern"]); -buildIs("Binary", "BINARY", ["BinaryExpression", "LogicalExpression"]); -buildIs("UnaryLike", "UNARY", ["UnaryExpression", "SpreadElement", "SpreadProperty"]); +}); // -t.aliases = { - ArrowFunctionExpression: ["Function"], - FunctionDeclaration: ["Function"], - FunctionExpression: ["Function"], +t.ALIAS_KEYS = require("./alias-keys"); - ClassDeclaration: ["Class"], - ClassExpression: ["Class"] -}; +var _aliases = {}; + +_.each(t.ALIAS_KEYS, function (aliases, type) { + _.each(aliases, function (alias) { + var types = _aliases[alias] = _aliases[alias] || []; + types.push(type); + }); +}); + +_.each(_aliases, function (types, type) { + t[type.toUpperCase() + "_TYPES"] = types; + + t["is" + type] = function (node) { + return node && _.contains(types, node.type); + }; +}); // @@ -70,16 +80,16 @@ t.toBlock = function (node, parent) { if (!_.isArray(node)) { if (!n.Statement.check(node)) { if (t.isFunction(parent)) { - node = b.returnStatement(node); + node = t.returnStatement(node); } else { - node = b.expressionStatement(node); + node = t.expressionStatement(node); } } node = [node]; } - return b.blockStatement(node); + return t.blockStatement(node); }; t.inherits = function (child, parent) { @@ -101,7 +111,11 @@ t.needsWhitespace = function (node, expression) { // - if (t.isFunction(node) || t.isClass(node)) { + if (t.isFunction(node) || t.isClass(node) || t.isFor(node) || t.isSwitchStatement(node)) { + return true; + } + + if (t.isIfStatement(node) && t.isBlockStatement(node.consequent)) { return true; } @@ -128,6 +142,10 @@ t.needsWhitespace = function (node, expression) { exprs = node.elements; } + if (t.isObjectExpression(node)) { + exprs = node.properties; + } + return exprs.some(function (expr) { return t.needsWhitespace(expr, true); }); diff --git a/lib/6to5/util.js b/lib/6to5/util.js index 5e1eb5ebac..af2b740605 100644 --- a/lib/6to5/util.js +++ b/lib/6to5/util.js @@ -5,7 +5,6 @@ var path = require("path"); var util = require("util"); var fs = require("fs"); var t = require("./types"); -var b = require("./builders"); var _ = require("lodash"); _.extend(estraverse.VisitorKeys, traverse.VISITOR_KEYS); @@ -37,7 +36,7 @@ exports.getUid = function (parent, file) { if (t.isIdentifier(node)) id = node.name; - return b.identifier(file.generateUid(id)); + return t.identifier(file.generateUid(id)); }; exports.isAbsolute = function (loc) { @@ -100,17 +99,17 @@ exports.pushMutatorMap = function (mutatorMap, key, kind, method) { }; exports.buildDefineProperties = function (mutatorMap) { - var objExpr = b.objectExpression([]); + var objExpr = t.objectExpression([]); _.each(mutatorMap, function (map, key) { - var mapNode = b.objectExpression([]); + var mapNode = t.objectExpression([]); - var propNode = b.property("init", b.identifier(key), mapNode); + var propNode = t.property("init", t.identifier(key), mapNode); _.each(map, function (node, key) { node = _.clone(node); if (t.isMethodDefinition(node)) node = node.value; - mapNode.properties.push(b.property("init", b.identifier(key), node)); + mapNode.properties.push(t.property("init", t.identifier(key), node)); }); objExpr.properties.push(propNode); @@ -250,7 +249,7 @@ try { if (!fs.existsSync(templatesLoc)) { throw new Error("no templates directory - this is most likely the result" + " of a broken `npm publish`. Please report to " + - "https://github.com/sebmck/6to5/issues"); + "https://githut.com/sebmck/6to5/issues"); } _.each(fs.readdirSync(templatesLoc), function (name) {