add iterators

This commit is contained in:
Sebastian McKenzie
2014-09-29 14:51:33 +10:00
parent fd932e20e9
commit b0cfbb20ca
17 changed files with 120 additions and 35 deletions

View File

@@ -0,0 +1,3 @@
for (var ITERATOR_KEY = OBJECT[Symbol.iterator](), STEP_KEY; !(STEP_KEY = ITERATOR_KEY.next()).done; ) {
var KEY = STEP_KEY.value;
}

View File

@@ -30,6 +30,8 @@ var transform = module.exports = function (code, opts) {
}
});
var generateUid = util.buildUidGenerator();
_.each(transform.transformers, function (transformer, name) {
var blacklist = opts.blacklist;
if (blacklist.length && _.contains(blacklist, name)) return;
@@ -37,7 +39,7 @@ var transform = module.exports = function (code, opts) {
var whitelist = opts.whitelist;
if (whitelist.length && !_.contains(whitelist, name)) return;
transform._runTransformer(transformer, tree, opts);
transform._runTransformer(transformer, tree, opts, generateUid);
});
var genOpts = {
@@ -64,14 +66,14 @@ var transform = module.exports = function (code, opts) {
}
};
transform._runTransformer = function (transformer, tree, opts) {
transform._runTransformer = function (transformer, tree, opts, generateUid) {
if (transformer.Program) transformer.Program(tree, opts);
traverse.replace(tree, function (node, parent) {
var fn = transformer[node.type] || transformer.all;
if (!fn) return;
return fn(node, parent, opts);
return fn(node, parent, opts, generateUid);
});
};
@@ -109,5 +111,6 @@ transform.transformers = {
generators: require("./transformers/generators"),
blockBinding: require("./transformers/block-binding"),
modules: require("./transformers/modules"),
restParameters: require("./transformers/rest-parameters")
restParameters: require("./transformers/rest-parameters"),
iterators: require("./transformers/iterators")
};

View File

@@ -3,6 +3,8 @@ var util = require("../util");
exports.ArrowFunctionExpression = function (node) {
var body = node.body;
// expression body
if (body.type !== "BlockStatement") {
body = {
type: "BlockStatement",

View File

@@ -35,6 +35,7 @@ exports.BlockStatement = function (node, parent) {
node.body = buildNode(node.body);
};
exports.ForOfStatement =
exports.ForInStatement = function (node) {
if (isLet(node.left)) return buildNode(node);
};

View File

@@ -5,6 +5,7 @@ var _ = require("lodash");
exports.Program =
exports.BlockStatement =
exports.ForInStatement =
exports.ForOfStatement =
exports.ForStatement = function (node) {
var constants = [];

View File

@@ -0,0 +1,20 @@
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
});
var block = node2.body;
var declar = block.body[0];
declar.kind = node.left.kind;
block.body = block.body.concat(node.body.body);
return node2;
};

View File

@@ -47,6 +47,19 @@ exports.canCompile = function (filename) {
return path.extname(filename) === ".js";
};
exports.buildUidGenerator = function () {
var ids = {};
return function (name) {
var i = ids[name] || 0;
var id = "_" + name;
if (i > 0) id += i;
ids[name] = i + 1;
return id;
};
};
exports.sourceMapToComment = function (map) {
var json = JSON.stringify(map);
var base64 = new Buffer(json).toString("base64");