Compare commits

...

17 Commits

Author SHA1 Message Date
Sebastian McKenzie
f7be1b74d7 v3.0.11 2015-01-29 07:42:43 +11:00
Sebastian McKenzie
e264ac03b3 put destructuring transformer back 2015-01-29 07:40:50 +11:00
Sebastian McKenzie
425f0c5fdf add 3.0.11 changelog 2015-01-29 07:38:15 +11:00
Sebastian McKenzie
960a70287d add improved for-of loose behaviour that supports destructuring - fixes #615 2015-01-29 00:50:22 +11:00
Sebastian McKenzie
c25c33e3ee remove unnecessary ensureBlock in es6 rest parameters transformer 2015-01-29 00:06:42 +11:00
Sebastian McKenzie
d72081f82c fix codeFrame call in transformation helper 2015-01-29 00:06:24 +11:00
Sebastian McKenzie
d4debc3c85 fix regenerator tests 2015-01-29 00:06:12 +11:00
Sebastian McKenzie
7894f1a079 add regenerator parameter tests 2015-01-28 23:45:11 +11:00
Sebastian McKenzie
5ffaeb5e9f 3.0.10 2015-01-28 23:41:55 +11:00
Sebastian McKenzie
e50a7406ad move destructuring transformer to before regenerator 2015-01-28 23:41:51 +11:00
Sebastian McKenzie
962eeed252 clean up t.getIds 2015-01-28 23:41:42 +11:00
Sebastian McKenzie
2d8944fbd5 fix RestElement ast-types definition 2015-01-28 23:41:31 +11:00
Sebastian McKenzie
ddfb492ed9 v3.0.10 2015-01-28 23:14:43 +11:00
Sebastian McKenzie
3d98364adb in types.getIds make sure the declaration inside of ExportDeclaration is actually a Declaration, clean up types.isReferenced - fixes #614 2015-01-28 23:12:53 +11:00
Sebastian McKenzie
3affa543ef add yes/no comments to describe what we're actually testing for in types.isReferenced 2015-01-28 20:21:25 +11:00
Sebastian McKenzie
2a47afebde more accurate types.isReferenced comment 2015-01-28 20:09:37 +11:00
Sebastian McKenzie
f2fc6d8852 3.0.9 2015-01-28 20:09:20 +11:00
16 changed files with 130 additions and 66 deletions

View File

@@ -11,6 +11,17 @@
_Note: Gaps between patch versions are faulty/broken releases._
## 3.0.11
* **Bug Fix**
* Fix `ast-types` `RestElement` definition.
* Make `es6.forOf` loose mode more versatile and support destructuring.
## 3.0.10
* **Bug Fix**
* In `types.getIds` make sure the `declaration` inside of `ExportDeclaration` is actually a `Declaration`.
## 3.0.9
* **Bug Fix**

View File

@@ -34,9 +34,9 @@ def("ImportBatchSpecifier")
.field("name", def("Identifier"));
def("RestElement")
.bases("Node")
.bases("Pattern")
.build("argument")
.field("argument", def("Pattern"));
.field("argument", def("expression"));
// Abstract references
def("VirtualPropertyExpression")

View File

