Source code

Revision control

Copy as Markdown

Other Tools

var BUGNUMBER = 883377;
var summary = "Anonymous function name should be set based on assignment";
print(BUGNUMBER + ": " + summary);
var fooSymbol = Symbol("foo");
var emptySymbol = Symbol("");
var undefSymbol = Symbol();
var globalVar;
var exprs = [
["function() {}", false],
["function named() {}", true],
["function*() {}", false],
["function* named() {}", true],
["async function() {}", false],
["async function named() {}", true],
["() => {}", false],
["async () => {}", false],
["class {}", false],
["class named {}", true],
];
function testAssignmentExpression(expr, named) {
eval(`
var assignment;
assignment = ${expr};
assertEq(assignment.name, named ? "named" : "assignment");
globalVar = ${expr};
assertEq(globalVar.name, named ? "named" : "globalVar");
var obj = { dynamic: null };
with (obj) {
dynamic = ${expr};
}
assertEq(obj.dynamic.name, named ? "named" : "dynamic");
(function namedLambda(param1, param2) {
var assignedToNamedLambda;
assignedToNamedLambda = namedLambda = ${expr};
assertEq(namedLambda.name, "namedLambda");
assertEq(assignedToNamedLambda.name, named ? "named" : "namedLambda");
param1 = ${expr};
assertEq(param1.name, named ? "named" : "param1");
{
let param1 = ${expr};
assertEq(param1.name, named ? "named" : "param1");
param2 = ${expr};
assertEq(param2.name, named ? "named" : "param2");
}
})();
{
let nextedLexical1, nextedLexical2;
{
let nextedLexical1 = ${expr};
assertEq(nextedLexical1.name, named ? "named" : "nextedLexical1");
nextedLexical2 = ${expr};
assertEq(nextedLexical2.name, named ? "named" : "nextedLexical2");
}
}
`);
// Not applicable cases: not IsIdentifierRef.
eval(`
var inParen;
(inParen) = ${expr};
assertEq(inParen.name, named ? "named" : "");
`);
// Not applicable cases: not direct RHS.
if (!expr.includes("=>")) {
eval(`
var a = true && ${expr};
assertEq(a.name, named ? "named" : "");
`);
} else {
// Arrow function cannot be RHS of &&.
eval(`
var a = true && (${expr});
assertEq(a.name, named ? "named" : "");
`);
}
// Not applicable cases: property.
eval(`
var obj = {};
obj.prop = ${expr};
assertEq(obj.prop.name, named ? "named" : "");
obj["literal"] = ${expr};
assertEq(obj["literal"].name, named ? "named" : "");
`);
// Not applicable cases: assigned again.
eval(`
var tmp = [${expr}];
assertEq(tmp[0].name, named ? "named" : "");
var assignment;
assignment = tmp[0];
assertEq(assignment.name, named ? "named" : "");
`);
}
for (var [expr, named] of exprs) {
testAssignmentExpression(expr, named);
}
function testVariableDeclaration(expr, named) {
eval(`
var varDecl = ${expr};
assertEq(varDecl.name, named ? "named" : "varDecl");
`);
}
for (var [expr, named] of exprs) {
testVariableDeclaration(expr, named);
}
function testLexicalBinding(expr, named) {
eval(`
let lexical = ${expr};
assertEq(lexical.name, named ? "named" : "lexical");
const constLexical = ${expr};
assertEq(constLexical.name, named ? "named" : "constLexical");
`);
}
for (var [expr, named] of exprs) {
testLexicalBinding(expr, named);
}
if (typeof reportCompare === "function")
reportCompare(0, 0);