From f38831df2394d541e2e3dc34d2a1b7b43b32233c 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 is defined as var --- .../arrow-functions/arguments/input.js | 28 +++++++++++++ .../arrow-functions/arguments/output.js | 40 +++++++++++++++++++ .../babel-traverse/src/path/conversion.js | 18 +++++++-- 3 files changed, 82 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..1c267271b0f2 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,31 @@ 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(); \ No newline at end of file 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..ae6ed4618f55 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,41 @@ 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(); diff --git a/packages/babel-traverse/src/path/conversion.js b/packages/babel-traverse/src/path/conversion.js index 2ca47297c9ab..65851253f393 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.isFunctionExpression() || + currentScope.path.isFunctionDeclaration() + ) + ) { + const argsRef = t.identifier(argumentsBinding); + argsRef.loc = argumentsChild.node.loc; + argumentsChild.replaceWith(argsRef); + } + } while ((currentScope = currentScope.parent)); }); }