support destructuring in For*Statements

This commit is contained in:
Sebastian McKenzie
2014-10-09 22:41:12 +11:00
parent bb6654f786
commit 83487f22a7
5 changed files with 37 additions and 23 deletions

View File

@@ -117,7 +117,7 @@ transform.transformers = {
generators: require("./transformers/generators"),
blockBinding: require("./transformers/block-binding"),
restParameters: require("./transformers/rest-parameters"),
forOf: require("./transformers/for-of"),
destructuring: require("./transformers/destructuring"),
forOf: require("./transformers/for-of"),
unicodeRegex: require("./transformers/unicode-regex")
};

View File

@@ -62,6 +62,27 @@ var pushPattern = function (kind, nodes, pattern, parentId, generateUid) {
push(kind, nodes, pattern, parentId);
};
exports.ForInStatement =
exports.ForOfStatement = function (node, parent, opts, generateUid) {
var declar = node.left;
if (declar.type !== "VariableDeclaration") return;
var pattern = declar.declarations[0].id;
if (!util.isPattern(pattern)) return;
var key = b.identifier(generateUid("ref"));
node.left = b.variableDeclaration(declar.kind, [
b.variableDeclarator(key, null)
]);
var nodes = [];
push(declar.kind, nodes, pattern, key);
var block = node.body;
block.body = nodes.concat(block.body);
};
exports.FunctionDeclaration =
exports.FunctionExpression = function (node, parent, opts, generateUid) {
var block = node.body;

View File

@@ -2,17 +2,15 @@ var util = require("../util");
var b = require("ast-types").builders;
exports.ForOfStatement = function (node, parent, opts, generateUid) {
var declar;
var isPattern = false;
var left = node.left;
var key;
if (node.left.type === "VariableDeclaration") {
declar = node.left;
key = declar.declarations[0].id;
if (left.type === "Identifier") {
key = left;
} else if (left.type === "VariableDeclaration") {
key = left.declarations[0].id;
} else {
isPattern = true;
declar = node.left[0];
key = b.identifier(generateUid("ref"));
return;
}
var node2 = util.template("for-of", {
@@ -22,14 +20,7 @@ exports.ForOfStatement = function (node, parent, opts, generateUid) {
KEY: key
});
var block = node2.body;
if (isPattern) {
block.body.push(b.variableDeclaration(declar.kind, [
b.variableDeclarator(declar.declarations[0].id, key)
]));
}
var block = node2.body;
block.body = block.body.concat(node.body.body || []);
var declar = block.body[0];

View File

@@ -1,4 +1,5 @@
for (var name in obj) {
var value = obj[name];
for (var _ref in obj) {
var name = _ref[0];
var value = _ref[1];
print("Name: " + name + ", Value: " + value);
}

View File

@@ -1,5 +1,6 @@
for (var _iterator = this.test.expectation.registers[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
var name = _step.value[0];
var before = _step.value[1];
var after = _step.value[2];
var _ref = _step.value;
var name = _ref[0];
var before = _ref[1];
var after = _ref[2];
}