tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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);