From 2cbb3ecf5518af9cc106eec2dc2feef3b41f8270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sun, 9 May 2021 21:29:09 +0000 Subject: [PATCH] Review by @nicolo-ribaudo --- .../misc/regression-2364/output.js | 4 +- .../arguments-global-undeclared/input.js | 9 ++++ .../arguments-global-undeclared/output.js | 19 +++++++ .../arguments-global-var/input.js | 10 ++++ .../arguments-global-var/output.js | 19 +++++++ .../arrow-functions/arguments/input.js | 8 --- .../arrow-functions/arguments/output.js | 54 +++++++++---------- .../babel-traverse/src/path/conversion.ts | 32 ++++++++--- 8 files changed, 109 insertions(+), 46 deletions(-) create mode 100644 packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-undeclared/input.js create mode 100644 packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-undeclared/output.js create mode 100644 packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/input.js create mode 100644 packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js diff --git a/packages/babel-core/test/fixtures/transformation/misc/regression-2364/output.js b/packages/babel-core/test/fixtures/transformation/misc/regression-2364/output.js index e41848249b1f..c1079c01cbbf 100644 --- a/packages/babel-core/test/fixtures/transformation/misc/regression-2364/output.js +++ b/packages/babel-core/test/fixtures/transformation/misc/regression-2364/output.js @@ -1,7 +1,9 @@ function wrapper(fn) { return function () { + var _arguments = arguments; + var _loop = function () { - var val = fn(...arguments); + var val = fn(..._arguments); return { v: val.test(function () { console.log(val); diff --git a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-undeclared/input.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-undeclared/input.js new file mode 100644 index 000000000000..42903d8904f6 --- /dev/null +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-undeclared/input.js @@ -0,0 +1,9 @@ +function fn() { + var foo = () => { + return arguments; + }; +} + +var bar = () => arguments; + +var baz = () => () => arguments; diff --git a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-undeclared/output.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-undeclared/output.js new file mode 100644 index 000000000000..7b046216524d --- /dev/null +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-undeclared/output.js @@ -0,0 +1,19 @@ +var _arguments2 = typeof arguments === "undefined" ? void 0 : arguments; + +function fn() { + var _arguments = arguments; + + var foo = function () { + return _arguments; + }; +} + +var bar = function () { + return _arguments2; +}; + +var baz = function () { + return function () { + return _arguments2; + }; +}; diff --git a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/input.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/input.js new file mode 100644 index 000000000000..5f7d9826d3d3 --- /dev/null +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/input.js @@ -0,0 +1,10 @@ +var arguments = 1; +function fn() { + var foo = () => { + return arguments; + }; +} + +var bar = () => arguments; + +var baz = () => () => arguments; 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 new file mode 100644 index 000000000000..f19432c82500 --- /dev/null +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments-global-var/output.js @@ -0,0 +1,19 @@ +var _arguments2 = 1; + +function fn() { + var _arguments = _arguments2; + + var foo = function () { + return _arguments; + }; +} + +var bar = function () { + return _arguments2; +}; + +var baz = function () { + return function () { + return _arguments2; + }; +}; diff --git a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/input.js b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/input.js index 78455bfe3cea..5d9e7c90913a 100644 --- a/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/input.js +++ b/packages/babel-plugin-transform-arrow-functions/test/fixtures/arrow-functions/arguments/input.js @@ -64,14 +64,6 @@ function nine() { } nine(); -var arguments = 1; -function ten() { - var foo = () => { - return arguments; - }; -} -ten(); - var eleven = () => { var arguments = 2; return function () { 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 3705969fc92c..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 @@ -1,10 +1,8 @@ -var _arguments4 = arguments; - function one() { - var _arguments2 = arguments; + var _arguments = arguments; var inner = function () { - return _arguments2; + return _arguments; }; return [].slice.call(inner()); @@ -13,13 +11,17 @@ function one() { one(1, 2); function two() { + var _arguments2 = arguments; + var inner = function () { - return _arguments; + return _arguments2; }; var another = function () { + var _arguments3 = arguments; + var inner2 = function () { - return _arguments; + return _arguments3; }; }; @@ -29,8 +31,10 @@ function two() { two(1, 2); function three() { + var _arguments4 = arguments; + var fn = function () { - return _arguments[0] + "bar"; + return _arguments4[0] + "bar"; }; return fn(); @@ -39,8 +43,10 @@ function three() { three("foo"); function four() { + var _arguments5 = arguments; + var fn = function () { - return _arguments[0].foo + "bar"; + return _arguments5[0].foo + "bar"; }; return fn(); @@ -65,7 +71,7 @@ five({ function six(obj) { var fn = function () { var fn2 = function () { - return _arguments[0]; + return arguments[0]; }; return fn2("foobar"); @@ -77,47 +83,37 @@ function six(obj) { six(); var seven = function () { - var arguments = 1; - return arguments; + var _arguments6 = 1; + return _arguments6; }; seven(); var eight = function () { - var _arguments3 = 1; + var _arguments7 = 1; return function () { - return _arguments4; + return _arguments7; }; }; eight(); function nine() { - var _arguments6 = arguments; - var _arguments5 = 1; + var _arguments8 = 1; var foo = function () { - return _arguments6; + return _arguments8; }; } nine(); -var _arguments = 1; - -function ten() { - var foo = function () { - return _arguments; - }; -} - -ten(); var eleven = function () { - var _arguments7 = 2; + var arguments = 2; return function () { - var _arguments8 = arguments; + var _arguments9 = arguments; return function () { - return _arguments8; + return _arguments9; }; }; }; @@ -125,7 +121,7 @@ var eleven = function () { eleven()(1, 2, 3)(); var twelve = function () { - var _arguments9 = 2; + var arguments = 2; return class { m() { var _arguments10 = arguments; diff --git a/packages/babel-traverse/src/path/conversion.ts b/packages/babel-traverse/src/path/conversion.ts index c71b4c1e55ac..fc2668a12d29 100644 --- a/packages/babel-traverse/src/path/conversion.ts +++ b/packages/babel-traverse/src/path/conversion.ts @@ -231,9 +231,22 @@ function hoistFunctionEnvironment( // Convert all "arguments" references in the arrow to point at the alias. if (argumentsPaths.length > 0) { - const argumentsBinding = getBinding(thisEnvFn, "arguments", () => - t.identifier("arguments"), - ); + const argumentsBinding = getBinding(thisEnvFn, "arguments", () => { + const args = () => t.identifier("arguments"); + if (thisEnvFn.scope.path.isProgram()) { + return t.conditionalExpression( + t.binaryExpression( + "===", + t.unaryExpression("typeof", args()), + t.stringLiteral("undefined"), + ), + thisEnvFn.scope.buildUndefinedNode(), + args(), + ); + } else { + return args(); + } + }); argumentsPaths.forEach(argumentsChild => { const argsRef = t.identifier(argumentsBinding); @@ -586,17 +599,20 @@ function getScopeInformation(fnPath) { if (child.get("object").isSuper()) superProps.push(child); }, ReferencedIdentifier(child) { + if (child.node.name !== "arguments") return; + let curr = child.scope; do { - if (curr.hasOwnBinding("arguments")) return; + if (curr.hasOwnBinding("arguments")) { + curr.rename("arguments"); + return; + } if (curr.path.isFunction() && !curr.path.isArrowFunctionExpression()) { break; } - if (child.node.name !== "arguments") return; - - curr.rename("arguments"); - argumentsPaths.push(child); } while ((curr = curr.parent)); + + argumentsPaths.push(child); }, MetaProperty(child) { if (!child.get("meta").isIdentifier({ name: "new" })) return;