refer to parent arguments inside arrow functions - fixes #39
This commit is contained in:
@@ -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"))
|
||||
]));
|
||||
}
|
||||
};
|
||||
|
||||
16
test/fixtures/arrow-functions/arguments/actual.js
vendored
Normal file
16
test/fixtures/arrow-functions/arguments/actual.js
vendored
Normal 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));
|
||||
19
test/fixtures/arrow-functions/arguments/expected.js
vendored
Normal file
19
test/fixtures/arrow-functions/arguments/expected.js
vendored
Normal 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));
|
||||
Reference in New Issue
Block a user