summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/async-functions/syntax-arrow.js
blob: a2c96e7dd95b40699155e77ef90e92aa18724987 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
var BUGNUMBER = 1185106;
var summary = "async arrow function syntax";

print(BUGNUMBER + ": " + summary);

if (typeof Reflect !== "undefined" && Reflect.parse) {
    // Parameters.
    Reflect.parse("async () => 1");
    Reflect.parse("async a => 1");
    Reflect.parse("async (a) => 1");
    Reflect.parse("async async => 1");
    Reflect.parse("async (async) => 1");
    Reflect.parse("async ([a]) => 1");
    Reflect.parse("async ([a, b]) => 1");
    Reflect.parse("async ({a}) => 1");
    Reflect.parse("async ({a, b}) => 1");

    assertThrowsInstanceOf(() => Reflect.parse("async await => 1"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async (await) => 1"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async ([await]) => 1"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async ({await}) => 1"), SyntaxError);

    assertThrowsInstanceOf(() => Reflect.parse("async (a=await) => 1"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async ([a=await]) => 1"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async ({a=await}) => 1"), SyntaxError);

    assertThrowsInstanceOf(() => Reflect.parse("async (a=await 1) => 1"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async ([a=await 1]) => 1"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async ({a=await 1}) => 1"), SyntaxError);

    assertThrowsInstanceOf(() => Reflect.parse("async [a] => 1"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async [a, b] => 1"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async {a} => 1"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async {a: b} => 1"), SyntaxError);

    // Expression body.
    Reflect.parse("async a => a == b");

    // Expression body with nested async function.
    Reflect.parse("async a => async");
    Reflect.parse("async a => async b => c");
    Reflect.parse("async a => async function() {}");
    Reflect.parse("async a => async function b() {}");

    assertThrowsInstanceOf(() => Reflect.parse("async a => async b"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async a => async function"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async a => async function()"), SyntaxError);

    // Expression body with `await`.
    Reflect.parse("async a => await 1");
    Reflect.parse("async a => await await 1");
    Reflect.parse("async a => await await await 1");

    assertThrowsInstanceOf(() => Reflect.parse("async a => await"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("async a => await await"), SyntaxError);

    // `await` is Unary Expression and it cannot have `async` function as an
    // operand.
    assertThrowsInstanceOf(() => Reflect.parse("async a => await async X => Y"), SyntaxError);
    Reflect.parse("async a => await (async X => Y)");
    // But it can have `async` identifier as an operand.
    Reflect.parse("async async => await async");

    // Block body.
    Reflect.parse("async X => {yield}");

    // `yield` handling.
    Reflect.parse("async X => yield");
    Reflect.parse("async yield => X");
    Reflect.parse("async yield => yield");
    Reflect.parse("async X => {yield}");

    Reflect.parse("async X => {yield}");
    Reflect.parse("async yield => {X}");
    Reflect.parse("async yield => {yield}");
    Reflect.parse("function* g() { async X => yield }");

    assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async yield => X"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async (yield) => X"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async X => yield"), SyntaxError);
    assertThrowsInstanceOf(() => Reflect.parse("'use strict'; async X => {yield}"), SyntaxError);

    assertThrows(() => Reflect.parse("function* g() { async yield => X }"));
    assertThrows(() => Reflect.parse("function* g() { async (yield) => X }"));
    assertThrows(() => Reflect.parse("function* g() { async ([yield]) => X }"));
    assertThrows(() => Reflect.parse("function* g() { async ({yield}) => X }"));

    // Not async functions.
    Reflect.parse("async ()");
    Reflect.parse("async (a)");
    Reflect.parse("async (async)");
    Reflect.parse("async ([a])");
    Reflect.parse("async ([a, b])");
    Reflect.parse("async ({a})");
    Reflect.parse("async ({a, b})");

    // Async arrow function is assignment expression.
    Reflect.parse("a ? async () => {1} : b");
    Reflect.parse("a ? b : async () => {1}");
    assertThrowsInstanceOf(() => Reflect.parse("async () => {1} ? a : b"), SyntaxError);
}

if (typeof reportCompare === "function")
    reportCompare(true, true);