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() {
|
function foo() {
|
||||||
var input = ['a', 'b', 'c'];
|
var input = ['a', 'b', 'c'];
|
||||||
var output = {};
|
var output = {};
|
||||||
|
var _arr = input;
|
||||||
|
|
||||||
for (var _i = 0; _i < input.length; _i++) {
|
for (var _i = 0; _i < _arr.length; _i++) {
|
||||||
var c = input[_i];
|
var c = _arr[_i];
|
||||||
var name = c;
|
var name = c;
|
||||||
output[name] = name;
|
output[name] = name;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -118,18 +118,14 @@ export default declare((api, options) => {
|
|||||||
|
|
||||||
function _ForOfStatementArray(path) {
|
function _ForOfStatementArray(path) {
|
||||||
const { node, scope } = path;
|
const { node, scope } = path;
|
||||||
const nodes = [];
|
|
||||||
let right = node.right;
|
|
||||||
|
|
||||||
if (!t.isIdentifier(right) || !scope.hasBinding(right.name)) {
|
|
||||||
const uid = scope.generateUid("arr");
|
const uid = scope.generateUid("arr");
|
||||||
nodes.push(
|
const nodes = [
|
||||||
t.variableDeclaration("var", [
|
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");
|
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 = [];
|
const x = [];
|
||||||
|
var _arr = x;
|
||||||
|
|
||||||
for (var _i = 0; _i < x.length; _i++) {
|
for (var _i = 0; _i < _arr.length; _i++) {
|
||||||
const y = x[_i];
|
const y = _arr[_i];
|
||||||
}
|
}
|
||||||
|
|
||||||
const arr = Object.entries(x);
|
const arr = Object.entries(x);
|
||||||
|
var _arr2 = arr;
|
||||||
|
|
||||||
for (var _i2 = 0; _i2 < arr.length; _i2++) {
|
for (var _i2 = 0; _i2 < _arr2.length; _i2++) {
|
||||||
const y = arr[_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