refer to parent arguments inside arrow functions - fixes #39

This commit is contained in:
Sebastian McKenzie
2014-10-11 09:29:00 +11:00
parent 35522c2ef3
commit 9b82c5b99c
3 changed files with 64 additions and 0 deletions

View File

@@ -24,3 +24,32 @@ exports.ArrowFunctionExpression = function (node) {
return node;
}
};
exports.FunctionDeclaration =
exports.FunctionExpression = function (node, parent, opts, generateUid) {
var hasArguments = false;
var id;
// traverse the function and find all arrow functions
traverse(node, function (node) {
if (node.type !== "ArrowFunctionExpression") return;
traverse(node, function (node, parent) {
if (node.type === "Identifier" && node.name === "arguments" &&
parent.type !== "MemberExpression") {
hasArguments = true;
id = id || b.identifier(generateUid("arguments"));
return id;
}
}, ["FunctionDeclaration", "FunctionExpression", "ArrowFunctionExpression"]);
return false;
}, ["FunctionDeclaration", "FunctionExpression"]);
if (hasArguments) {
util.ensureBlock(node);
node.body.body.unshift(b.variableDeclaration("var", [
b.variableDeclarator(id, b.identifier("arguments"))
]));
}
};

View File

@@ -0,0 +1,16 @@
function outer() {
var inner = () => arguments;
return [].slice.call(inner());
}
console.log(outer(1, 2));
function outer() {
var inner = () => arguments;
var another = function () {
var inner2 = () => arguments;
};
return [].slice.call(inner());
}
console.log(outer(1, 2));

View File

@@ -0,0 +1,19 @@
function outer() {
var _arguments = arguments;
var inner = function () { return _arguments; };
return [].slice.call(inner());
}
console.log(outer(1, 2));
function outer() {
var _arguments2 = arguments;
var inner = function () { return _arguments2; };
var another = function () {
var _arguments3 = arguments;
var inner2 = function () { return _arguments3; };
};
return [].slice.call(inner());
}
console.log(outer(1, 2));