From 565ab9a3fc61e8d0cbdbcf6d02b49511abc54f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 12 Mar 2020 14:07:59 -0400 Subject: [PATCH] fix: preserve shadowed for-loop declarators (#11242) * fix: do not remove for-loop declarators * fix: do not remove uninitialized var declarators in for init --- .../src/params.js | 16 ++++++++++++---- .../let-for-init-same-as-param/exec.js | 5 +++++ .../let-no-init-for-init-same-as-param/exec.js | 5 +++++ .../var-for-body-same-as-param/exec.js | 5 +++++ .../var-for-init-same-as-param/exec.js | 5 +++++ .../var-no-init-for-body-same-as-param/exec.js | 5 +++++ .../var-no-init-for-init-same-as-param/exec.js | 5 +++++ .../test/fixtures/regression/11231/input.mjs | 3 +++ .../test/fixtures/regression/11231/options.json | 5 +++++ .../test/fixtures/regression/11231/output.mjs | 6 ++++++ 10 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/parameters/let-for-init-same-as-param/exec.js create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/parameters/let-no-init-for-init-same-as-param/exec.js create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-for-body-same-as-param/exec.js create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-for-init-same-as-param/exec.js create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-no-init-for-body-same-as-param/exec.js create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-no-init-for-init-same-as-param/exec.js create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/regression/11231/input.mjs create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/regression/11231/options.json create mode 100644 packages/babel-plugin-transform-parameters/test/fixtures/regression/11231/output.mjs diff --git a/packages/babel-plugin-transform-parameters/src/params.js b/packages/babel-plugin-transform-parameters/src/params.js index fe6d09b6bb..e4e77208ea 100644 --- a/packages/babel-plugin-transform-parameters/src/params.js +++ b/packages/babel-plugin-transform-parameters/src/params.js @@ -76,11 +76,19 @@ export default function convertFunctionParams(path, loose) { switch (node.type) { case "VariableDeclarator": if (node.init === null) { - redeclarator.remove(); - } else { - state.iife = true; + const declaration = redeclarator.parentPath; + // The following uninitialized var declarators should not be removed + // for (var x in {}) + // for (var x;;) + if ( + !declaration.parentPath.isFor() || + declaration.parentPath.get("body") === declaration + ) { + redeclarator.remove(); + break; + } } - break; + // fall through case "FunctionDeclaration": state.iife = true; break; diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/let-for-init-same-as-param/exec.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/let-for-init-same-as-param/exec.js new file mode 100644 index 0000000000..fef1489f30 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/let-for-init-same-as-param/exec.js @@ -0,0 +1,5 @@ +function foo(a = 2) { + for (let a = 1; a > 0; a--); + expect(a).toBe(2); +} +foo(); diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/let-no-init-for-init-same-as-param/exec.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/let-no-init-for-init-same-as-param/exec.js new file mode 100644 index 0000000000..400a947ffd --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/let-no-init-for-init-same-as-param/exec.js @@ -0,0 +1,5 @@ +function foo(a = 2) { + for (let a, i = 0; i < 1; i++) a = 1; + expect(a).toBe(2); +} +foo(); diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-for-body-same-as-param/exec.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-for-body-same-as-param/exec.js new file mode 100644 index 0000000000..15080691ad --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-for-body-same-as-param/exec.js @@ -0,0 +1,5 @@ +function foo(a = 2) { + for (var i of [0]) var a = 1; + expect(a).toBe(1); +} +foo(); diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-for-init-same-as-param/exec.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-for-init-same-as-param/exec.js new file mode 100644 index 0000000000..3a0c8b460f --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-for-init-same-as-param/exec.js @@ -0,0 +1,5 @@ +function foo(a = 2) { + for (var [a] of [[1]]); + expect(a).toBe(1); +} +foo(); diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-no-init-for-body-same-as-param/exec.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-no-init-for-body-same-as-param/exec.js new file mode 100644 index 0000000000..a1b43e1f42 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-no-init-for-body-same-as-param/exec.js @@ -0,0 +1,5 @@ +function foo(a = 2) { + for (var i of [0]) var a; + expect(a).toBe(2); +} +foo(); diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-no-init-for-init-same-as-param/exec.js b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-no-init-for-init-same-as-param/exec.js new file mode 100644 index 0000000000..ad66658f07 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/parameters/var-no-init-for-init-same-as-param/exec.js @@ -0,0 +1,5 @@ +function foo(a = 2) { + for (var a, i = 0; i < 1; i++); + expect(a).toBe(undefined); +} +foo(); diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/regression/11231/input.mjs b/packages/babel-plugin-transform-parameters/test/fixtures/regression/11231/input.mjs new file mode 100644 index 0000000000..8b05176bee --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/regression/11231/input.mjs @@ -0,0 +1,3 @@ +(i = "__proto__") => { + for (var i in {}); +}; diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/regression/11231/options.json b/packages/babel-plugin-transform-parameters/test/fixtures/regression/11231/options.json new file mode 100644 index 0000000000..3a9f55e640 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/regression/11231/options.json @@ -0,0 +1,5 @@ +{ + "plugins": [ + "transform-parameters" + ] +} diff --git a/packages/babel-plugin-transform-parameters/test/fixtures/regression/11231/output.mjs b/packages/babel-plugin-transform-parameters/test/fixtures/regression/11231/output.mjs new file mode 100644 index 0000000000..b3bef67410 --- /dev/null +++ b/packages/babel-plugin-transform-parameters/test/fixtures/regression/11231/output.mjs @@ -0,0 +1,6 @@ +(function () { + let i = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "__proto__"; + return function () { + for (var i in {}); + }(); +});