From 98e71543f05faaffd7350c6bfbd9bfe7dae2b7d5 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Wed, 11 Nov 2020 13:40:27 +0530 Subject: [PATCH] fix: arrow-fn transformation when 'arguments' is defined as var --- .../arrow-functions/arguments/input.js | 44 ++++++++++++ .../arrow-functions/arguments/output.js | 67 +++++++++++++++++++ .../babel-traverse/src/path/conversion.js | 18 +++-- 3 files changed, 125 insertions(+), 4 deletions(-) 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 198ac999f6ae..78455bfe3cea 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 @@ -43,3 +43,47 @@ function six(obj) { return fn(); } six(); + +var seven = () => { + var arguments = 1; + return arguments; +}; +seven(); + +var eight = () => { + var arguments = 1; + return () => arguments; +}; +eight(); + +function nine() { + var arguments = 1; + var foo = () => { + return arguments; + }; +} +nine(); + +var arguments = 1; +function ten() { + var foo = () => { + return arguments; + }; +} +ten(); + +var eleven = () => { + var arguments = 2; + return function () { + return () => arguments; + } +}; +eleven()(1,2,3)(); + +var twelve = () => { + var arguments = 2; + return class { + m() { return () => arguments; } + } +}; +twelve(); 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 84bbb58be445..964e12425f98 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 = arguments; + function one() { var _arguments = arguments; @@ -81,3 +83,68 @@ function six(obj) { } six(); + +var seven = function () { + var arguments = 1; + return arguments; +}; + +seven(); + +var eight = function () { + var arguments = 1; + return function () { + return _arguments6; + }; +}; + +eight(); + +function nine() { + var _arguments7 = arguments; + var arguments = 1; + + var foo = function () { + return _arguments7; + }; +} + +nine(); +var arguments = 1; + +function ten() { + var _arguments8 = arguments; + + var foo = function () { + return _arguments8; + }; +} + +ten(); + +var eleven = function () { + var arguments = 2; + return function () { + var _arguments9 = arguments; + return function () { + return _arguments9; + }; + }; +}; + +eleven()(1, 2, 3)(); + +var twelve = function () { + var arguments = 2; + return class { + m() { + var _arguments10 = arguments; + return function () { + return _arguments10; + }; + } + + }; +}; + +twelve(); diff --git a/packages/babel-traverse/src/path/conversion.js b/packages/babel-traverse/src/path/conversion.js index 2ca47297c9ab..fd68dbffc9b8 100644 --- a/packages/babel-traverse/src/path/conversion.js +++ b/packages/babel-traverse/src/path/conversion.js @@ -223,10 +223,20 @@ function hoistFunctionEnvironment( ); argumentsPaths.forEach(argumentsChild => { - const argsRef = t.identifier(argumentsBinding); - argsRef.loc = argumentsChild.node.loc; - - argumentsChild.replaceWith(argsRef); + let currentScope = argumentsChild.scope; + do { + if ( + !currentScope.hasOwnBinding("arguments") && + !( + currentScope.path.isFunction() && + !currentScope.path.isArrowFunctionExpression() + ) + ) { + const argsRef = t.identifier(argumentsBinding); + argsRef.loc = argumentsChild.node.loc; + argumentsChild.replaceWith(argsRef); + } + } while ((currentScope = currentScope.parent)); }); }