Skip to content

Commit

Permalink
Correctly preserve reference to array in for-of loop (#9697)
Browse files Browse the repository at this point in the history
* Correctly preserve reference to array in for-of loop

* Add more tests
  • Loading branch information
danez committed Mar 18, 2019
1 parent efd2ca9 commit f36a698
Show file tree
Hide file tree
Showing 10 changed files with 60 additions and 18 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
function foo() {
var input = ['a', 'b', 'c'];
var output = {};
var _arr = input;

for (var _i = 0; _i < input.length; _i++) {
var c = input[_i];
for (var _i = 0; _i < _arr.length; _i++) {
var c = _arr[_i];
var name = c;
output[name] = name;
}
Expand Down
20 changes: 8 additions & 12 deletions packages/babel-plugin-transform-for-of/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -118,18 +118,14 @@ export default declare((api, options) => {

function _ForOfStatementArray(path) {
const { node, scope } = path;
const nodes = [];
let right = node.right;

if (!t.isIdentifier(right) || !scope.hasBinding(right.name)) {
const uid = scope.generateUid("arr");
nodes.push(
t.variableDeclaration("var", [
t.variableDeclarator(t.identifier(uid), right),
]),
);
right = t.identifier(uid);
}

const uid = scope.generateUid("arr");
const nodes = [
t.variableDeclaration("var", [
t.variableDeclarator(t.identifier(uid), node.right),
]),
];
const right = t.identifier(uid);

const iterationKey = scope.generateUidIdentifier("i");

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
for (let o of arr) {
const arr = o;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
for (let _i = 0, _arr = arr; _i < _arr.length; _i++) {
let o = _arr[_i];
const arr = o;
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
const x = [];
var _arr = x;

for (var _i = 0; _i < x.length; _i++) {
const y = x[_i];
for (var _i = 0; _i < _arr.length; _i++) {
const y = _arr[_i];
}

const arr = Object.entries(x);
var _arr2 = arr;

for (var _i2 = 0; _i2 < arr.length; _i2++) {
const y = arr[_i2];
for (var _i2 = 0; _i2 < _arr2.length; _i2++) {
const y = _arr2[_i2];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
function f(...t) {
for (let o of t) {
const t = o;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
function f(...t) {
var _arr = t;

for (var _i = 0; _i < _arr.length; _i++) {
let o = _arr[_i];
const t = o;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
var arr = [1, 2, 3];
var results = [];

for (let v of arr) {
results.push(v);
arr = null;
}

expect(results).toEqual([1, 2, 3]);
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
var arr = [1,2,3]

for (let v of arr) {
console.log(v)
arr = null
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
var arr = [1, 2, 3];
var _arr = arr;

for (var _i = 0; _i < _arr.length; _i++) {
let v = _arr[_i];
console.log(v);
arr = null;
}

0 comments on commit f36a698

Please sign in to comment.