From add64e870bef076c3e42f68fd8a05ac9467fdbe1 Mon Sep 17 00:00:00 2001 From: Sneh Khatri Date: Mon, 13 Dec 2021 22:59:10 +0530 Subject: [PATCH] Don't resolve shadowed `arguments` variables from functions (#14036) --- .../arguments-global-var/output.js | 2 +- .../implicit-var-arguments/exec.js | 11 +++++++++++ .../implicit-var-arguments/input.js | 10 ++++++++++ .../implicit-var-arguments/options.json | 4 ++++ .../implicit-var-arguments/output.js | 18 ++++++++++++++++++ packages/babel-traverse/src/scope/index.ts | 7 +++++++ 6 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/exec.js create mode 100644 packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/input.js create mode 100644 packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/options.json create mode 100644 packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/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..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,7 +1,7 @@ var _arguments2 = 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/implicit-var-arguments/exec.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/exec.js new file mode 100644 index 000000000000..428e0f6986b2 --- /dev/null +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/exec.js @@ -0,0 +1,11 @@ +var arguments = [1, 2, 3]; +var arr = () => arguments[0]; + +expect(arr()).toStrictEqual(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-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/input.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/input.js new file mode 100644 index 000000000000..31a30fd84854 --- /dev/null +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/input.js @@ -0,0 +1,10 @@ +var arguments = [1, 2, 3]; +var arr = (n) => arguments[0]; + +arr(4); // 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-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-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/output.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/output.js new file mode 100644 index 000000000000..b23abd2158c6 --- /dev/null +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/implicit-var-arguments/output.js @@ -0,0 +1,18 @@ +var _arguments = [1, 2, 3]; + +var arr = function (n) { + return _arguments[0]; +}; + +arr(4); // 1 + +function foo(n) { + var _arguments2 = arguments; + + var f = function () { + return _arguments2[0] + n; + }; // foo's implicit arguments binding. arguments[0] is n + + + return f(); +} 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));