From 37ef976515158e8d80f9161a955f9e8323c73ad5 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Wed, 4 Feb 2015 18:21:10 +1100 Subject: [PATCH] more cleanup of the destructuring transformer --- .../transformers/es6/destructuring.js | 129 ++++++++++-------- 1 file changed, 70 insertions(+), 59 deletions(-) diff --git a/lib/6to5/transformation/transformers/es6/destructuring.js b/lib/6to5/transformation/transformers/es6/destructuring.js index 172ffd66d9..0ca5d9b12a 100644 --- a/lib/6to5/transformation/transformers/es6/destructuring.js +++ b/lib/6to5/transformation/transformers/es6/destructuring.js @@ -1,7 +1,5 @@ "use strict"; -// TODO: Clean up - var t = require("../../../types"); exports.check = t.isPattern; @@ -73,7 +71,41 @@ function Destructuring(opts) { )); }; - Destructuring.prototype.pushObjectPattern = function (pattern, parentId) { +Destructuring.prototype.pushObjectSpread = function (pattern, parentId, prop, i) { + // get all the keys that appear in this object before the current spread + var keys = []; + for (var i2 = 0; i2 < pattern.properties.length; i2++) { + var prop2 = pattern.properties[i2]; + + if (i2 >= i) break; + if (t.isSpreadProperty(prop2)) continue; + + var key = prop2.key; + if (t.isIdentifier(key)) { + key = t.literal(prop2.key.name); + } + keys.push(key); + } + keys = t.arrayExpression(keys); + + var value = t.callExpression(this.file.addHelper("object-without-properties"), [parentId, keys]); + this.nodes.push(this.buildVariableAssignment(prop.argument, value)); +}; + +Destructuring.prototype.pushObjectProperty = function (prop, parentId) { + if (t.isLiteral(prop.key)) prop.computed = true; + + var pattern2 = prop.value; + var patternId2 = t.memberExpression(parentId, prop.key, prop.computed); + + if (t.isPattern(pattern2)) { + this.push(pattern2, patternId2); + } else { + this.nodes.push(this.buildVariableAssignment(pattern2, patternId2)); + } +}; + +Destructuring.prototype.pushObjectPattern = function (pattern, parentId) { if (!pattern.properties.length) { this.nodes.push(t.expressionStatement( t.callExpression(this.file.addHelper("object-destructuring-empty"), [parentId]) @@ -83,63 +115,39 @@ function Destructuring(opts) { for (var i = 0; i < pattern.properties.length; i++) { var prop = pattern.properties[i]; if (t.isSpreadProperty(prop)) { - // get all the keys that appear in this object before the current spread - var keys = []; - for (var i2 = 0; i2 < pattern.properties.length; i2++) { - var prop2 = pattern.properties[i2]; - - if (i2 >= i) break; - if (t.isSpreadProperty(prop2)) continue; - - var key = prop2.key; - if (t.isIdentifier(key)) { - key = t.literal(prop2.key.name); - } - keys.push(key); - } - keys = t.arrayExpression(keys); - - var value = t.callExpression(this.file.addHelper("object-without-properties"), [parentId, keys]); - this.nodes.push(this.buildVariableAssignment(prop.argument, value)); + this.pushObjectSpread(pattern, parentId, prop, i); } else { - if (t.isLiteral(prop.key)) prop.computed = true; - - var pattern2 = prop.value; - var patternId2 = t.memberExpression(parentId, prop.key, prop.computed); - - if (t.isPattern(pattern2)) { - this.push(pattern2, patternId2); - } else { - this.nodes.push(this.buildVariableAssignment(pattern2, patternId2)); - } + this.pushObjectProperty(prop, parentId); } } }; - Destructuring.prototype.pushArrayPattern = function (pattern, parentId) { - if (!pattern.elements) return; - - var i; - - var hasRest = false; - for (i = 0; i < pattern.elements.length; i++) { +var hasRest = function (pattern) { + for (var i = 0; i < pattern.elements.length; i++) { if (t.isRestElement(pattern.elements[i])) { - hasRest = true; - break; + return true; } } + return false; +}; - var toArray = this.file.toArray(parentId, !hasRest && pattern.elements.length); +Destructuring.prototype.pushArrayPattern = function (pattern, parentId) { + if (!pattern.elements) return; + + // if we have a rest then we need all the elements + var count = !hasRest(pattern) && pattern.elements.length; + + var toArray = this.file.toArray(parentId, count); 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++) { + for (var i = 0; i < pattern.elements.length; i++) { var elem = pattern.elements[i]; - if (!elem) continue; - i = +i; + // hole + if (!elem) continue; var newPatternId; @@ -190,6 +198,7 @@ exports.ForOfStatement = function (node, parent, scope, context, file) { scope: scope, nodes: nodes }); + destructuring.init(pattern, key); t.ensureBlock(node); @@ -298,24 +307,23 @@ exports.AssignmentExpression = function (node, parent, scope, context, file) { return t.toSequenceExpression(nodes, scope); }; -exports.VariableDeclaration = function (node, parent, scope, context, file) { - if (t.isForInStatement(parent) || t.isForOfStatement(parent)) return; - - var nodes = []; - var i; - var declar; - - var hasPattern = false; - for (i = 0; i < node.declarations.length; i++) { - declar = node.declarations[i]; - if (t.isPattern(declar.id)) { - hasPattern = true; - break; +var variableDeclarationhasPattern = function (node) { + for (var i = 0; i < node.declarations.length; i++) { + if (t.isPattern(node.declarations[i].id)) { + return true; } } - if (!hasPattern) return; + return false; +}; - for (i = 0; i < node.declarations.length; i++) { +exports.VariableDeclaration = function (node, parent, scope, context, file) { + if (t.isForInStatement(parent) || t.isForOfStatement(parent)) return; + if (!variableDeclarationhasPattern(node)) return; + + var nodes = []; + var declar; + + for (var i = 0; i < node.declarations.length; i++) { declar = node.declarations[i]; var patternId = declar.init; @@ -342,6 +350,9 @@ exports.VariableDeclaration = function (node, parent, scope, context, file) { } if (!t.isProgram(parent) && !t.isBlockStatement(parent)) { + // https://github.com/6to5/6to5/issues/113 + // for (let [x] = [0]; false;) {} + declar = null; for (i = 0; i < nodes.length; i++) {