syntax.js (4552B)
1 var BUGNUMBER = 1185106; 2 var summary = "async/await syntax"; 3 4 print(BUGNUMBER + ": " + summary); 5 6 if (typeof Reflect !== "undefined" && Reflect.parse) { 7 assertEq(Reflect.parse("function a() {}").body[0].async, false); 8 assertEq(Reflect.parse("function* a() {}").body[0].async, false); 9 assertEq(Reflect.parse("async function a() {}").body[0].async, true); 10 assertEq(Reflect.parse("() => {}").body[0].async, undefined); 11 12 // No line terminator after async 13 assertEq(Reflect.parse("async\nfunction a(){}").body[0].expression.name, "async"); 14 15 // Async function expressions 16 assertEq(Reflect.parse("(async function() {})()").body[0].expression.callee.async, true); 17 assertEq(Reflect.parse("var k = async function() {}").body[0].declarations[0].init.async, true); 18 assertEq(Reflect.parse("var nmd = async function named() {}").body[0].declarations[0].init.id.name, "named"); 19 20 // `await` handling for function declaration name inherits. 21 assertEq(Reflect.parse("async function await() {}").body[0].id.name, "await"); 22 assertThrowsInstanceOf(() => Reflect.parse("async function f() { async function await() {} }"), SyntaxError); 23 24 // `await` is not allowed in function expression name. 25 assertThrowsInstanceOf(() => Reflect.parse("(async function await() {})"), SyntaxError); 26 27 // Awaiting not directly inside an async function is not allowed 28 assertThrowsInstanceOf(() => Reflect.parse("await 4;"), SyntaxError); 29 assertThrowsInstanceOf(() => Reflect.parse("function a() { await 4; }"), SyntaxError); 30 assertThrowsInstanceOf(() => Reflect.parse("function* a() { await 4; }"), SyntaxError); 31 assertThrowsInstanceOf(() => Reflect.parse("async function k() { function a() { await 4; } }"), SyntaxError); 32 33 // Await is not allowed as a default expr. 34 assertThrowsInstanceOf(() => Reflect.parse("async function a(k = await 3) {}"), SyntaxError); 35 assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b(k = await 3) {} }"), SyntaxError); 36 assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b(k = [await 3]) {} }"), SyntaxError); 37 38 assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b([k = await 3]) {} }"), SyntaxError); 39 assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b([k = [await 3]]) {} }"), SyntaxError); 40 assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b({k = await 3}) {} }"), SyntaxError); 41 assertThrowsInstanceOf(() => Reflect.parse("async function a() { async function b({k = [await 3]}) {} }"), SyntaxError); 42 43 // Await is not legal as an identifier in an async function. 44 assertThrowsInstanceOf(() => Reflect.parse("async function a() { var await = 4; }"), SyntaxError); 45 assertThrowsInstanceOf(() => Reflect.parse("async function a() { return await; }"), SyntaxError); 46 47 // Await is still available as an identifier name in strict mode code. 48 Reflect.parse("function a() { 'use strict'; var await = 3; }"); 49 Reflect.parse("'use strict'; var await = 3;"); 50 51 // Await is treated differently depending on context. Various cases. 52 Reflect.parse("var await = 3; async function a() { await 4; }"); 53 Reflect.parse("async function a() { await 4; } var await = 5"); 54 Reflect.parse("async function a() { function b() { return await; } }"); 55 56 Reflect.parse("async function a() { var k = { async: 4 } }"); 57 58 Reflect.parse("function a() { await: 4 }"); 59 60 assertEq(Reflect.parse("async function a() { await 4; }") 61 .body[0].body.body[0].expression.operator, "await"); 62 63 assertEq(Reflect.parse("async function a() { async function b() { await 4; } }") 64 .body[0].body.body[0].body.body[0].expression.operator, "await"); 65 66 // operator priority test 67 assertEq(Reflect.parse("async function a() { await 2 + 3; }") 68 .body[0].body.body[0].expression.left.argument.value, 2); 69 assertEq(Reflect.parse("async function a() { await 2 + 3; }") 70 .body[0].body.body[0].expression.left.operator, "await"); 71 assertEq(Reflect.parse("async function a() { await 2 + 3; }") 72 .body[0].body.body[0].expression.right.value, 3); 73 74 // blocks and other constructions 75 assertEq(Reflect.parse("{ async function a() { return 2; } }") 76 .body[0].body[0].async, true); 77 78 // Async function expression is primary expression. 79 Reflect.parse("(async function a() {}.constructor)"); 80 } 81 82 if (typeof reportCompare === "function") 83 reportCompare(true, true);