From 64ead169948e02234edd853820fd1a53a58e74ad Mon Sep 17 00:00:00 2001 From: Sneh Khatri Date: Thu, 9 Dec 2021 15:38:08 +0530 Subject: [PATCH 1/6] Fix: function's implicit argument binding failed --- .../arguments-global-var/output.js | 6 ++++-- .../arrow-functions/arguments/output.js | 21 +++++++++++-------- .../babel-traverse/src/path/conversion.ts | 2 +- .../conversion/implicit-var-arguments/exec.js | 11 ++++++++++ .../implicit-var-arguments/input.js | 10 +++++++++ .../implicit-var-arguments/options.json | 4 ++++ .../implicit-var-arguments/output.js | 20 ++++++++++++++++++ 7 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/exec.js create mode 100644 packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/input.js create mode 100644 packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/options.json create mode 100644 packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js diff --git a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js index f19432c82500..1a690299ac45 100644 --- a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js @@ -1,7 +1,9 @@ -var _arguments2 = 1; +var _arguments2 = typeof arguments === "undefined" ? void 0 : arguments; + +var arguments = 1; function fn() { - var _arguments = _arguments2; + var _arguments = arguments; var foo = function () { return _arguments; diff --git a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/output.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/output.js index 9110a69ddc39..e37f948318eb 100644 --- a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/output.js +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/output.js @@ -1,3 +1,5 @@ +var _arguments6 = typeof arguments === "undefined" ? void 0 : arguments; + function one() { var _arguments = arguments; @@ -83,26 +85,27 @@ function six(obj) { six(); var seven = function () { - var _arguments6 = 1; + var arguments = 1; return _arguments6; }; seven(); var eight = function () { - var _arguments7 = 1; + var arguments = 1; return function () { - return _arguments7; + return _arguments6; }; }; eight(); function nine() { - var _arguments8 = 1; + var _arguments7 = arguments; + var arguments = 1; var foo = function () { - return _arguments8; + return _arguments7; }; } @@ -111,9 +114,9 @@ nine(); var eleven = function () { var arguments = 2; return function () { - var _arguments9 = arguments; + var _arguments8 = arguments; return function () { - return _arguments9; + return _arguments8; }; }; }; @@ -124,9 +127,9 @@ var twelve = function () { var arguments = 2; return class { m() { - var _arguments10 = arguments; + var _arguments9 = arguments; return function () { - return _arguments10; + return _arguments9; }; } diff --git a/packages/babel-traverse/src/path/conversion.ts b/packages/babel-traverse/src/path/conversion.ts index a1bdbf891a92..04a0dee68158 100644 --- a/packages/babel-traverse/src/path/conversion.ts +++ b/packages/babel-traverse/src/path/conversion.ts @@ -635,7 +635,7 @@ const getScopeInformationVisitor = mergeVisitors<{ let curr = child.scope; do { - if (curr.hasOwnBinding("arguments")) { + if (curr.hasOwnBinding("arguments") && !curr.hasBinding("arguments")) { curr.rename("arguments"); return; } diff --git a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/exec.js b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/exec.js new file mode 100644 index 000000000000..eaceb4f62b59 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/exec.js @@ -0,0 +1,11 @@ +var arguments = [1, 2, 3]; +var arr = () => arguments[0]; + +arr(); // 1 + +function foo(n) { +var f = () => arguments[0] + n; // foo's implicit arguments binding. arguments[0] is n +return f(); +} + +expect(foo(3)).toStrictEqual(6) \ No newline at end of file diff --git a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/input.js b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/input.js new file mode 100644 index 000000000000..da40772c2dcf --- /dev/null +++ b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/input.js @@ -0,0 +1,10 @@ +var arguments = [1, 2, 3]; +var arr = () => arguments[0]; + +arr(); // 1 + +function foo(n) { +var f = () => arguments[0] + n; // foo's implicit arguments binding. arguments[0] is n +return f(); +} + \ No newline at end of file diff --git a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/options.json b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/options.json new file mode 100644 index 000000000000..238d46b51905 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/options.json @@ -0,0 +1,4 @@ +{ + "sourceType": "unambiguous", + "presets": ["env"] +} diff --git a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js new file mode 100644 index 000000000000..0af04e9a5680 --- /dev/null +++ b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js @@ -0,0 +1,20 @@ +var _arguments = typeof arguments === "undefined" ? void 0 : arguments; + +var arguments = [1, 2, 3]; + +var arr = function arr() { + return _arguments[0]; +}; + +arr(); // 1 + +function foo(n) { + var _arguments2 = arguments; + + var f = function f() { + return _arguments2[0] + n; + }; // foo's implicit arguments binding. arguments[0] is n + + + return f(); +} From 872f92bee01171af1dbc0f92774bb7666e38737a Mon Sep 17 00:00:00 2001 From: Sneh Khatri Date: Fri, 10 Dec 2021 12:24:35 +0530 Subject: [PATCH 2/6] scope.rename only arrow functions --- packages/babel-traverse/src/path/conversion.ts | 4 ++-- .../conversion/implicit-var-arguments/input.js | 4 ++-- .../conversion/implicit-var-arguments/output.js | 12 +++++------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/babel-traverse/src/path/conversion.ts b/packages/babel-traverse/src/path/conversion.ts index 04a0dee68158..b7dc484f0c6d 100644 --- a/packages/babel-traverse/src/path/conversion.ts +++ b/packages/babel-traverse/src/path/conversion.ts @@ -635,8 +635,8 @@ const getScopeInformationVisitor = mergeVisitors<{ let curr = child.scope; do { - if (curr.hasOwnBinding("arguments") && !curr.hasBinding("arguments")) { - curr.rename("arguments"); + if (curr.hasOwnBinding("arguments")) { + if (curr.path.isArrowFunctionExpression()) curr.rename("arguments"); return; } if (curr.path.isFunction() && !curr.path.isArrowFunctionExpression()) { diff --git a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/input.js b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/input.js index da40772c2dcf..31a30fd84854 100644 --- a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/input.js +++ b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/input.js @@ -1,7 +1,7 @@ var arguments = [1, 2, 3]; -var arr = () => arguments[0]; +var arr = (n) => arguments[0]; -arr(); // 1 +arr(4); // 1 function foo(n) { var f = () => arguments[0] + n; // foo's implicit arguments binding. arguments[0] is n diff --git a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js index 0af04e9a5680..d365cc0f1c88 100644 --- a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js +++ b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js @@ -1,18 +1,16 @@ -var _arguments = typeof arguments === "undefined" ? void 0 : arguments; - var arguments = [1, 2, 3]; -var arr = function arr() { - return _arguments[0]; +var arr = function arr(n) { + return arguments[0]; }; -arr(); // 1 +arr(4); // 1 function foo(n) { - var _arguments2 = arguments; + var _arguments = arguments; var f = function f() { - return _arguments2[0] + n; + return _arguments[0] + n; }; // foo's implicit arguments binding. arguments[0] is n From e497e07c4a76735a8eaf5f83a7a47e57a910c910 Mon Sep 17 00:00:00 2001 From: Sneh Khatri Date: Fri, 10 Dec 2021 12:31:50 +0530 Subject: [PATCH 3/6] CI errors fixed maybe --- .../arrow-functions/arguments-global-var/output.js | 5 ++--- .../test/fixtures/arrow-functions/arguments/output.js | 11 ++++------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js index 1a690299ac45..caa93fe7a0b6 100644 --- a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js @@ -1,5 +1,3 @@ -var _arguments2 = typeof arguments === "undefined" ? void 0 : arguments; - var arguments = 1; function fn() { @@ -11,10 +9,11 @@ function fn() { } var bar = function () { - return _arguments2; + return arguments; }; var baz = function () { + var _arguments2 = arguments; return function () { return _arguments2; }; diff --git a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/output.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/output.js index e37f948318eb..0932bd835043 100644 --- a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/output.js +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/output.js @@ -1,5 +1,3 @@ -var _arguments6 = typeof arguments === "undefined" ? void 0 : arguments; - function one() { var _arguments = arguments; @@ -85,27 +83,26 @@ function six(obj) { six(); var seven = function () { - var arguments = 1; + var _arguments6 = 1; return _arguments6; }; seven(); var eight = function () { - var arguments = 1; + var _arguments7 = 1; return function () { - return _arguments6; + return _arguments7; }; }; eight(); function nine() { - var _arguments7 = arguments; var arguments = 1; var foo = function () { - return _arguments7; + return arguments; }; } From 0650f73ad57c02fe004704413ecdfdfef89ee8ff Mon Sep 17 00:00:00 2001 From: Sneh Khatri Date: Sat, 11 Dec 2021 13:50:36 +0530 Subject: [PATCH 4/6] renamer won't rename arguments identifier inside function --- .../arrow-functions/arguments-global-var/output.js | 5 ++--- .../fixtures/arrow-functions/arguments/output.js | 12 ++++++------ packages/babel-traverse/src/path/conversion.ts | 2 +- packages/babel-traverse/src/scope/index.ts | 7 +++++++ .../conversion/implicit-var-arguments/output.js | 8 ++++---- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js index caa93fe7a0b6..e458a2d298d9 100644 --- a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js @@ -1,4 +1,4 @@ -var arguments = 1; +var _arguments2 = 1; function fn() { var _arguments = arguments; @@ -9,11 +9,10 @@ function fn() { } var bar = function () { - return arguments; + return _arguments2; }; var baz = function () { - var _arguments2 = arguments; return function () { return _arguments2; }; diff --git a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/output.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/output.js index 0932bd835043..9110a69ddc39 100644 --- a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/output.js +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/output.js @@ -99,10 +99,10 @@ var eight = function () { eight(); function nine() { - var arguments = 1; + var _arguments8 = 1; var foo = function () { - return arguments; + return _arguments8; }; } @@ -111,9 +111,9 @@ nine(); var eleven = function () { var arguments = 2; return function () { - var _arguments8 = arguments; + var _arguments9 = arguments; return function () { - return _arguments8; + return _arguments9; }; }; }; @@ -124,9 +124,9 @@ var twelve = function () { var arguments = 2; return class { m() { - var _arguments9 = arguments; + var _arguments10 = arguments; return function () { - return _arguments9; + return _arguments10; }; } diff --git a/packages/babel-traverse/src/path/conversion.ts b/packages/babel-traverse/src/path/conversion.ts index b7dc484f0c6d..a1bdbf891a92 100644 --- a/packages/babel-traverse/src/path/conversion.ts +++ b/packages/babel-traverse/src/path/conversion.ts @@ -636,7 +636,7 @@ const getScopeInformationVisitor = mergeVisitors<{ let curr = child.scope; do { if (curr.hasOwnBinding("arguments")) { - if (curr.path.isArrowFunctionExpression()) curr.rename("arguments"); + curr.rename("arguments"); return; } if (curr.path.isFunction() && !curr.path.isArrowFunctionExpression()) { diff --git a/packages/babel-traverse/src/scope/index.ts b/packages/babel-traverse/src/scope/index.ts index e2eb17d8f724..71e43ebb005f 100644 --- a/packages/babel-traverse/src/scope/index.ts +++ b/packages/babel-traverse/src/scope/index.ts @@ -1138,6 +1138,13 @@ export default class Scope { } else { return binding; } + } else if ( + !binding && + name === "arguments" && + scope.path.isFunction() && + !scope.path.isArrowFunctionExpression() + ) { + break; } previousPath = scope.path; } while ((scope = scope.parent)); diff --git a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js index d365cc0f1c88..c126fb594c81 100644 --- a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js +++ b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js @@ -1,16 +1,16 @@ -var arguments = [1, 2, 3]; +var _arguments = [1, 2, 3]; var arr = function arr(n) { - return arguments[0]; + return _arguments[0]; }; arr(4); // 1 function foo(n) { - var _arguments = arguments; + var _arguments2 = arguments; var f = function f() { - return _arguments[0] + n; + return _arguments2[0] + n; }; // foo's implicit arguments binding. arguments[0] is n From 1e2f19b6f523e5a345c2994616acd09f677fdf6c Mon Sep 17 00:00:00 2001 From: Sneh Khatri Date: Sat, 11 Dec 2021 16:04:22 +0530 Subject: [PATCH 5/6] explicit expect added for test implicit var arguments --- .../test/fixtures/conversion/implicit-var-arguments/exec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/exec.js b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/exec.js index eaceb4f62b59..428e0f6986b2 100644 --- a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/exec.js +++ b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/exec.js @@ -1,7 +1,7 @@ var arguments = [1, 2, 3]; var arr = () => arguments[0]; -arr(); // 1 +expect(arr()).toStrictEqual(1) function foo(n) { var f = () => arguments[0] + n; // foo's implicit arguments binding. arguments[0] is n From 7094515dfefe8fc71311439217018530dcc265d0 Mon Sep 17 00:00:00 2001 From: Sneh Khatri Date: Sun, 12 Dec 2021 15:52:56 +0530 Subject: [PATCH 6/6] implicit-var-arguments test moved to transform-arrow-functions-plugin --- .../fixtures/arrow-functions}/implicit-var-arguments/exec.js | 0 .../fixtures/arrow-functions}/implicit-var-arguments/input.js | 0 .../arrow-functions/implicit-var-arguments/options.json | 4 ++++ .../arrow-functions}/implicit-var-arguments/output.js | 4 ++-- .../fixtures/conversion/implicit-var-arguments/options.json | 4 ---- 5 files changed, 6 insertions(+), 6 deletions(-) rename packages/{babel-traverse/test/fixtures/conversion => babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions}/implicit-var-arguments/exec.js (100%) rename packages/{babel-traverse/test/fixtures/conversion => babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions}/implicit-var-arguments/input.js (100%) create mode 100644 packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/options.json rename packages/{babel-traverse/test/fixtures/conversion => babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions}/implicit-var-arguments/output.js (81%) delete mode 100644 packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/options.json diff --git a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/exec.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/exec.js similarity index 100% rename from packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/exec.js rename to packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/exec.js diff --git a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/input.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/input.js similarity index 100% rename from packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/input.js rename to packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/input.js diff --git a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/options.json b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/options.json new file mode 100644 index 000000000000..7e8d4deeee4a --- /dev/null +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/options.json @@ -0,0 +1,4 @@ +{ + "sourceType": "script", + "plugins": ["transform-arrow-functions"] +} diff --git a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/output.js similarity index 81% rename from packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js rename to packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/output.js index c126fb594c81..b23abd2158c6 100644 --- a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/output.js +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/output.js @@ -1,6 +1,6 @@ var _arguments = [1, 2, 3]; -var arr = function arr(n) { +var arr = function (n) { return _arguments[0]; }; @@ -9,7 +9,7 @@ arr(4); // 1 function foo(n) { var _arguments2 = arguments; - var f = function f() { + var f = function () { return _arguments2[0] + n; }; // foo's implicit arguments binding. arguments[0] is n diff --git a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/options.json b/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/options.json deleted file mode 100644 index 238d46b51905..000000000000 --- a/packages/babel-traverse/test/fixtures/conversion/implicit-var-arguments/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "sourceType": "unambiguous", - "presets": ["env"] -}