Avoid renaming this bindings in simple arrow function cases.

This commit is contained in:
Logan Smyth 2016-03-06 17:06:19 -08:00
parent db3a43869c
commit 51ddeade8a
2 changed files with 46 additions and 39 deletions

View File

@ -30,6 +30,7 @@ function remap(path, key, create) {
let shadowFunction = path.node._shadowedFunctionLiteral; let shadowFunction = path.node._shadowedFunctionLiteral;
let currentFunction; let currentFunction;
let passedShadowFunction = false;
let fnPath = path.findParent(function (path) { let fnPath = path.findParent(function (path) {
if (path.isProgram() || path.isFunction()) { if (path.isProgram() || path.isFunction()) {
@ -38,13 +39,18 @@ function remap(path, key, create) {
} }
if (path.isProgram()) { if (path.isProgram()) {
passedShadowFunction = true;
return true; return true;
} else if (path.isFunction() && !path.isArrowFunctionExpression()) { } else if (path.isFunction() && !path.isArrowFunctionExpression()) {
if (shadowFunction) { if (shadowFunction) {
return path === shadowFunction || path.node === shadowFunction.node; if (path === shadowFunction || path.node === shadowFunction.node) return true;
} else { } else {
return !path.is("shadow"); if (!path.is("shadow")) return true;
} }
passedShadowFunction = true;
return false;
} }
return false; return false;
@ -53,6 +59,10 @@ function remap(path, key, create) {
// no point in realiasing if we're in this function // no point in realiasing if we're in this function
if (fnPath === currentFunction) return; 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); let cached = fnPath.getData(key);
if (cached) return path.replaceWith(cached); if (cached) return path.replaceWith(cached);

View File

@ -1,17 +1,15 @@
let s = function () { let s = function () {
var ref = babelHelpers.asyncToGenerator(function* (x) { var ref = babelHelpers.asyncToGenerator(function* (x) {
let t = (() => {
var _this3 = this;
var ref = babelHelpers.asyncToGenerator(function* (y, a) {
let r = (() => {
var _this2 = this; var _this2 = this;
let t = (() => {
var ref = babelHelpers.asyncToGenerator(function* (y, a) {
let r = (() => {
var ref = babelHelpers.asyncToGenerator(function* (z, b) { var ref = babelHelpers.asyncToGenerator(function* (z, b) {
yield z; yield z;
return _this2.x; return _this2.x;
}), }),
_this = this; _this = _this2;
return function r(_x4, _x5) { return function r(_x4, _x5) {
return ref.apply(_this, arguments); return ref.apply(_this, arguments);
@ -19,10 +17,9 @@ let s = function () {
})(); })();
yield r(); yield r();
return _this3.g(r); return _this2.g(r);
}), }),
_this = this; _this = this;
return function t(_x2, _x3) { return function t(_x2, _x3) {
return ref.apply(_this, arguments); return ref.apply(_this, arguments);
}; };