Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix arrow transformation when arguments is defined as variable #12344

Merged
merged 4 commits into from Jul 6, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -1,7 +1,9 @@
function wrapper(fn) {
return function () {
var _arguments = arguments;

var _loop = function () {
var val = fn(...arguments);
var val = fn(..._arguments);
return {
v: val.test(function () {
console.log(val);
Expand Down
@@ -0,0 +1,9 @@
function fn() {
var foo = () => {
return arguments;
};
}

var bar = () => arguments;

var baz = () => () => arguments;
@@ -0,0 +1,19 @@
var _arguments2 = typeof arguments === "undefined" ? void 0 : arguments;

function fn() {
var _arguments = arguments;

var foo = function () {
return _arguments;
};
}

var bar = function () {
return _arguments2;
};

var baz = function () {
return function () {
return _arguments2;
};
};
@@ -0,0 +1,10 @@
var arguments = 1;
function fn() {
var foo = () => {
return arguments;
};
}

var bar = () => arguments;

var baz = () => () => arguments;
@@ -0,0 +1,19 @@
var _arguments2 = 1;

function fn() {
var _arguments = _arguments2;

var foo = function () {
return _arguments;
};
}

var bar = function () {
return _arguments2;
};

var baz = function () {
return function () {
return _arguments2;
};
};
Expand Up @@ -64,14 +64,6 @@ function nine() {
}
nine();

var arguments = 1;
function ten() {
var foo = () => {
return arguments;
};
}
ten();

var eleven = () => {
var arguments = 2;
return function () {
Expand Down
@@ -1,10 +1,8 @@
var _arguments4 = arguments;

function one() {
var _arguments2 = arguments;
var _arguments = arguments;

var inner = function () {
return _arguments2;
return _arguments;
};

return [].slice.call(inner());
Expand All @@ -13,13 +11,17 @@ function one() {
one(1, 2);

function two() {
var _arguments2 = arguments;

var inner = function () {
return _arguments;
return _arguments2;
};

var another = function () {
var _arguments3 = arguments;

var inner2 = function () {
return _arguments;
return _arguments3;
};
};

Expand All @@ -29,8 +31,10 @@ function two() {
two(1, 2);

function three() {
var _arguments4 = arguments;

var fn = function () {
return _arguments[0] + "bar";
return _arguments4[0] + "bar";
};

return fn();
Expand All @@ -39,8 +43,10 @@ function three() {
three("foo");

function four() {
var _arguments5 = arguments;

var fn = function () {
return _arguments[0].foo + "bar";
return _arguments5[0].foo + "bar";
};

return fn();
Expand All @@ -65,7 +71,7 @@ five({
function six(obj) {
var fn = function () {
var fn2 = function () {
return _arguments[0];
return arguments[0];
};

return fn2("foobar");
Expand All @@ -77,55 +83,45 @@ function six(obj) {
six();

var seven = function () {
var arguments = 1;
return arguments;
var _arguments6 = 1;
return _arguments6;
};

seven();

var eight = function () {
var _arguments3 = 1;
var _arguments7 = 1;
return function () {
return _arguments4;
return _arguments7;
};
};

eight();

function nine() {
var _arguments6 = arguments;
var _arguments5 = 1;
var _arguments8 = 1;

var foo = function () {
return _arguments6;
return _arguments8;
};
}

nine();
var _arguments = 1;

function ten() {
var foo = function () {
return _arguments;
};
}

ten();

var eleven = function () {
var _arguments7 = 2;
var arguments = 2;
return function () {
var _arguments8 = arguments;
var _arguments9 = arguments;
return function () {
return _arguments8;
return _arguments9;
};
};
};

eleven()(1, 2, 3)();

var twelve = function () {
var _arguments9 = 2;
var arguments = 2;
return class {
m() {
var _arguments10 = arguments;
Expand Down
32 changes: 24 additions & 8 deletions packages/babel-traverse/src/path/conversion.ts
Expand Up @@ -231,9 +231,22 @@ function hoistFunctionEnvironment(

// Convert all "arguments" references in the arrow to point at the alias.
if (argumentsPaths.length > 0) {
const argumentsBinding = getBinding(thisEnvFn, "arguments", () =>
t.identifier("arguments"),
);
const argumentsBinding = getBinding(thisEnvFn, "arguments", () => {
const args = () => t.identifier("arguments");
if (thisEnvFn.scope.path.isProgram()) {
return t.conditionalExpression(
t.binaryExpression(
"===",
t.unaryExpression("typeof", args()),
t.stringLiteral("undefined"),
),
thisEnvFn.scope.buildUndefinedNode(),
args(),
);
Comment on lines +236 to +245
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added this code to avoid the error described in #7673. It still isn't 100% correct since sometimes it doesn't throw the error if arguments is undeclared, but at least it doesn't throw for valid code.

} else {
return args();
}
});

argumentsPaths.forEach(argumentsChild => {
const argsRef = t.identifier(argumentsBinding);
Expand Down Expand Up @@ -586,17 +599,20 @@ function getScopeInformation(fnPath) {
if (child.get("object").isSuper()) superProps.push(child);
},
ReferencedIdentifier(child) {
if (child.node.name !== "arguments") return;

let curr = child.scope;
do {
if (curr.hasOwnBinding("arguments")) return;
if (curr.hasOwnBinding("arguments")) {
curr.rename("arguments");
return;
}
if (curr.path.isFunction() && !curr.path.isArrowFunctionExpression()) {
break;
}
if (child.node.name !== "arguments") return;

curr.rename("arguments");
argumentsPaths.push(child);
} while ((curr = curr.parent));

argumentsPaths.push(child);
},
MetaProperty(child) {
if (!child.get("meta").isIdentifier({ name: "new" })) return;
Expand Down