@@ -2,6 +2,7 @@ for (var LOOP_OBJECT = OBJECT,
IS_ARRAY = Array.isArray(LOOP_OBJECT),
INDEX = 0,
LOOP_OBJECT = IS_ARRAY ? LOOP_OBJECT : LOOP_OBJECT[Symbol.iterator]();;) {
var ID;
if (IS_ARRAY) {
if (INDEX >= LOOP_OBJECT.length) break;
ID = LOOP_OBJECT[INDEX++];

View File

@@ -20,11 +20,7 @@ exports.ForOfStatement = function (node, parent, scope, context, file) {
// add the value declaration to the new loop body
if (declar) {
if (build.shouldUnshift) {
block.body.unshift(declar);
} else {
block.body.push(declar);
}
block.body.push(declar);
}
// push the rest of the original loop body onto our new body
@@ -45,9 +41,9 @@ var loose = function (node, parent, scope, context, file) {
id = left;
} else if (t.isVariableDeclaration(left)) {
// for (var i of test)
id = left.declarations[0].id;
id = scope.generateUidIdentifier("ref");
declar = t.variableDeclaration(left.kind, [
t.variableDeclarator(id)
t.variableDeclarator(left.declarations[0].id, id)
]);
} else {
throw file.errorWithNode(left, "Unknown node type " + left.type + " in ForOfStatement");
@@ -61,10 +57,15 @@ var loose = function (node, parent, scope, context, file) {
ID: id
});
if (!declar) {
// no declaration so we need to remove the variable declaration at the top of
// the for-of-loose template
loop.body.body.shift();
}
return {
shouldUnshift: true,
declar: declar,
loop: loop
declar: declar,
loop: loop
};
};

View File

@@ -12,8 +12,6 @@ exports.Function = function (node, parent, scope) {
var rest = node.params.pop().argument;
t.ensureBlock(node);
var argsId = t.identifier("arguments");
// otherwise `arguments` will be remapped in arrow functions

View File

@@ -58,6 +58,7 @@ module.exports = {
"es6.parameters.default": require("./es6/parameters.default"),
"es6.parameters.rest": require("./es6/parameters.rest"),
// needs to be before regenerator since regenerator doesn't know how to handle destructuring patterns
"es6.destructuring": require("./es6/destructuring"),
// needs to be after `regenerator` due to needing `regeneratorRuntime` references

View File

@@ -226,7 +226,7 @@ t.prependToMemberExpression = function (member, append) {
};
/**
* Check if the input `node` is going to be evaluated, ie. is a refernece.
* Check if the input `node` is a reference to a bound variable.
*
* @param {Object} node
* @param {Object} parent
@@ -234,22 +234,32 @@ t.prependToMemberExpression = function (member, append) {
*/
t.isReferenced = function (node, parent) {
// yes: PARENT[NODE]
// yes: NODE.child
// no: parent.CHILD
if (t.isMemberExpression(parent)) {
if (parent.property === node && parent.computed) {
return true;
} else if (parent.object === node) {
return true;
} else {
return false;
}
}
// yes: { [NODE]: "" }
if (t.isProperty(parent)) {
return parent.key === node && parent.computed;
}
if (t.isRestElement(parent)) {
return false;
}
if (t.isAssignmentPattern(parent)) {
return parent.right !== node;
}
if (t.isPattern(parent)) {
return false;
// no: var NODE = init;
// yes: var id = NODE;
if (t.isVariableDeclarator(parent)) {
return parent.id !== node;
}
// no: function NODE() {}
// no: function foo(NODE) {}
if (t.isFunction(parent)) {
for (var i = 0; i < parent.params.length; i++) {
var param = parent.params[i];
@@ -259,42 +269,56 @@ t.isReferenced = function (node, parent) {
return parent.id !== node;
}
// no: class NODE {}
if (t.isClass(parent)) {
return parent.id !== node;
}
// yes: class { [NODE](){} }
if (t.isMethodDefinition(parent)) {
return parent.key === node && parent.computed;
}
if (t.isImportSpecifier(parent)) {
return false;
}
if (t.isImportBatchSpecifier(parent)) {
return false;
}
// no: NODE: for (;;) {}
if (t.isLabeledStatement(parent)) {
return false;
}
// no: try {} catch (NODE) {}
if (t.isCatchClause(parent)) {
return parent.param !== node;
}
if (t.isVariableDeclarator(parent)) {
return parent.id !== node;
// no: function foo(...NODE) {}
if (t.isRestElement(parent)) {
return false;
}
if (t.isMemberExpression(parent)) {
if (parent.property === node && parent.computed) { // PARENT[NODE]
return true;
} else if (parent.object === node) { // NODE.child
return true;
} else {
return false;
}
// no: [NODE = foo] = [];
// yes: [foo = NODE] = [];
if (t.isAssignmentPattern(parent)) {
return parent.right !== node;
}
// no: [NODE] = [];
// no: ({ NODE }) = [];
if (t.isPattern(parent)) {
return false;
}
// no: import NODE from "bar";
if (t.isImportSpecifier(parent)) {
return false;
}
// no: import * as NODE from "foo";
if (t.isImportBatchSpecifier(parent)) {
return false;
}
// no: class Foo { private NODE; }
if (t.isPrivateDeclaration(parent)) {
return false;
}
return true;
@@ -466,7 +490,11 @@ t.toBlock = function (node, parent) {
};
/**
* Description
* Return a list of identifiers that will be assigned
* as a result of runtime evaluation.
*
* If an identifier is passed as `node` instead of a
* declaration then it's assumed to be an assignable.
*
* @param {Object} node
* @param {Boolean} [map]
@@ -475,15 +503,15 @@ t.toBlock = function (node, parent) {
*/
t.getIds = function (node, map, ignoreTypes) {
ignoreTypes = ignoreTypes || [];
var search = [].concat(node);
var ids = object();
while (search.length) {
var id = search.shift();
if (!id) continue;
if (_.contains(ignoreTypes, id.type)) continue;
// blacklist types
if (ignoreTypes && ignoreTypes.indexOf(id.type) >= 0) continue;
var nodeKeys = t.getIds.nodes[id.type];
var arrKeys = t.getIds.arrays[id.type];
@@ -492,6 +520,10 @@ t.getIds = function (node, map, ignoreTypes) {
if (t.isIdentifier(id)) {
ids[id.name] = id;
} else if (t.isExportDeclaration(id)) {
if (t.isDeclaration(node.declaration)) {
search.push(node.declaration);
}
} else if (nodeKeys) {
for (i = 0; i < nodeKeys.length; i++) {
key = nodeKeys[i];
@@ -531,7 +563,6 @@ t.getIds.nodes = {
t.getIds.arrays = {
PrivateDeclaration: ["declarations"],
ComprehensionExpression: ["blocks"],
ExportDeclaration: ["specifiers", "declaration"],
ImportDeclaration: ["specifiers"],
VariableDeclaration: ["declarations"],
ArrayPattern: ["elements"],

View File

@@ -1,7 +1,7 @@
{
"name": "6to5",
"description": "Turn ES6 code into readable vanilla ES5 with source maps",
"version": "3.0.9",
"version": "3.0.11",
"author": "Sebastian McKenzie <sebmck@gmail.com>",
"homepage": "https://6to5.org/",
"repository": "6to5/6to5",

View File

@@ -1,7 +1,7 @@
{
"name": "6to5-runtime",
"description": "6to5 selfContained runtime",
"version": "3.0.8",
"version": "3.0.10",
"repository": "6to5/6to5",
"author": "Sebastian McKenzie <sebmck@gmail.com>"
}

View File

@@ -1,6 +1,7 @@
var genHelpers = require("./_generator-helpers");
var transform = require("../lib/6to5/transformation/transform");
var sourceMap = require("source-map");
var codeFrame = require("../lib/6to5/helpers/code-frame");
var esvalid = require("esvalid");
var Module = require("module");
var helper = require("./_helper");
@@ -85,7 +86,7 @@ var run = function (task, done) {
fn.call(global, fakeRequire, chai.assert, done);
} catch (err) {
err.message = exec.loc + ": " + err.message;
err.message += util.codeFrame(execCode);
err.message += codeFrame(execCode);
throw err;
}
}

View File

@@ -1,13 +1,14 @@
"use strict";
for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var i = undefined;
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
i = _iterator[_i++];
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
i = _i.value;
_ref = _i.value;
}
}
var i = _ref;
}

View File

@@ -1,25 +1,27 @@
"use strict";
for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var i;
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
i = _iterator[_i++];
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
i = _i.value;
_ref = _i.value;
}
var i = _ref;
}
for (var _iterator2 = numbers, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
var i;
var _ref2;
if (_isArray2) {
if (_i2 >= _iterator2.length) break;
i = _iterator2[_i2++];
_ref2 = _iterator2[_i2++];
} else {
_i2 = _iterator2.next();
if (_i2.done) break;
i = _i2.value;
_ref2 = _i2.value;
}
}
var i = _ref2;
}

View File

@@ -1,13 +1,14 @@
"use strict";
for (var _iterator = arr, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
var i;
var _ref;
if (_isArray) {
if (_i >= _iterator.length) break;
i = _iterator[_i++];
_ref = _iterator[_i++];
} else {
_i = _iterator.next();
if (_i.done) break;
i = _i.value;
_ref = _i.value;
}
}
var i = _ref;
}

View File

@@ -0,0 +1,6 @@
function* foo(bar = "bar") {
return bar;
}
assert.deepEqual(foo().next().value, "bar");
assert.deepEqual(foo("foo").next().value, "foo");

View File

@@ -0,0 +1,5 @@
function* foo({ bar }) {
return bar;
}
assert(foo({ bar: "bar" }).next().value, "bar");

View File

@@ -0,0 +1,5 @@
function* foo(...items) {
return items;
}
assert.deepEqual(foo(1, 2, 3).next().value, [1, 2, 3]);