diff --git a/src/babel/transformation/helpers/get-function-arity.js b/src/babel/transformation/helpers/get-function-arity.js new file mode 100644 index 0000000000..faebae2cc7 --- /dev/null +++ b/src/babel/transformation/helpers/get-function-arity.js @@ -0,0 +1,9 @@ +var t = require("../../types"); + +module.exports = function (node) { + var lastNonDefault = 0; + for (var i = 0; i < node.params.length; i++) { + if (!t.isAssignmentPattern(node.params[i])) lastNonDefault = i + 1; + } + return lastNonDefault; +}; diff --git a/src/babel/transformation/helpers/name-method.js b/src/babel/transformation/helpers/name-method.js index 31ddb8ab73..4593254130 100644 --- a/src/babel/transformation/helpers/name-method.js +++ b/src/babel/transformation/helpers/name-method.js @@ -1,5 +1,6 @@ -var util = require("../../util"); -var t = require("../../types"); +var getFunctionArity = require("./get-function-arity"); +var util = require("../../util"); +var t = require("../../types"); var visitor = { enter(node, parent, scope, state) { @@ -21,12 +22,21 @@ var wrap = function (state, method, id, scope) { if (state.selfReference) { var templateName = "property-method-assignment-wrapper"; if (method.generator) templateName += "-generator"; - return util.template(templateName, { + var template = util.template(templateName, { FUNCTION: method, FUNCTION_ID: id, FUNCTION_KEY: scope.generateUidIdentifier(id.name), WRAPPER_KEY: scope.generateUidIdentifier(id.name + "Wrapper") }); + + // shim in dummy params to retain function arity, if you try to read the + // source then you'll get the original since it's proxied so it's all good + var params = template.callee.body.body[0].declarations[0].init.params; + for (var i = 0, len = getFunctionArity(method); i < len; i++) { + params.push(scope.generateUidIdentifier("x")); + } + + return template; } else { method.id = id; return method;