diff --git a/packages/babel-core/src/transformation/internal-plugins/shadow-functions.js b/packages/babel-core/src/transformation/internal-plugins/shadow-functions.js index 76e137002c..ccd753cc55 100644 --- a/packages/babel-core/src/transformation/internal-plugins/shadow-functions.js +++ b/packages/babel-core/src/transformation/internal-plugins/shadow-functions.js @@ -30,6 +30,7 @@ function remap(path, key, create) { let shadowFunction = path.node._shadowedFunctionLiteral; let currentFunction; + let passedShadowFunction = false; let fnPath = path.findParent(function (path) { if (path.isProgram() || path.isFunction()) { @@ -38,13 +39,18 @@ function remap(path, key, create) { } if (path.isProgram()) { + passedShadowFunction = true; + return true; } else if (path.isFunction() && !path.isArrowFunctionExpression()) { if (shadowFunction) { - return path === shadowFunction || path.node === shadowFunction.node; + if (path === shadowFunction || path.node === shadowFunction.node) return true; } else { - return !path.is("shadow"); + if (!path.is("shadow")) return true; } + + passedShadowFunction = true; + return false; } return false; @@ -53,6 +59,10 @@ function remap(path, key, create) { // no point in realiasing if we're in this function if (fnPath === currentFunction) return; + // If the only functions that were encountered are arrow functions, skip remapping the + // binding since arrow function syntax already does that. + if (!passedShadowFunction) return; + let cached = fnPath.getData(key); if (cached) return path.replaceWith(cached); diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/deeply-nested-asyncs/expected.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/deeply-nested-asyncs/expected.js index 9bc186bfde..b32aae134c 100644 --- a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/deeply-nested-asyncs/expected.js +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/deeply-nested-asyncs/expected.js @@ -1,37 +1,34 @@ -let s = function () { - var ref = babelHelpers.asyncToGenerator(function* (x) { - let t = (() => { - var _this3 = this; - - var ref = babelHelpers.asyncToGenerator(function* (y, a) { - let r = (() => { - var _this2 = this; - - var ref = babelHelpers.asyncToGenerator(function* (z, b) { - yield z; - return _this2.x; - }), - _this = this; - - return function r(_x4, _x5) { - return ref.apply(_this, arguments); - }; - })(); - yield r(); - - return _this3.g(r); - }), - _this = this; - - return function t(_x2, _x3) { - return ref.apply(_this, arguments); - }; - })(); - - yield t(); - return this.h(t); - }); - return function s(_x) { - return ref.apply(this, arguments); - }; -}(); +let s = function () { + var ref = babelHelpers.asyncToGenerator(function* (x) { + var _this2 = this; + + let t = (() => { + var ref = babelHelpers.asyncToGenerator(function* (y, a) { + let r = (() => { + var ref = babelHelpers.asyncToGenerator(function* (z, b) { + yield z; + return _this2.x; + }), + _this = _this2; + + return function r(_x4, _x5) { + return ref.apply(_this, arguments); + }; + })(); + yield r(); + + return _this2.g(r); + }), + _this = this; + return function t(_x2, _x3) { + return ref.apply(_this, arguments); + }; + })(); + + yield t(); + return this.h(t); + }); + return function s(_x) { + return ref.apply(this, arguments); + }; +}();