Source code
Revision control
Copy as Markdown
Other Tools
function test_syntax(postfixes, check_error, ignore_opts) {
function test_reflect(code, module) {
var options = undefined;
if (module) {
options = {target: "module"};
}
for (var postfix of postfixes) {
var cur_code = code + postfix;
var caught = false;
try {
Reflect.parse(cur_code, options);
} catch (e) {
caught = true;
check_error(e, cur_code, "reflect");
}
assertEq(caught, true);
}
}
function test_eval(code) {
for (var postfix of postfixes) {
var cur_code = code + postfix;
var caught = false;
try {
eval(cur_code);
} catch (e) {
caught = true;
check_error(e, cur_code, "eval");
}
assertEq(caught, true);
}
}
function test(code, opts={}) {
if (ignore_opts) {
opts = {};
}
let no_strict = "no_strict" in opts && opts.no_strict;
let no_fun = "no_fun" in opts && opts.no_fun;
let no_eval = "no_eval" in opts && opts.no_eval;
let module = "module" in opts && opts.module;
test_reflect(code, module);
if (!no_strict) {
test_reflect("'use strict'; " + code, module);
}
if (!no_fun) {
test_reflect("(function() { " + code, module);
if (!no_strict) {
test_reflect("(function() { 'use strict'; " + code, module);
}
}
if (!no_eval) {
test_eval(code);
if (!no_strict) {
test_eval("'use strict'; " + code);
}
if (!no_fun) {
test_eval("(function() { " + code);
if (!no_strict) {
test_eval("(function() { 'use strict'; " + code);
}
}
}
}
function test_fun_arg(arg) {
for (var postfix of postfixes) {
var cur_arg = arg + postfix;
var caught = false;
try {
new Function(cur_arg, "");
} catch (e) {
caught = true;
check_error(e, cur_arg, "fun_arg");
}
assertEq(caught, true);
}
}
// ==== Statements and declarations ====
// ---- Control flow ----
// Block
test("{ ");
test("{ } ");
test("{ 1 ");
test("{ 1; ");
test("{ 1; } ");
// break
test("a: for (;;) { break ");
test("a: for (;;) { break; ");
test("a: for (;;) { break a ");
test("a: for (;;) { break a; ");
test("a: for (;;) { break\n");
// continue
test("a: for (;;) { continue ");
test("a: for (;;) { continue; ");
test("a: for (;;) { continue a ");
test("a: for (;;) { continue a; ");
test("a: for (;;) { continue\n");
// Empty
test("");
test("; ");
// if...else
test("if ");
test("if (");
test("if (x ");
test("if (x) ");
test("if (x) { ");
test("if (x) {} ");
test("if (x) {} else ");
test("if (x) {} else { ");
test("if (x) {} else {} ");
test("if (x) x ");
test("if (x) x; ");
test("if (x) x; else ");
test("if (x) x; else y ");
test("if (x) x; else y; ");
// switch
test("switch ");
test("switch (");
test("switch (x ");
test("switch (x) ");
test("switch (x) { ");
test("switch (x) { case ");
test("switch (x) { case 1 ");
test("switch (x) { case 1: ");
test("switch (x) { case 1: case ");
test("switch (x) { case 1: case 2 ");
test("switch (x) { case 1: case 2: ");
test("switch (x) { case 1: case 2: x ");
test("switch (x) { case 1: case 2: x; ");
test("switch (x) { case 1: case 2: x; break ");
test("switch (x) { case 1: case 2: x; break; ");
test("switch (x) { case 1: case 2: x; break; case ");
test("switch (x) { case 1: case 2: x; break; case 3 ");
test("switch (x) { case 1: case 2: x; break; case 3: y ");
test("switch (x) { case 1: case 2: x; break; case 3: y; ");
test("switch (x) { case 1: case 2: x; break; case 3: y; default ");
test("switch (x) { case 1: case 2: x; break; case 3: y; default: ");
test("switch (x) { case 1: case 2: x; break; case 3: y; default: z ");
test("switch (x) { case 1: case 2: x; break; case 3: y; default: z; ");
test("switch (x) { case 1: case 2: x; break; case 3: y; default: z; } ");
// throw
test("throw ");
test("throw x ");
test("throw x; ");
// try...catch
test("try ");
test("try { ");
test("try {} ");
test("try {} catch ");
test("try {} catch ( ");
test("try {} catch (e ");
test("try {} catch (e) ");
test("try {} catch (e) { ");
test("try {} catch (e) {} ");
test("try {} catch (e) {} finally ");
test("try {} catch (e) {} finally { ");
test("try {} catch (e) {} finally {} ");
// ---- Declarations ----
// var
test("var ");
test("var x ");
test("var x = ");
test("var x = 1 ");
test("var x = 1 + ");
test("var x = 1 + 2 ");
test("var x = 1 + 2, ");
test("var x = 1 + 2, y ");
test("var x = 1 + 2, y, ");
test("var x = 1 + 2, y, z ");
test("var x = 1 + 2, y, z; ");
test("var [ ");
test("var [ x ");
test("var [ x, ");
test("var [ x, ... ");
test("var { ");
test("var { x ");
test("var { x: ");
test("var { x: y ");
test("var { x: y, ");
test("var { x: y } ");
test("var { x: y } = ");
// let
test("let ");
test("let x ");
test("let x = ");
test("let x = 1 ");
test("let x = 1 + ");
test("let x = 1 + 2 ");
test("let x = 1 + 2, ");
test("let x = 1 + 2, y ");
test("let x = 1 + 2, y, ");
test("let x = 1 + 2, y, z ");
test("let x = 1 + 2, y, z; ");
test("let [ ");
test("let [ x ");
test("let [ x, ");
test("let [ x, ... ");
test("let { ");
test("let { x ");
test("let { x: ");
test("let { x: y ");
test("let { x: y, ");
test("let { x: y } ");
test("let { x: y } = ");
// const
test("const ");
test("const x ");
test("const x = ");
test("const x = 1 ");
test("const x = 1 + ");
test("const x = 1 + 2 ");
test("const x = 1 + 2, ");
test("const x = 1 + 2, y = 0");
test("const x = 1 + 2, y = 0, ");
test("const x = 1 + 2, y = 0, z = 0 ");
test("const x = 1 + 2, y = 0, z = 0; ");
test("const [ ");
test("const [ x ");
test("const [ x, ");
test("const [ x, ... ");
test("const { ");
test("const { x ");
test("const { x: ");
test("const { x: y ");
test("const { x: y, ");
test("const { x: y } ");
test("const { x: y } = ");
// ---- Functions ----
// function
test("function ");
test("function f ");
test("function f( ");
test("function f(x ");
test("function f(x, ");
test("function f(x, [ ");
test("function f(x, [y ");
test("function f(x, [y, ");
test("function f(x, [y, { ");
test("function f(x, [y, {z ");
test("function f(x, [y, {z: ");
test("function f(x, [y, {z: zz ");
test("function f(x, [y, {z: zz, ");
test("function f(x, [y, {z: zz, w ");
test("function f(x, [y, {z: zz, w} ");
test("function f(x, [y, {z: zz, w}] ");
test("function f(x, [y, {z: zz, w}], ");
test("function f(x, [y, {z: zz, w}], v ");
test("function f(x, [y, {z: zz, w}], v= ");
test("function f(x, [y, {z: zz, w}], v=1 ");
test("function f(x, [y, {z: zz, w}], v=1, ");
test("function f(x, [y, {z: zz, w}], v=1, ... ");
test("function f(x, [y, {z: zz, w}], v=1, ...t ");
test("function f(x, [y, {z: zz, w}], v=1, ...t) ");
test("function f(x, [y, {z: zz, w}], v=1, ...t) {");
test("function f(x, [y, {z: zz, w}], v=1, ...t) { x ");
test("function f(x, [y, {z: zz, w}], v=1, ...t) { x; ");
test("function f(x, [y, {z: zz, w}], v=1, ...t) { x; } ");
// star function
test("function* ");
test("function* f ");
test("function* f( ");
test("function* f(x ");
test("function* f(x, ");
test("function* f(x, ... ");
test("function* f(x, ...t ");
test("function* f(x, ...t) ");
test("function* f(x, ...t) {");
test("function* f(x, ...t) { x ");
test("function* f(x, ...t) { x; ");
test("function* f(x, ...t) { x; } ");
// return
test("function f() { return ");
test("function f() { return 1 ");
test("function f() { return 1; ");
test("function f() { return 1; } ");
test("function f() { return; ");
test("function f() { return\n");
// yield
test("function* f() { yield ");
test("function* f() { yield 1 ");
test("function* f() { yield* ");
test("function* f() { yield* 1 ");
test("function* f() { yield\n");
test("function* f() { yield*\n");
// ---- Iterations ----
// do...while
test("do ");
test("do {");
test("do {} ");
test("do {} while ");
test("do {} while ( ");
test("do {} while (x ");
test("do {} while (x) ");
test("do {} while (x); ");
test("do x ");
test("do x; ");
test("do x; while ");
// for
test("for ");
test("for (");
test("for (x ");
test("for (x; ");
test("for (x; y ");
test("for (x; y; ");
test("for (x; y; z ");
test("for (x; y; z) ");
test("for (x; y; z) { ");
test("for (x; y; z) {} ");
test("for (x; y; z) x ");
test("for (x; y; z) x; ");
test("for (var ");
test("for (var x ");
test("for (var x = ");
test("for (var x = y ");
test("for (var x = y; ");
test("for (let ");
test("for (let x ");
test("for (let x = ");
test("for (let x = y ");
test("for (let x = y; ");
// for...in
test("for (x in ");
test("for (x in y ");
test("for (x in y) ");
test("for (var x in ");
test("for (var x in y ");
test("for (var x in y) ");
test("for (let x in ");
test("for (let x in y ");
test("for (let x in y) ");
// for...of
test("for (x of ");
test("for (x of y ");
test("for (x of y) ");
test("for (var x of ");
test("for (var x of y ");
test("for (var x of y) ");
test("for (let x of ");
test("for (let x of y ");
test("for (let x of y) ");
// while
test("while ");
test("while (");
test("while (x ");
test("while (x) ");
test("while (x) { ");
test("while (x) {} ");
test("while (x) x ");
test("while (x) x; ");
// ---- Others ----
// debugger
test("debugger ");
test("debugger; ");
// export
var opts = { no_fun: true, no_eval: true, module: true };
test("export ", opts);
test("export { ", opts);
test("export { x ", opts);
test("export { x, ", opts);
test("export { x, y ", opts);
test("export { x, y as ", opts);
test("export { x, y as z ", opts);
test("export { x, y as z } ", opts);
test("export { x, y as z } from ", opts);
test("export { x, y as z } from 'a' ", opts);
test("export { x, y as z } from 'a'; ", opts);
test("export * ", opts);
test("export * from ", opts);
test("export * from 'a' ", opts);
test("export * from 'a'; ", opts);
test("export * ", opts);
test("export * as ", opts);
test("export * as ns ", opts);
test("export * as ns from ", opts);
test("export * as ns from 'a' ", opts);
test("export * as ns from 'a'; ", opts);
test("export function ", opts);
test("export function f ", opts);
test("export function f( ", opts);
test("export function f() ", opts);
test("export function f() { ", opts);
test("export function f() {} ", opts);
test("export function f() {}; ", opts);
test("export var ", opts);
test("export var a ", opts);
test("export var a = ", opts);
test("export var a = 1 ", opts);
test("export var a = 1, ", opts);
test("export var a = 1, b ", opts);
test("export var a = 1, b = ", opts);
test("export var a = 1, b = 2 ", opts);
test("export var a = 1, b = 2; ", opts);
test("export let ", opts);
test("export let a ", opts);
test("export let a = ", opts);
test("export let a = 1 ", opts);
test("export let a = 1, ", opts);
test("export let a = 1, b ", opts);
test("export let a = 1, b = ", opts);
test("export let a = 1, b = 2 ", opts);
test("export let a = 1, b = 2; ", opts);
test("export const ", opts);
test("export const a ", opts);
test("export const a = ", opts);
test("export const a = 1 ", opts);
test("export const a = 1, ", opts);
test("export const a = 1, b ", opts);
test("export const a = 1, b = ", opts);
test("export const a = 1, b = 2 ", opts);
test("export const a = 1, b = 2; ", opts);
test("export class ", opts);
test("export class Foo ", opts);
test("export class Foo { ", opts);
test("export class Foo { constructor ", opts);
test("export class Foo { constructor( ", opts);
test("export class Foo { constructor() ", opts);
test("export class Foo { constructor() { ", opts);
test("export class Foo { constructor() {} ", opts);
test("export class Foo { constructor() {} } ", opts);
test("export class Foo { constructor() {} }; ", opts);
test("export default ", opts);
test("export default 1 ", opts);
test("export default 1; ", opts);
test("export default function ", opts);
test("export default function() ", opts);
test("export default function() { ", opts);
test("export default function() {} ", opts);
test("export default function() {}; ", opts);
test("export default function foo ", opts);
test("export default function foo( ", opts);
test("export default function foo() ", opts);
test("export default function foo() { ", opts);
test("export default function foo() {} ", opts);
test("export default function foo() {}; ", opts);
test("export default class ", opts);
test("export default class { ", opts);
test("export default class { constructor ", opts);
test("export default class { constructor( ", opts);
test("export default class { constructor() ", opts);
test("export default class { constructor() { ", opts);
test("export default class { constructor() {} ", opts);
test("export default class { constructor() {} } ", opts);
test("export default class { constructor() {} }; ", opts);
test("export default class Foo ", opts);
test("export default class Foo { ", opts);
test("export default class Foo { constructor ", opts);
test("export default class Foo { constructor( ", opts);
test("export default class Foo { constructor() ", opts);
test("export default class Foo { constructor() { ", opts);
test("export default class Foo { constructor() {} ", opts);
test("export default class Foo { constructor() {} } ", opts);
test("export default class Foo { constructor() {} }; ", opts);
// import
test("import ", opts);
test("import x ", opts);
test("import x from ", opts);
test("import x from 'a' ", opts);
test("import x from 'a'; ", opts);
test("import { ", opts);
test("import { x ", opts);
test("import { x, ", opts);
test("import { x, y ", opts);
test("import { x, y } ", opts);
test("import { x, y } from ", opts);
test("import { x, y } from 'a' ", opts);
test("import { x, y } from 'a'; ", opts);
test("import { x as ", opts);
test("import { x as y ", opts);
test("import { x as y } ", opts);
test("import { x as y } from ", opts);
test("import { x as y } from 'a' ", opts);
test("import { x as y } from 'a'; ", opts);
test("import 'a' ", opts);
test("import 'a'; ", opts);
test("import * ", opts);
test("import * as ", opts);
test("import * as a ", opts);
test("import * as a from ", opts);
test("import * as a from 'a' ", opts);
test("import * as a from 'a'; ", opts);
test("import a ", opts);
test("import a, ", opts);
test("import a, * ", opts);
test("import a, * as ", opts);
test("import a, * as b ", opts);
test("import a, * as b from ", opts);
test("import a, * as b from 'c' ", opts);
test("import a, * as b from 'c'; ", opts);
test("import a, { ", opts);
test("import a, { b ", opts);
test("import a, { b } ", opts);
test("import a, { b } from ", opts);
test("import a, { b } from 'c' ", opts);
test("import a, { b } from 'c'; ", opts);
// label
test("a ");
test("a: ");
// with
opts = { no_strict: true };
test("with ", opts);
test("with (", opts);
test("with (x ", opts);
test("with (x) ", opts);
test("with (x) { ", opts);
test("with (x) {} ", opts);
test("with (x) x ", opts);
test("with (x) x; ", opts);
// ==== Expressions and operators ====
// ---- Primary expressions ----
// this
test("this ");
// function
test("(function ");
test("(function ( ");
test("(function (x ");
test("(function (x, ");
test("(function (x, ... ");
test("(function (x, ...t ");
test("(function (x, ...t) ");
test("(function (x, ...t) {");
test("(function (x, ...t) { x ");
test("(function (x, ...t) { x; ");
test("(function (x, ...t) { x; } ");
test("(function (x, ...t) { x; }) ");
// star function
test("(function* ");
test("(function* ( ");
test("(function* (x ");
test("(function* (x, ");
test("(function* (x, ... ");
test("(function* (x, ...t ");
test("(function* (x, ...t) ");
test("(function* (x, ...t) {");
test("(function* (x, ...t) { x ");
test("(function* (x, ...t) { x; ");
test("(function* (x, ...t) { x; } ");
test("(function* (x, ...t) { x; }) ");
// Array literal
test("[ ");
test("[] ");
test("[1 ");
test("[1, ");
test("[1, ... ");
test("[1, ...x ");
test("[1, ...x] ");
// object
test("({ ");
test("({ x ");
test("({ x: ");
test("({ x: 1 ");
test("({ x: 1, ");
test("({ x: 1, y ");
test("({ x: 1, y: ");
test("({ x: 1, y: 2 ");
test("({ x: 1, y: 2, ");
test("({ x: 1, y: 2, z ");
test("({ x: 1, y: 2, z, ");
test("({ x: 1, y: 2, z, w ");
test("({ x: 1, y: 2, z, w } ");
test("({ x: 1, y: 2, z, w }) ");
// object: computed property
test("({ [");
test("({ [k ");
test("({ [k] ");
test("({ [k]: ");
test("({ [k]: 1 ");
test("({ [k]: 1, ");
// object: getter
test("({ get ");
test("({ get p ");
test("({ get p( ");
test("({ get p() ");
test("({ get p() { ");
test("({ get p() {} ");
test("({ get p() {}, ");
test("({ get p() {}, } ");
test("({ get [ ");
test("({ get [p ");
test("({ get [p] ");
test("({ get [p]( ");
test("({ get [p]() ");
// object: setter
test("({ set ");
test("({ set p ");
test("({ set p( ");
test("({ set p(v ");
test("({ set p(v) ");
test("({ set p(v) { ");
test("({ set p(v) {} ");
test("({ set [ ");
test("({ set [p ");
test("({ set [p] ");
test("({ set [p]( ");
test("({ set [p](v ");
test("({ set [p](v) ");
// object: method
test("({ m ");
test("({ m( ");
test("({ m() ");
test("({ m() { ");
test("({ m() {} ");
test("({ m() {}, ");
test("({ [ ");
test("({ [m ");
test("({ [m] ");
test("({ [m]( ");
test("({ [m]() ");
test("({ [m]() { ");
test("({ [m]() {} ");
test("({ [m]() {}, ");
test("({ * ");
test("({ *m ");
test("({ *m( ");
test("({ *m() ");
test("({ *m() { ");
test("({ *m() {} ");
test("({ *m() {}, ");
test("({ *[ ");
test("({ *[m ");
test("({ *[m] ");
test("({ *[m]( ");
test("({ *[m]() ");
test("({ *[m]() { ");
test("({ *[m]() {} ");
test("({ *[m]() {}, ");
test("({ * get ");
test("({ * get ( ");
test("({ * get () ");
test("({ * get () { ");
test("({ * get () {} ");
test("({ * get () {}, ");
test("({ * set ");
test("({ * set ( ");
test("({ * set () ");
test("({ * set () { ");
test("({ * set () {} ");
test("({ * set () {}, ");
// Regular expression literal
test("/a/ ");
test("/a/g ");
// ---- Left-hand-side expressions ----
// property access
test("a[ ");
test("a[1 ");
test("a[1] ");
test("a. ");
test("a.b ");
test("a.b; ");
// new
test("new ");
test("new f ");
test("new f( ");
test("new f() ");
test("new f(); ");
// ---- Increment and decrement ----
test("a ++ ");
test("a ++; ");
test("-- ");
test("-- a ");
test("-- a; ");
// ---- Unary operators ----
// delete
test("delete ");
test("delete a ");
test("delete a[ ");
test("delete a[b ");
test("delete a[b] ");
test("delete a[b]; ");
test("delete ( ");
test("delete (a ");
test("delete (a[ ");
test("delete (a[b ");
test("delete (a[b] ");
test("delete (a[b]) ");
test("delete (a[b]); ");
// void
test("void ");
test("void a ");
test("void a; ");
test("void (");
test("void (a ");
test("void (a) ");
test("void (a); ");
// typeof
test("typeof ");
test("typeof a ");
test("typeof a; ");
test("typeof (");
test("typeof (a ");
test("typeof (a) ");
test("typeof (a); ");
// -
test("- ");
test("- 1 ");
test("- 1; ");
// +
test("+ ");
test("+ 1 ");
test("+ 1; ");
// ---- Arithmetic operators ----
// +
test("1 + ");
test("1 + 1 ");
test("1 + 1; ");
// ---- Relational operators ----
// in
test("a in ");
test("a in b ");
test("a in b; ");
// instanceof
test("a instanceof ");
test("a instanceof b ");
test("a instanceof b; ");
// ---- Equality operators ----
// ==
test("1 == ");
test("1 == 1 ");
test("1 == 1; ");
// ---- Bitwise shift operators ----
// <<
test("1 << ");
test("1 << 1 ");
test("1 << 1; ");
// ---- Binary bitwise operators ----
// &
test("1 & ");
test("1 & 1 ");
test("1 & 1; ");
// ---- Binary logical operators ----
// ||
test("1 || ");
test("1 || 1 ");
test("1 || 1; ");
// ---- Conditional (ternary) operator ----
test("1 ? ");
test("1 ? 2 ");
test("1 ? 2 : ");
test("1 ? 2 : 3 ");
test("1 ? 2 : 3; ");
// ---- Assignment operators ----
test("x = ");
test("x = 1 ");
test("x = 1 + ");
test("x = 1 + 2 ");
test("x = 1 + 2; ");
// ---- Comma operator ----
test("1, ");
test("1, 2 ");
test("1, 2; ");
// ---- Functions ----
// Arrow functions
test("a => ");
test("a => 1 ");
test("a => 1; ");
test("a => { ");
test("a => {} ");
test("a => {}; ");
test("( ");
test("() ");
test("() => ");
test("(...");
test("(...a ");
test("(...a) ");
test("(...a) => ");
test("([ ");
test("([a ");
test("([a] ");
test("([a]) ");
test("([a]) => ");
test("({ ");
test("({a ");
test("({a} ");
test("({a}) ");
test("({a}) => ");
test("({a: ");
test("({a: b ");
test("({a: b, ");
test("({a: b} ");
test("({a: b}) ");
test("({a: b}) => ");
// ---- Class declaration ----
test("class ");
test("class a ");
test("class a { ");
test("class a { constructor ");
test("class a { constructor( ");
test("class a { constructor() ");
test("class a { constructor() { ");
test("class a { constructor() { } ");
test("class a { constructor() { } } ");
test("class a { constructor() { } static ");
test("class a { constructor() { } static m ");
test("class a { constructor() { } static m( ");
test("class a { constructor() { } static m() ");
test("class a { constructor() { } static m() { ");
test("class a { constructor() { } static m() {} ");
test("class a { constructor() { } static m() {} } ");
test("class a { constructor() { } static ( ");
test("class a { constructor() { } static () ");
test("class a { constructor() { } static () { ");
test("class a { constructor() { } static () {} ");
test("class a { constructor() { } static () {} } ");
test("class a { constructor() { } static get ");
test("class a { constructor() { } static get p ");
test("class a { constructor() { } static get p( ");
test("class a { constructor() { } static get p() ");
test("class a { constructor() { } static get p() { ");
test("class a { constructor() { } static get p() {} ");
test("class a { constructor() { } static get p() {} } ");
test("class a { constructor() { } static set ");
test("class a { constructor() { } static set p ");
test("class a { constructor() { } static set p( ");
test("class a { constructor() { } static set p(v ");
test("class a { constructor() { } static set p(v) ");
test("class a { constructor() { } static set p(v) { ");
test("class a { constructor() { } static set p(v) {} ");
test("class a { constructor() { } static set p(v) {} } ");
test("class a { constructor() { } * ");
test("class a { constructor() { } *m ");
test("class a { constructor() { } *m( ");
test("class a { constructor() { } *m() ");
test("class a { constructor() { } *m() { ");
test("class a { constructor() { } *m() {} ");
test("class a { constructor() { } *m() {} } ");
test("class a { constructor() { } static * ");
test("class a { constructor() { } static *m ");
test("class a { constructor() { } static *m( ");
test("class a { constructor() { } static *m() ");
test("class a { constructor() { } static *m() { ");
test("class a { constructor() { } static *m() {} ");
test("class a { constructor() { } static *m() {} } ");
test("class a extends ");
test("class a extends b ");
test("class a extends b { ");
test("class a extends ( ");
test("class a extends ( b ");
test("class a extends ( b ) ");
test("class a extends ( b ) { ");
// ---- Class expression ----
test("( class ");
test("( class a ");
test("( class a { ");
test("( class a { constructor ");
test("( class a { constructor( ");
test("( class a { constructor() ");
test("( class a { constructor() { ");
test("( class a { constructor() { } ");
test("( class a { constructor() { } } ");
test("( class a { constructor() { } } ) ");
test("(class a extends ");
test("(class a extends b ");
test("(class a extends b { ");
test("(class a extends ( ");
test("(class a extends ( b ");
test("(class a extends ( b ) ");
test("(class a extends ( b ) { ");
test("( class { ");
test("( class { constructor ");
test("( class { constructor( ");
test("( class { constructor() ");
test("( class { constructor() { ");
test("( class { constructor() { } ");
test("( class { constructor() { } } ");
test("( class { constructor() { } } ) ");
test("(class extends ");
test("(class extends b ");
test("(class extends b { ");
test("(class extends ( ");
test("(class extends ( b ");
test("(class extends ( b ) ");
test("(class extends ( b ) { ");
// ---- Other ----
// Literals
test("a ");
test("1 ");
test("1. ");
test("1.2 ");
test("true ");
test("false ");
test("\"a\" ");
test("'a' ");
test("null ");
// Template strings
test("`${ ");
test("`${a ");
test("`${a}` ");
// Function calls
test("f( ");
test("f() ");
test("f(); ");
test("f(... ");
test("f(...x ");
test("f(...x) ");
// Function constructors
test_fun_arg("");
test_fun_arg("a ");
test_fun_arg("... ");
test_fun_arg("...a ");
// ==== Legacy ====
// ==== asm.js ====
test("(function() { 'use asm'; ");
test("(function() { 'use asm'; var ");
test("(function() { 'use asm'; var a ");
test("(function() { 'use asm'; var a = ");
test("(function() { 'use asm'; var a = 1 ");
test("(function() { 'use asm'; var a = 1; ");
test("(function() { 'use asm'; var a = 1; function ");
test("(function() { 'use asm'; var a = 1; function f ");
test("(function() { 'use asm'; var a = 1; function f( ");
test("(function() { 'use asm'; var a = 1; function f() ");
test("(function() { 'use asm'; var a = 1; function f() { ");
test("(function() { 'use asm'; var a = 1; function f() { } ");
test("(function() { 'use asm'; var a = 1; function f() { } var ");
test("(function() { 'use asm'; var a = 1; function f() { } var tbl ");
test("(function() { 'use asm'; var a = 1; function f() { } var tbl = ");
test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [ ");
test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [f ");
test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [f] ");
test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [f]; ");
test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [f]; return ");
test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [f]; return f ");
test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [f]; return f; ");
test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [f]; return f; } ");
test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [f]; return f; }) ");
test("(function() { 'use asm'; var a = 1; function f() { } var tbl = [f]; return f; }); ");
// ==== async/await ====
// async/await function decralation
test("async ");
test("async function ");
test("async function A ");
test("async function A( ");
test("async function A() ");
test("async function A(a ");
test("async function A(a) ");
test("async function A(a) { ");
test("async function A(a) {} ");
test("async function A(a) { await ");
test("async function A(a) { await X ");
test("async function A(a) { await X; ");
test("async function A(a) { await X; } ");
test("async function A(a) { await await ");
test("async function A(a) { await await await ");
test("async function A(a) { await await await X ");
test("async function A(a) { await await await X; ");
test("async function A(a) { await await await X; } ");
opts = { no_fun: true, no_eval: true, module: true };
test("export default async ", opts);
test("export default async function ", opts);
test("export default async function ( ", opts);
test("export default async function () ", opts);
test("export default async function (a ", opts);
test("export default async function (a) ", opts);
test("export default async function (a) { ", opts);
test("export default async function (a) {} ", opts);
test("export default async function (a) { await ", opts);
test("export default async function (a) { await X ", opts);
test("export default async function (a) { await X; ", opts);
test("export default async function (a) { await X; } ", opts);
// async/await function expression
test("(async ");
test("(async function ");
test("(async function A ");
test("(async function A( ");
test("(async function A() ");
test("(async function A(a ");
test("(async function A(a) ");
test("(async function A(a) { ");
test("(async function A(a) {} ");
test("(async function A(a) { await ");
test("(async function A(a) { await X ");
test("(async function A(a) { await X; ");
test("(async function A(a) { await X; } ");
test("(async function A(a) { await X; }) ");
test("(async function ( ");
test("(async function () ");
test("(async function (a ");
test("(async function (a) ");
test("(async function (a) { ");
test("(async function (a) {} ");
test("(async function (a) { await ");
test("(async function (a) { await X ");
test("(async function (a) { await X; ");
test("(async function (a) { await X; } ");
test("(async function (a) { await X; }) ");
// async/await method
test("({ async ");
test("({ async m ");
test("({ async m( ");
test("({ async m() ");
test("({ async m() { ");
test("({ async m() {} ");
test("({ async m() {}, ");
test("class X { async ");
test("class X { async m ");
test("class X { async m( ");
test("class X { async m() ");
test("class X { async m() { ");
test("class X { async m() {} ");
test("class X { static async ");
test("class X { static async m ");
test("class X { static async m( ");
test("class X { static async m() ");
test("class X { static async m() { ");
test("class X { static async m() {} ");
// async/await arrow
test("(async a ");
test("(async a => ");
test("(async a => b ");
test("(async a => b) ");
test("(async a => { ");
test("(async a => { b ");
test("(async a => { b } ");
test("(async a => { b }) ");
test("(async ( ");
test("(async (a ");
test("(async (a) ");
test("(async (a) => ");
test("(async (a) => b ");
test("(async (a) => b) ");
test("(async (a, ");
test("(async (a, b ");
test("(async (a, b) ");
test("(async (a, b) => ");
test("(async (a, b) => b ");
test("(async (a, b) => b) ");
test("(async ([ ");
test("(async ([a ");
test("(async ([a] ");
test("(async ([a]) ");
test("(async ([a]) => ");
test("(async ([a]) => b ");
test("(async ([a]) => b) ");
test("(async ([a, ");
test("(async ([a, b ");
test("(async ([a, b] ");
test("(async ([a, b]) ");
test("(async ([a, b]) => ");
test("(async ([a, b]) => b ");
test("(async ([a, b]) => b) ");
test("(async ({ ");
test("(async ({a ");
test("(async ({a} ");
test("(async ({a}) ");
test("(async ({a}) => ");
test("(async ({a}) => b ");
test("(async ({a}) => b) ");
test("(async ({a, ");
test("(async ({a, b ");
test("(async ({a, b} ");
test("(async ({a, b}) ");
test("(async ({a, b}) => ");
test("(async ({a, b}) => b ");
test("(async ({a, b}) => b) ");
}