use simple loops always in array comprehensions, support yield inside of array comprehensions - closes #325, fixes #252

This commit is contained in:
Sebastian McKenzie
2015-01-02 02:14:36 +11:00
parent f1a178f8f9
commit ba67f57c1e
10 changed files with 83 additions and 76 deletions

View File

@@ -1,5 +0,0 @@
ARRAY.filter(function (KEY) {
return FILTER;
}).map(function (KEY) {
return STATEMENT;
});

View File

@@ -1,3 +0,0 @@
ARRAY.map(function (KEY) {
return STATEMENT;
});

View File

@@ -1,43 +1,25 @@
var util = require("../../util");
var t = require("../../types");
var traverse = require("../../traverse");
var util = require("../../util");
var t = require("../../types");
exports.experimental = true;
var single = function (node, file) {
var block = node.blocks[0];
var templateName = "array-expression-comprehension-map";
if (node.filter) templateName = "array-expression-comprehension-filter";
var result = util.template(templateName, {
STATEMENT: node.body,
FILTER: node.filter,
ARRAY: file.toArray(block.right),
KEY: block.left
});
var aliasPossibles = [result.callee.object, result];
for (var i in aliasPossibles) {
var call = aliasPossibles[i];
if (t.isCallExpression(call)) {
call.arguments[0]._aliasFunction = true;
}
}
return result;
};
var multiple = function (node, file) {
var build = function (node, file) {
var uid = file.generateUidIdentifier("arr");
var container = util.template("array-comprehension-container", {
KEY: uid
});
container.callee.expression._aliasFunction = true;
container.callee._aliasFunction = true;
var block = container.callee.body;
var body = block.body;
if (traverse.hasType(node, "YieldExpression", t.FUNCTION_TYPES)) {
container.generator = true;
container = t.yieldExpression(container, true);
}
var returnStatement = body.pop();
body.push(exports._build(node, function () {
@@ -76,9 +58,5 @@ exports._build = function (node, buildBody) {
exports.ComprehensionExpression = function (node, parent, file) {
if (node.generator) return;
if (node.blocks.length === 1) {
return single(node, file);
} else {
return multiple(node, file);
}
return build(node, file);
};

View File

@@ -2,9 +2,16 @@
function add() {
var _arguments = arguments;
return [1, 2, 3].map(function (i) {
return i * _arguments[0];
});
return (function () {
var _arr = [];
for (var _iterator = [1, 2, 3][Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
var i = _step.value;
_arr.push(i * _arguments[0]);
}
return _arr;
})();
}
add(5);

View File

@@ -1,7 +1,14 @@
"use strict";
var arr = [1, 2, 3].filter(function (i) {
return i > 1;
}).map(function (i) {
return i * i;
});
var arr = (function () {
var _arr = [];
for (var _iterator = [1, 2, 3][Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
var i = _step.value;
if (i > 1) {
_arr.push(i * i);
}
}
return _arr;
})();

View File

@@ -1,5 +1,12 @@
"use strict";
var arr = [1, 2, 3].map(function (i) {
return i * i;
});
var arr = (function () {
var _arr = [];
for (var _iterator = [1, 2, 3][Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
var i = _step.value;
_arr.push(i * i);
}
return _arr;
})();

View File

@@ -1,11 +1,14 @@
"use strict";
var _toArray = function (arr) {
return Array.isArray(arr) ? arr : Array.from(arr);
};
var arr = (function () {
var _arr = [];
var arr = _toArray(nums).filter(function (i) {
return i > 1;
}).map(function (i) {
return i * i;
});
for (var _iterator = nums[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
var i = _step.value;
if (i > 1) {
_arr.push(i * i);
}
}
return _arr;
})();

View File

@@ -1,9 +1,12 @@
"use strict";
var _toArray = function (arr) {
return Array.isArray(arr) ? arr : Array.from(arr);
};
var arr = (function () {
var _arr = [];
var arr = _toArray(nums).map(function (i) {
return i * i;
});
for (var _iterator = nums[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
var i = _step.value;
_arr.push(i * i);
}
return _arr;
})();

View File

@@ -2,9 +2,16 @@
function add() {
var _this = this;
return [1, 2, 3].map(function (i) {
return i * _this.multiplier;
});
return (function () {
var _arr = [];
for (var _iterator = [1, 2, 3][Symbol.iterator](), _step; !(_step = _iterator.next()).done;) {
var i = _step.value;
_arr.push(i * _this.multiplier);
}
return _arr;
})();
}
add.call({ multiplier: 5 });

View File

@@ -1,15 +1,18 @@
"use strict";
var _toArray = function (arr) {
return Array.isArray(arr) ? arr : _core.Array.from(arr);
};
var _interopRequire = function (obj) {
return obj && (obj["default"] || obj);
};
var _core = _interopRequire(require("core-js/library"));
var arr = _toArray(nums).map(function (i) {
return i * i;
});
var arr = (function () {
var _arr = [];
for (var _iterator = _core.$for.getIterator(nums), _step; !(_step = _iterator.next()).done;) {
var i = _step.value;
_arr.push(i * i);
}
return _arr;
})();