don't shadow default parameter scope iife and instead just apply the this and arguments - fixes #1128

This commit is contained in:
Sebastian McKenzie
2015-04-09 14:58:33 -07:00
parent 704b31f44f
commit 4e6aed0408
3 changed files with 37 additions and 5 deletions

View File

@@ -1,10 +1,33 @@
import traverse from "../../traversal";
import * as t from "../../types";
export default function (node) {
var container = t.functionExpression(null, [], node.body, node.generator, node.async);
container.shadow = true;
var visitor = {
enter(node, parent, scope, state) {
if (this.isThisExpression() || this.isReferencedIdentifier({ name: "arguments" })) {
state.found = true;
this.stop();
}
var call = t.callExpression(container, []);
if (this.isFunction()) {
this.skip();
}
}
};
export default function (node, scope) {
var container = t.functionExpression(null, [], node.body, node.generator, node.async);
var callee = container;
var args = [];
var state = { found: false };
scope.traverse(node, visitor, state);
if (state.found) {
callee = t.memberExpression(container, t.identifier("apply"));
args = [t.thisExpression(), t.identifier("arguments")];
}
var call = t.callExpression(callee, args);
if (node.generator) call = t.yieldExpression(call, true);
return t.returnStatement(call);

View File

@@ -92,7 +92,7 @@ exports.Function = function (node, parent, scope, file) {
node.params = node.params.slice(0, lastNonDefaultParam);
if (state.iife) {
body.push(callDelegate(node));
body.push(callDelegate(node, scope));
node.body = t.blockStatement(body);
} else {
node.body.body = body.concat(node.body.body);