more cleanup of the destructuring transformer

This commit is contained in:
Sebastian McKenzie
2015-02-04 18:21:10 +11:00
parent fa5a3022d4
commit 37ef976515

View File

@@ -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++) {