diff --git a/lib/babel/transformation/helpers/name-method.js b/lib/babel/transformation/helpers/name-method.js index 0346c7126c..927002b586 100644 --- a/lib/babel/transformation/helpers/name-method.js +++ b/lib/babel/transformation/helpers/name-method.js @@ -15,49 +15,20 @@ var visitor = { if (localDeclar !== state.outerDeclar) return; state.selfReference = true; - state.references.push(this); - - if (t.isPattern(parent) || t.isAssignmentExpression(parent) || t.isUpdateExpression(parent)) { - state.selfAssignment = true; - } + this.stop(); } }; -var wrapIncludesSelfReference = function (state, method, id, scope) { - var outerId = scope.generateUidIdentifier("getOuter"); - var outerIdCall = t.callExpression(outerId, []); - - for (var i = 0; i < state.references.length; i++) { - state.references[i].replaceNode(outerIdCall); - } - - method.id = id; - - return util.template("named-function", { - GET_OUTER_ID: outerId, - FUNCTION_ID: id, - FUNCTION: method - }); -}; - -var wrapIncludesSelfAssignment = function (state, method, id, scope) { - var templateName = "property-method-assignment-wrapper"; - if (method.generator) templateName += "-generator"; - return util.template(templateName, { - FUNCTION: method, - FUNCTION_ID: id, - FUNCTION_KEY: scope.generateUidIdentifier(id.name), - WRAPPER_KEY: scope.generateUidIdentifier(id.name + "Wrapper") - }); -}; - var wrap = function (state, method, id, scope) { if (state.selfReference) { - if (state.selfAssignment) { - return wrapIncludesSelfAssignment(state, method, id, scope); - } else { - return wrapIncludesSelfReference(state, method, id, scope); - } + var templateName = "property-method-assignment-wrapper"; + if (method.generator) templateName += "-generator"; + return util.template(templateName, { + FUNCTION: method, + FUNCTION_ID: id, + FUNCTION_KEY: scope.generateUidIdentifier(id.name), + WRAPPER_KEY: scope.generateUidIdentifier(id.name + "Wrapper") + }); } else { method.id = id; return method; @@ -92,7 +63,6 @@ var visit = function (node, name, scope) { // this isn't to the spec and they've invented this behaviour which is // **extremely** annoying so we avoid setting the name if it has a param // with the same id - state.selfAssignment = true; state.selfReference = true; } else { // otherwise it's defined somewhere in scope like: diff --git a/test/fixtures/transformation/spec-function-name/all/expected.js b/test/fixtures/transformation/spec-function-name/all/expected.js index f13ce1a6b9..82795f8962 100644 --- a/test/fixtures/transformation/spec-function-name/all/expected.js +++ b/test/fixtures/transformation/spec-function-name/all/expected.js @@ -9,15 +9,19 @@ var obj = { }, // self reference - h: (function () { - function _getOuter() { - return h; - } - - return function h() { - console.log(_getOuter()); + h: (function (_h) { + var _hWrapper = function h() { + return _h.apply(this, arguments); }; - })(), + + _hWrapper.toString = function () { + return _h.toString(); + }; + + return _hWrapper; + })(function () { + console.log(h); + }), // no reference m: function m() { @@ -31,15 +35,19 @@ var f = function f() { }; // self reference -var f = (function () { - function _getOuter() { - return f; - } - - return function f() { - console.log(_getOuter(), g); +var f = (function (_f) { + var _fWrapper = function f() { + return _f.apply(this, arguments); }; -})(); + + _fWrapper.toString = function () { + return _f.toString(); + }; + + return _fWrapper; +})(function () { + console.log(f, g); +}); // no reference var g = function g() {