Correctly preserve reference to array in for-of loop (#9697)
* Correctly preserve reference to array in for-of loop * Add more tests
This commit is contained in:
parent
efd2ca9040
commit
f36a6987e4
@ -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;
|
||||
}
|
||||
|
||||
@ -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(
|
||||
const nodes = [
|
||||
t.variableDeclaration("var", [
|
||||
t.variableDeclarator(t.identifier(uid), right),
|
||||
t.variableDeclarator(t.identifier(uid), node.right),
|
||||
]),
|
||||
);
|
||||
right = t.identifier(uid);
|
||||
}
|
||||
];
|
||||
const right = t.identifier(uid);
|
||||
|
||||
const iterationKey = scope.generateUidIdentifier("i");
|
||||
|
||||
|
||||
@ -0,0 +1,3 @@
|
||||
for (let o of arr) {
|
||||
const arr = o;
|
||||
}
|
||||
@ -0,0 +1,4 @@
|
||||
for (let _i = 0, _arr = arr; _i < _arr.length; _i++) {
|
||||
let o = _arr[_i];
|
||||
const arr = o;
|
||||
}
|
||||
@ -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];
|
||||
}
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
function f(...t) {
|
||||
for (let o of t) {
|
||||
const t = o;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
9
packages/babel-plugin-transform-for-of/test/fixtures/regression/scope-9696/exec.js
vendored
Normal file
9
packages/babel-plugin-transform-for-of/test/fixtures/regression/scope-9696/exec.js
vendored
Normal file
@ -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]);
|
||||
6
packages/babel-plugin-transform-for-of/test/fixtures/regression/scope-9696/input.js
vendored
Normal file
6
packages/babel-plugin-transform-for-of/test/fixtures/regression/scope-9696/input.js
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
var arr = [1,2,3]
|
||||
|
||||
for (let v of arr) {
|
||||
console.log(v)
|
||||
arr = null
|
||||
}
|
||||
8
packages/babel-plugin-transform-for-of/test/fixtures/regression/scope-9696/output.js
vendored
Normal file
8
packages/babel-plugin-transform-for-of/test/fixtures/regression/scope-9696/output.js
vendored
Normal file
@ -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;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user