diff --git a/lib/6to5/transformation/transformers/es6/destructuring.js b/lib/6to5/transformation/transformers/es6/destructuring.js index 34e9895a81..172ffd66d9 100644 --- a/lib/6to5/transformation/transformers/es6/destructuring.js +++ b/lib/6to5/transformation/transformers/es6/destructuring.js @@ -6,8 +6,17 @@ var t = require("../../../types"); exports.check = t.isPattern; -var buildVariableAssign = function (opts, id, init) { - var op = opts.operator; +function Destructuring(opts) { + this.blockHoist = opts.blockHoist; + this.operator = opts.operator; + this.nodes = opts.nodes; + this.scope = opts.scope; + this.file = opts.file; + this.kind = opts.kind; +} + + Destructuring.prototype.buildVariableAssignment = function (id, init) { + var op = this.operator; if (t.isMemberExpression(id)) op = "="; var node; @@ -15,47 +24,46 @@ var buildVariableAssign = function (opts, id, init) { if (op) { node = t.expressionStatement(t.assignmentExpression(op, id, init)); } else { - node = t.variableDeclaration(opts.kind, [ + node = t.variableDeclaration(this.kind, [ t.variableDeclarator(id, init) ]); } - node._blockHoist = opts.blockHoist; + node._blockHoist = this.blockHoist; return node; }; -var buildVariableDeclar = function (opts, id, init) { + Destructuring.prototype.buildVariableDeclaration = function (id, init) { var declar = t.variableDeclaration("var", [ t.variableDeclarator(id, init) ]); - declar._blockHoist = opts.blockHoist; + declar._blockHoist = this.blockHoist; return declar; }; -var push = function (opts, nodes, elem, parentId) { + Destructuring.prototype.push = function (elem, parentId) { if (t.isObjectPattern(elem)) { - pushObjectPattern(opts, nodes, elem, parentId); + this.pushObjectPattern(elem, parentId); } else if (t.isArrayPattern(elem)) { - pushArrayPattern(opts, nodes, elem, parentId); + this.pushArrayPattern(elem, parentId); } else if (t.isAssignmentPattern(elem)) { - pushAssignmentPattern(opts, nodes, elem, parentId); + this.pushAssignmentPattern(elem, parentId); } else { - nodes.push(buildVariableAssign(opts, elem, parentId)); + this.nodes.push(this.buildVariableAssignment(elem, parentId)); } }; -var pushAssignmentPattern = function (opts, nodes, pattern, parentId) { - var tempParentId = opts.scope.generateUidBasedOnNode(parentId, opts.file); + Destructuring.prototype.pushAssignmentPattern = function (pattern, parentId) { + var tempParentId = this.scope.generateUidBasedOnNode(parentId); var declar = t.variableDeclaration("var", [ t.variableDeclarator(tempParentId, parentId) ]); - declar._blockHoist = opts.blockHoist; - nodes.push(declar); + declar._blockHoist = this.blockHoist; + this.nodes.push(declar); - nodes.push(buildVariableAssign( - opts, + this.nodes.push(this.buildVariableAssignment( pattern.left, t.conditionalExpression( t.binaryExpression("===", tempParentId, t.identifier("undefined")), @@ -65,10 +73,10 @@ var pushAssignmentPattern = function (opts, nodes, pattern, parentId) { )); }; -var pushObjectPattern = function (opts, nodes, pattern, parentId) { + Destructuring.prototype.pushObjectPattern = function (pattern, parentId) { if (!pattern.properties.length) { - nodes.push(t.expressionStatement( - t.callExpression(opts.file.addHelper("object-destructuring-empty"), [parentId]) + this.nodes.push(t.expressionStatement( + t.callExpression(this.file.addHelper("object-destructuring-empty"), [parentId]) )); } @@ -91,8 +99,8 @@ var pushObjectPattern = function (opts, nodes, pattern, parentId) { } keys = t.arrayExpression(keys); - var value = t.callExpression(opts.file.addHelper("object-without-properties"), [parentId, keys]); - nodes.push(buildVariableAssign(opts, prop.argument, value)); + var value = t.callExpression(this.file.addHelper("object-without-properties"), [parentId, keys]); + this.nodes.push(this.buildVariableAssignment(prop.argument, value)); } else { if (t.isLiteral(prop.key)) prop.computed = true; @@ -100,15 +108,15 @@ var pushObjectPattern = function (opts, nodes, pattern, parentId) { var patternId2 = t.memberExpression(parentId, prop.key, prop.computed); if (t.isPattern(pattern2)) { - push(opts, nodes, pattern2, patternId2); + this.push(pattern2, patternId2); } else { - nodes.push(buildVariableAssign(opts, pattern2, patternId2)); + this.nodes.push(this.buildVariableAssignment(pattern2, patternId2)); } } } }; -var pushArrayPattern = function (opts, nodes, pattern, parentId) { + Destructuring.prototype.pushArrayPattern = function (pattern, parentId) { if (!pattern.elements) return; var i; @@ -121,10 +129,10 @@ var pushArrayPattern = function (opts, nodes, pattern, parentId) { } } - var toArray = opts.file.toArray(parentId, !hasRest && pattern.elements.length); + var toArray = this.file.toArray(parentId, !hasRest && pattern.elements.length); - var _parentId = opts.scope.generateUidBasedOnNode(parentId, opts.file); - nodes.push(buildVariableDeclar(opts, _parentId, toArray)); + var _parentId = this.scope.generateUidBasedOnNode(parentId, this.file); + this.nodes.push(this.buildVariableDeclaration(_parentId, toArray)); parentId = _parentId; for (i = 0; i < pattern.elements.length; i++) { @@ -136,7 +144,7 @@ var pushArrayPattern = function (opts, nodes, pattern, parentId) { var newPatternId; if (t.isRestElement(elem)) { - newPatternId = opts.file.toArray(parentId); + newPatternId = this.file.toArray(parentId); if (i > 0) { newPatternId = t.callExpression(t.memberExpression(newPatternId, t.identifier("slice")), [t.literal(i)]); @@ -147,23 +155,18 @@ var pushArrayPattern = function (opts, nodes, pattern, parentId) { newPatternId = t.memberExpression(parentId, t.literal(i), true); } - push(opts, nodes, elem, newPatternId); + this.push(elem, newPatternId); } }; -var pushPattern = function (opts) { - var nodes = opts.nodes; - var pattern = opts.pattern; - var parentId = opts.id; - var scope = opts.scope; - + Destructuring.prototype.init = function (pattern, parentId) { if (!t.isArrayExpression(parentId) && !t.isMemberExpression(parentId) && !t.isIdentifier(parentId)) { - var key = scope.generateUidBasedOnNode(parentId); - nodes.push(buildVariableDeclar(opts, key, parentId)); + var key = this.scope.generateUidBasedOnNode(parentId); + this.nodes.push(this.buildVariableDeclaration(key, parentId)); parentId = key; } - push(opts, nodes, pattern, parentId); + this.push(pattern, parentId); }; exports.ForInStatement = @@ -181,11 +184,13 @@ exports.ForOfStatement = function (node, parent, scope, context, file) { var nodes = []; - push({ + var destructuring = new Destructuring({ kind: declar.kind, file: file, - scope: scope - }, nodes, pattern, key); + scope: scope, + nodes: nodes + }); + destructuring.init(pattern, key); t.ensureBlock(node); @@ -204,15 +209,14 @@ exports.Function = function (node, parent, scope, context, file) { hasDestructuring = true; var parentId = scope.generateUidIdentifier("ref"); - pushPattern({ + var destructuring = new Destructuring({ blockHoist: node.params.length - i, - pattern: pattern, nodes: nodes, scope: scope, file: file, kind: "var", - id: parentId }); + destructuring.init(pattern, parentId); return parentId; }); @@ -234,11 +238,13 @@ exports.CatchClause = function (node, parent, scope, context, file) { var nodes = []; - push({ + var destructuring = new Destructuring({ kind: "var", file: file, - scope: scope - }, nodes, pattern, ref); + scope: scope, + nodes: nodes + }); + destructuring.init(pattern, ref); node.body.body = nodes.concat(node.body.body); }; @@ -256,11 +262,13 @@ exports.ExpressionStatement = function (node, parent, scope, context, file) { t.variableDeclarator(ref, expr.right) ])); - push({ + var destructuring = new Destructuring({ operator: expr.operator, file: file, - scope: scope - }, nodes, expr.left, ref); + scope: scope, + nodes: nodes + }); + destructuring.init(expr.left, ref); return nodes; }; @@ -277,11 +285,13 @@ exports.AssignmentExpression = function (node, parent, scope, context, file) { var nodes = []; nodes.push(t.assignmentExpression("=", ref, node.right)); - push({ + var destructuring = new Destructuring({ operator: node.operator, file: file, - scope: scope - }, nodes, node.left, ref); + scope: scope, + nodes: nodes + }); + destructuring.init(node.left, ref); nodes.push(ref); @@ -310,17 +320,16 @@ exports.VariableDeclaration = function (node, parent, scope, context, file) { var patternId = declar.init; var pattern = declar.id; - var opts = { - pattern: pattern, - nodes: nodes, - scope: scope, - kind: node.kind, - file: file, - id: patternId, - }; + + var destructuring = new Destructuring({ + nodes: nodes, + scope: scope, + kind: node.kind, + file: file + }); if (t.isPattern(pattern) && patternId) { - pushPattern(opts); + destructuring.init(pattern, patternId); if (+i !== node.declarations.length - 1) { // we aren't the last declarator so let's just make the @@ -328,7 +337,7 @@ exports.VariableDeclaration = function (node, parent, scope, context, file) { t.inherits(nodes[nodes.length - 1], declar); } } else { - nodes.push(t.inherits(buildVariableAssign(opts, declar.id, declar.init), declar)); + nodes.push(t.inherits(destructuring.buildVariableAssignment(declar.id, declar.init), declar)); } }