diff --git a/lib/6to5/transformers/array-comprehension.js b/lib/6to5/transformers/array-comprehension.js index cf553a688d..f7ba4ba315 100644 --- a/lib/6to5/transformers/array-comprehension.js +++ b/lib/6to5/transformers/array-comprehension.js @@ -1,29 +1,21 @@ var util = require("../util"); var _ = require("lodash"); -exports.ComprehensionExpression = function (node, parent, opts, generateUid) { - var blocks = node.blocks; +var single = function (node) { + var block = node.blocks[0]; - _.each(blocks, function (block) { - if (!block.of) { - throw util.errorWithNode(block, "for-in array comprehension is not supported"); - } + var templateName = "array-comprehension-map"; + if (node.filter) templateName = "array-comprehension-filter"; + + return util.template(templateName, { + STATEMENT: node.body, + FILTER: node.filter, + ARRAY: block.right, + KEY: block.left }); +}; - if (blocks.length === 1) { - var block = blocks[0]; - - var templateName = "array-comprehension-map"; - if (node.filter) templateName += "-filter"; - - return util.template(templateName, { - ARRAY: block.right, - KEY: block.left, - FILTER: node.filter, - STATEMENT: node.body - }); - } - +var multiple = function (node, generateUid) { var uid = generateUid("arr"); var container = util.template("array-comprehension-container", { @@ -36,7 +28,7 @@ exports.ComprehensionExpression = function (node, parent, opts, generateUid) { var returnStatement = body.pop(); var build = function () { - var self = blocks.shift(); + var self = node.blocks.shift(); if (!self) return; var child = build(); @@ -44,8 +36,8 @@ exports.ComprehensionExpression = function (node, parent, opts, generateUid) { // last item child = util.template("array-push", { - KEY: uid, - STATEMENT: node.body + STATEMENT: node.body, + KEY: uid }, true); // add a filter as this is our final stop @@ -60,7 +52,7 @@ exports.ComprehensionExpression = function (node, parent, opts, generateUid) { var container2 = util.template("array-comprehension-for-each", { ARRAY: self.right, - KEY: self.left + KEY: self.left }, true); container2.expression.arguments[0].body.body = [child]; return container2; @@ -71,3 +63,17 @@ exports.ComprehensionExpression = function (node, parent, opts, generateUid) { return container; }; + +exports.ComprehensionExpression = function (node, parent, opts, generateUid) { + _.each(node.blocks, function (block) { + if (!block.of) { + throw util.errorWithNode(block, "for-in array comprehension is not supported"); + } + }); + + if (node.blocks.length === 1) { + return single(node); + } else { + return multiple(node, generateUid); + } +}; diff --git a/lib/6to5/transformers/arrow-functions.js b/lib/6to5/transformers/arrow-functions.js index 558cd8388d..bf91af9915 100644 --- a/lib/6to5/transformers/arrow-functions.js +++ b/lib/6to5/transformers/arrow-functions.js @@ -1,18 +1,15 @@ var traverse = require("../traverse"); var util = require("../util"); +var b = require("ast-types").builders; exports.ArrowFunctionExpression = function (node) { var body = node.body; // expression body if (body.type !== "BlockStatement") { - body = { - type: "BlockStatement", - body: [{ - type: "ReturnStatement", - argument: body - }] - }; + body = b.blockStatement([ + b.returnStatement(body) + ]); } node.expression = false; diff --git a/lib/6to5/transformers/block-binding.js b/lib/6to5/transformers/block-binding.js index ee53ae3a38..ca7104dae1 100644 --- a/lib/6to5/transformers/block-binding.js +++ b/lib/6to5/transformers/block-binding.js @@ -1,9 +1,10 @@ var traverse = require("../traverse"); var util = require("../util"); +var b = require("ast-types").builders; var _ = require("lodash"); var isLet = function (node) { - if (node.type === "VariableDeclaration" && node.kind === "let") { + if (node && node.type === "VariableDeclaration" && node.kind === "let") { node.kind = "var"; node._ignoreBlockBindingHoist = true; return true; @@ -54,16 +55,14 @@ var buildNode = function (node) { if (node._ignoreBlockBindingHoist) return node; if (node.type === "VariableDeclaration" && node.kind === "var") { - _.each(node.declarations, function (declar) { - nodes.push(util.template("variable-declare", { - KEY: declar.id - })); - }); + nodes.push(b.variableDeclaration("var", node.declarations.map(function (declar) { + return b.variableDeclarator(declar.id, null); + }))); return node.declarations.map(function (declar) { return util.template("assign", { - KEY: declar.id, - VALUE: declar.init + VALUE: declar.init, + KEY: declar.id }, true); }); } else if (node.type === "ForInStatement" && !node.left._ignoreBlockBindingHoist) { @@ -79,15 +78,9 @@ var buildNode = function (node) { // - var func = { - type: "FunctionExpression", - params: [], - defaults: [], - body: { - type: "BlockStatement", - body: node - } - }; + var block = b.blockStatement([]); + block.body = node; + var func = b.functionExpression(null, [], block, false) var templateName = "function-call"; if (traverse.hasType(node, "ThisExpression")) { diff --git a/lib/6to5/transformers/classes.js b/lib/6to5/transformers/classes.js index 08163a1681..f42c0e09cd 100644 --- a/lib/6to5/transformers/classes.js +++ b/lib/6to5/transformers/classes.js @@ -1,5 +1,6 @@ var traverse = require("../traverse"); var util = require("../util"); +var b = require("ast-types").builders; var _ = require("lodash"); exports.ClassDeclaration = function (node) { @@ -47,7 +48,7 @@ var buildClassBody = function (body, className, superName, node) { if (node.kind === "") { addConstructor(body[0], method); } else { - throw new Error("unknown kind for constructor method"); + throw util.errorWithNode(node, "unknown kind for constructor method"); } } else { if (node.kind === "") { @@ -69,29 +70,27 @@ var buildClassBody = function (body, className, superName, node) { var superIdentifier = function (superName, node, parent) { if (parent.property === node) return; - if (!superName) return; - node.name = superName.name; + node.name = superName.name || superName.value; // super(); -> ClassName.call(this); if (parent.type === "CallExpression" && parent.callee === node) { node.name += ".call"; - parent.arguments.unshift({ - type: "ThisExpression" - }); + parent.arguments.unshift(b.thisExpression()); } }; var replaceInstanceSuperReferences = function (superName, method) { + superName = superName || b.literal("Function"); + traverse(method, function (node, parent) { if (node.type === "Identifier" && node.name === "super") { superIdentifier(superName, node, parent); } else if (node.type === "MemberExpression") { // no accessing of super properties - if (isAccessingSuperProperties(parent, node)) { - throw new Error("cannot access super properties"); + throw util.errorWithNode(node, "cannot access super properties"); } else { return; } @@ -101,16 +100,10 @@ var replaceInstanceSuperReferences = function (superName, method) { if (callee.object.name !== "super") return; callee.property.name = "prototype." + callee.property.name + ".call"; - node.arguments.unshift({ - type: "ThisExpression" - }); + node.arguments.unshift(b.thisExpression()); } else { return; } - - if (!superName) { - throw new Error("cannot access super as this class has none"); - } }); }; diff --git a/lib/6to5/transformers/default-parameters.js b/lib/6to5/transformers/default-parameters.js index aaf8bdc024..7ecf39c72f 100644 --- a/lib/6to5/transformers/default-parameters.js +++ b/lib/6to5/transformers/default-parameters.js @@ -1,6 +1,7 @@ var util = require("../util"); var _ = require("lodash"); +exports.FunctionDeclaration = exports.FunctionExpression = function (node) { _.each(node.defaults, function (def, i) { if (!def) return; diff --git a/lib/6to5/transformers/destructuring.js b/lib/6to5/transformers/destructuring.js index db58ddb879..bb6e714e17 100644 --- a/lib/6to5/transformers/destructuring.js +++ b/lib/6to5/transformers/destructuring.js @@ -1,4 +1,5 @@ var util = require("../util"); +var b = require("ast-types").builders; var _ = require("lodash"); var isPattern = function (id) { @@ -20,15 +21,9 @@ exports.VariableDeclaration = function (node, parent, opts, generateUid) { // var buildVariableAssign = function (id, init) { - return { - type: "VariableDeclaration", - kind: node.kind, - declarations: [{ - type: "VariableDeclarator", - id: id, - init: init - }] - }; + return b.variableDeclaration(node.kind, [ + b.variableDeclarator(id, init) + ]); }; var push = function (pattern, parentId) { @@ -43,11 +38,7 @@ exports.VariableDeclaration = function (node, parent, opts, generateUid) { _.each(pattern.properties, function (prop) { var id = prop.value; - var init = { - type: "MemberExpression", - object: parentId, - property: prop.key - }; + var init = b.memberExpression(parentId, prop.key, false); if (isPattern(id)) { push(id, init); @@ -59,15 +50,7 @@ exports.VariableDeclaration = function (node, parent, opts, generateUid) { var pushArrayPattern = function (pattern, parentId) { _.each(pattern.elements, function (id, i) { - var init = { - type: "MemberExpression", - computed: true, - object: parentId, - property: { - type: "Literal", - value: i - } - }; + var init = b.memberExpression(parentId, b.literal(i), true); if (id.type === "Identifier") { nodes.push(buildVariableAssign(id, init)); @@ -86,10 +69,7 @@ exports.VariableDeclaration = function (node, parent, opts, generateUid) { VALUE: init }, true)); - init = { - type: "Identifier", - name: key - }; + init = b.identifier(key); } push(id, init); diff --git a/lib/6to5/transformers/for-of.js b/lib/6to5/transformers/for-of.js index b1ac7426ea..8b18294647 100644 --- a/lib/6to5/transformers/for-of.js +++ b/lib/6to5/transformers/for-of.js @@ -3,18 +3,16 @@ var util = require("../util"); exports.ForOfStatement = function (node, parent, opts, generateUid) { var node2 = util.template("for-of", { ITERATOR_KEY: generateUid("iterator"), - STEP_KEY: generateUid("step"), - - KEY: node.left.declarations[0].id, - OBJECT: node.right + STEP_KEY: generateUid("step"), + OBJECT: node.right, + KEY: node.left.declarations[0].id }); - var block = node2.body; - - var declar = block.body[0]; - declar.kind = node.left.kind; - + var block = node2.body; block.body = block.body.concat(node.body.body); + var declar = block.body[0]; + declar.kind = node.left.kind; + return node2; }; diff --git a/lib/6to5/transformers/modules.js b/lib/6to5/transformers/modules.js index 3dfda826d1..be4b1b4c93 100644 --- a/lib/6to5/transformers/modules.js +++ b/lib/6to5/transformers/modules.js @@ -1,4 +1,5 @@ var util = require("../util"); +var b = require("ast-types").builders; var _ = require("lodash"); exports.ImportDeclaration = function (node) { @@ -35,15 +36,22 @@ exports.ExportDeclaration = function (node) { _.each(node.specifiers, function (specifier) { var variableName = specifier.name || specifier.id; - if (specifier.type === "ExportBatchSpecifier") { - nodes.push(util.template("exports-wildcard", { - MODULE_NAME: node.source - }, true)); + if (node.source) { + if (specifier.type === "ExportBatchSpecifier") { + nodes.push(util.template("exports-wildcard", { + MODULE_NAME: node.source + }, true)); + } else { + nodes.push(util.template("exports-require-assign-key", { + VARIABLE_NAME: variableName.name, + MODULE_NAME: node.source, + KEY: specifier.id + }, true)); + } } else { - nodes.push(util.template("exports-require-assign-key", { - VARIABLE_NAME: variableName.name, - MODULE_NAME: node.source, - KEY: specifier.id.name + nodes.push(util.template("exports-assign", { + VALUE: specifier.id, + KEY: specifier.id }, true)); } }); @@ -61,10 +69,7 @@ exports.ExportDeclaration = function (node) { _.each(declar.declarations, function (declar) { nodes.push(util.template("exports-alias-var", { - STRING_KEY: { - type: "Literal", - value: declar.id.name - }, + STRING_KEY: b.literal(declar.id.name), KEY: declar.id }, true)); }); diff --git a/lib/6to5/transformers/property-method-assignment.js b/lib/6to5/transformers/property-method-assignment.js index 90a1386d3d..8ed7f130f2 100644 --- a/lib/6to5/transformers/property-method-assignment.js +++ b/lib/6to5/transformers/property-method-assignment.js @@ -1,4 +1,5 @@ var util = require("../util"); +var b = require("ast-types").builders; var _ = require("lodash"); exports.Property = function (node) { @@ -6,9 +7,6 @@ exports.Property = function (node) { }; exports.ObjectExpression = function (node) { - //if (node.ignorePropertyMethods) return; - //node.ignorePropertyMethods = true; - var mutatorMap = {}; node.properties = node.properties.filter(function (prop) { @@ -24,9 +22,6 @@ exports.ObjectExpression = function (node) { return util.template("object-define-properties-closure", { OBJECT: node, - CONTENT: util.buildDefineProperties(mutatorMap, { - type: "Identifier", - name: "obj" - }).expression + CONTENT: util.buildDefineProperties(mutatorMap, b.identifier("obj")).expression }); }; diff --git a/lib/6to5/transformers/rest-parameters.js b/lib/6to5/transformers/rest-parameters.js index ee229e3d6c..85b5e4cdad 100644 --- a/lib/6to5/transformers/rest-parameters.js +++ b/lib/6to5/transformers/rest-parameters.js @@ -1,5 +1,7 @@ var util = require("../util"); +var b = require("ast-types").builders; +exports.FunctionDeclaration = exports.FunctionExpression = function (node) { if (!node.rest) return; @@ -11,9 +13,6 @@ exports.FunctionExpression = function (node) { node.body.body.unshift(util.template(templateName, { VARIABLE_NAME: rest, - SLICE_ARG: { - type: "Literal", - value: node.params.length - } + SLICE_ARG: b.literal(node.params.length) })); }; diff --git a/lib/6to5/transformers/spread.js b/lib/6to5/transformers/spread.js index dea623d8a1..ee8e1a2c4a 100644 --- a/lib/6to5/transformers/spread.js +++ b/lib/6to5/transformers/spread.js @@ -1,4 +1,5 @@ var util = require("../util"); +var b = require("ast-types").builders; var _ = require("lodash"); exports.ArrayExpression = function (node) { @@ -28,12 +29,8 @@ exports.CallExpression = function (node) { if (args.length && _.last(args).type === "SpreadElement") { var spread = args.pop(); - var spreadLiteral = spread.argument; - - var contextLiteral = { - type: "Literal", - value: null - }; + var spreadLiteral = spread.argument; + var contextLiteral = b.literal(null); node.arguments = []; diff --git a/lib/6to5/transformers/template-literals.js b/lib/6to5/transformers/template-literals.js index 37e5feb75a..bd42449c09 100644 --- a/lib/6to5/transformers/template-literals.js +++ b/lib/6to5/transformers/template-literals.js @@ -1,22 +1,15 @@ +var b = require("ast-types").builders; var _ = require("lodash"); var buildBinaryExpression = function (left, right) { - return { - type: "BinaryExpression", - operator: "+", - left: left, - right: right - }; + return b.binaryExpression("+", left, right); }; exports.TemplateLiteral = function (node) { var nodes = []; _.each(node.quasis, function (elem) { - nodes.push({ - type: "Literal", - value: elem.value.raw - }); + nodes.push(b.literal(elem.value.raw)); var expr = node.expressions.shift(); if (expr) nodes.push(expr);