function wrap(state, method, id, scope) { if (state.selfReference) { if (scope.hasBinding(id.name) && !scope.hasGlobal(id.name)) { // we can just munge the local binding scope.rename(id.name); } else { // we don't currently support wrapping class expressions if (!t.isFunction(method)) return; // need to add a wrapper since we can't change the references let build = buildPropertyMethodAssignmentWrapper; if (method.generator) build = buildGeneratorPropertyMethodAssignmentWrapper; let template = build({ FUNCTION: method, FUNCTION_ID: id, FUNCTION_KEY: scope.generateUidIdentifier(id.name) }).expression; template.callee._skipModulesRemap = true; // 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 let params = template.callee.body.body[0].params; for (let i = 0, len = getFunctionArity(method); i < len; i++) { params.push(scope.generateUidIdentifier("x")); } return template; } } method.id = id; scope.getProgramParent().references[id.name] = true; }
argsIdentifier._shadowedFunctionLiteral = path; // push a default parameter definition function pushDefNode(left, right, i) { const defNode = buildDefaultParam({ VARIABLE_NAME: left, DEFAULT_VALUE: right, ARGUMENT_KEY: t.numericLiteral(i), ARGUMENTS: argsIdentifier }); defNode._blockHoist = node.params.length - i; body.push(defNode); } // const lastNonDefaultParam = getFunctionArity(node); // const params = path.get("params"); for (let i = 0; i < params.length; i++) { const param = params[i]; if (!param.isAssignmentPattern()) { if (!state.iife && !param.isIdentifier()) { param.traverse(iifeVisitor, state); } continue; } const left = param.get("left");