Parse for await (async of ...) (#13244)

This commit is contained in:
Stuart Cook
2021-05-02 02:00:21 +10:00
committed by GitHub
parent 2a3e35f026
commit fa01fbe052
31 changed files with 554 additions and 11 deletions

View File

@@ -1,4 +1,3 @@
{
"sourceType": "module",
"throws": "Unexpected token, expected \"=>\" (1:31)"
}
"sourceType": "module"
}

View File

@@ -0,0 +1,46 @@
{
"type": "File",
"start":0,"end":36,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":36}},
"errors": [
"SyntaxError: Missing semicolon. (1:20)",
"SyntaxError: Missing semicolon. (1:33)"
],
"program": {
"type": "Program",
"start":0,"end":36,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":36}},
"sourceType": "module",
"interpreter": null,
"body": [
{
"type": "ExportDefaultDeclaration",
"start":0,"end":20,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":20}},
"declaration": {
"type": "Identifier",
"start":15,"end":20,"loc":{"start":{"line":1,"column":15},"end":{"line":1,"column":20},"identifierName":"async"},
"name": "async"
}
},
{
"type": "ExpressionStatement",
"start":21,"end":33,"loc":{"start":{"line":1,"column":21},"end":{"line":1,"column":33}},
"expression": {
"type": "CallExpression",
"start":21,"end":33,"loc":{"start":{"line":1,"column":21},"end":{"line":1,"column":33}},
"callee": {
"type": "Identifier",
"start":21,"end":30,"loc":{"start":{"line":1,"column":21},"end":{"line":1,"column":30},"identifierName":"functionX"},
"name": "functionX"
},
"arguments": []
}
},
{
"type": "BlockStatement",
"start":34,"end":36,"loc":{"start":{"line":1,"column":34},"end":{"line":1,"column":36}},
"body": [],
"directives": []
}
],
"directives": []
}
}

View File

@@ -0,0 +1,3 @@
async function f() {
for await (async of => {};;);
}

View File

@@ -0,0 +1,3 @@
{
"throws": "Unexpected token (2:6)"
}

View File

@@ -0,0 +1,3 @@
async function f() {
for await (async of => {} of x);
}

View File

@@ -0,0 +1,69 @@
{
"type": "File",
"start":0,"end":57,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [
"SyntaxError: Invalid left-hand side in for-of statement. (2:13)"
],
"program": {
"type": "Program",
"start":0,"end":57,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "FunctionDeclaration",
"start":0,"end":57,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"id": {
"type": "Identifier",
"start":15,"end":16,"loc":{"start":{"line":1,"column":15},"end":{"line":1,"column":16},"identifierName":"f"},
"name": "f"
},
"generator": false,
"async": true,
"params": [],
"body": {
"type": "BlockStatement",
"start":19,"end":57,"loc":{"start":{"line":1,"column":19},"end":{"line":3,"column":1}},
"body": [
{
"type": "ForOfStatement",
"start":23,"end":55,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":34}},
"await": true,
"left": {
"type": "ArrowFunctionExpression",
"start":34,"end":48,"loc":{"start":{"line":2,"column":13},"end":{"line":2,"column":27}},
"id": null,
"generator": false,
"async": true,
"params": [
{
"type": "Identifier",
"start":40,"end":42,"loc":{"start":{"line":2,"column":19},"end":{"line":2,"column":21},"identifierName":"of"},
"name": "of"
}
],
"body": {
"type": "BlockStatement",
"start":46,"end":48,"loc":{"start":{"line":2,"column":25},"end":{"line":2,"column":27}},
"body": [],
"directives": []
}
},
"right": {
"type": "Identifier",
"start":52,"end":53,"loc":{"start":{"line":2,"column":31},"end":{"line":2,"column":32},"identifierName":"x"},
"name": "x"
},
"body": {
"type": "EmptyStatement",
"start":54,"end":55,"loc":{"start":{"line":2,"column":33},"end":{"line":2,"column":34}}
}
}
],
"directives": []
}
}
],
"directives": []
}
}

View File

@@ -0,0 +1,3 @@
async function f() {
for await (async of x);
}

View File

@@ -0,0 +1,51 @@
{
"type": "File",
"start":0,"end":48,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"program": {
"type": "Program",
"start":0,"end":48,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "FunctionDeclaration",
"start":0,"end":48,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"id": {
"type": "Identifier",
"start":15,"end":16,"loc":{"start":{"line":1,"column":15},"end":{"line":1,"column":16},"identifierName":"f"},
"name": "f"
},
"generator": false,
"async": true,
"params": [],
"body": {
"type": "BlockStatement",
"start":19,"end":48,"loc":{"start":{"line":1,"column":19},"end":{"line":3,"column":1}},
"body": [
{
"type": "ForOfStatement",
"start":23,"end":46,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":25}},
"await": true,
"left": {
"type": "Identifier",
"start":34,"end":39,"loc":{"start":{"line":2,"column":13},"end":{"line":2,"column":18},"identifierName":"async"},
"name": "async"
},
"right": {
"type": "Identifier",
"start":43,"end":44,"loc":{"start":{"line":2,"column":22},"end":{"line":2,"column":23},"identifierName":"x"},
"name": "x"
},
"body": {
"type": "EmptyStatement",
"start":45,"end":46,"loc":{"start":{"line":2,"column":24},"end":{"line":2,"column":25}}
}
}
],
"directives": []
}
}
],
"directives": []
}
}

View File

@@ -0,0 +1 @@
for (async.x of y);

View File

@@ -0,0 +1,42 @@
{
"type": "File",
"start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}},
"program": {
"type": "Program",
"start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "ForOfStatement",
"start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}},
"await": false,
"left": {
"type": "MemberExpression",
"start":5,"end":12,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":12}},
"object": {
"type": "Identifier",
"start":5,"end":10,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":10},"identifierName":"async"},
"name": "async"
},
"computed": false,
"property": {
"type": "Identifier",
"start":11,"end":12,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":12},"identifierName":"x"},
"name": "x"
}
},
"right": {
"type": "Identifier",
"start":16,"end":17,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":17},"identifierName":"y"},
"name": "y"
},
"body": {
"type": "EmptyStatement",
"start":18,"end":19,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":19}}
}
}
],
"directives": []
}
}

View File

@@ -0,0 +1 @@
for (\u0061sync of x);

View File

@@ -0,0 +1,32 @@
{
"type": "File",
"start":0,"end":22,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":22}},
"program": {
"type": "Program",
"start":0,"end":22,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":22}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "ForOfStatement",
"start":0,"end":22,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":22}},
"await": false,
"left": {
"type": "Identifier",
"start":5,"end":15,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":15},"identifierName":"async"},
"name": "async"
},
"right": {
"type": "Identifier",
"start":19,"end":20,"loc":{"start":{"line":1,"column":19},"end":{"line":1,"column":20},"identifierName":"x"},
"name": "x"
},
"body": {
"type": "EmptyStatement",
"start":21,"end":22,"loc":{"start":{"line":1,"column":21},"end":{"line":1,"column":22}}
}
}
],
"directives": []
}
}

View File

@@ -0,0 +1 @@
for (async of => {};;);

View File

@@ -0,0 +1,43 @@
{
"type": "File",
"start":0,"end":23,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":23}},
"program": {
"type": "Program",
"start":0,"end":23,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":23}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "ForStatement",
"start":0,"end":23,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":23}},
"init": {
"type": "ArrowFunctionExpression",
"start":5,"end":19,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":19}},
"id": null,
"generator": false,
"async": true,
"params": [
{
"type": "Identifier",
"start":11,"end":13,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":13},"identifierName":"of"},
"name": "of"
}
],
"body": {
"type": "BlockStatement",
"start":17,"end":19,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":19}},
"body": [],
"directives": []
}
},
"test": null,
"update": null,
"body": {
"type": "EmptyStatement",
"start":22,"end":23,"loc":{"start":{"line":1,"column":22},"end":{"line":1,"column":23}}
}
}
],
"directives": []
}
}

View File

@@ -0,0 +1 @@
for (async of => {} of x);

View File

@@ -0,0 +1,50 @@
{
"type": "File",
"start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}},
"errors": [
"SyntaxError: Invalid left-hand side in for-of statement. (1:5)"
],
"program": {
"type": "Program",
"start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "ForOfStatement",
"start":0,"end":26,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":26}},
"await": false,
"left": {
"type": "ArrowFunctionExpression",
"start":5,"end":19,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":19}},
"id": null,
"generator": false,
"async": true,
"params": [
{
"type": "Identifier",
"start":11,"end":13,"loc":{"start":{"line":1,"column":11},"end":{"line":1,"column":13},"identifierName":"of"},
"name": "of"
}
],
"body": {
"type": "BlockStatement",
"start":17,"end":19,"loc":{"start":{"line":1,"column":17},"end":{"line":1,"column":19}},
"body": [],
"directives": []
}
},
"right": {
"type": "Identifier",
"start":23,"end":24,"loc":{"start":{"line":1,"column":23},"end":{"line":1,"column":24},"identifierName":"x"},
"name": "x"
},
"body": {
"type": "EmptyStatement",
"start":25,"end":26,"loc":{"start":{"line":1,"column":25},"end":{"line":1,"column":26}}
}
}
],
"directives": []
}
}

View File

@@ -0,0 +1,3 @@
// Check what happens when the async-unary-arrow-function parser looks ahead
// and finds "=" instead of "=>".
for (async of = x);

View File

@@ -0,0 +1,3 @@
{
"throws": "Unexpected token, expected \"=>\" (3:14)"
}

View File

@@ -0,0 +1,5 @@
for (async of x);
async () => {
for (async of x);
}

View File

@@ -0,0 +1,74 @@
{
"type": "File",
"start":0,"end":54,"loc":{"start":{"line":1,"column":0},"end":{"line":5,"column":1}},
"errors": [
"SyntaxError: The left-hand side of a for-of loop may not be 'async'. (1:5)",
"SyntaxError: The left-hand side of a for-of loop may not be 'async'. (4:7)"
],
"program": {
"type": "Program",
"start":0,"end":54,"loc":{"start":{"line":1,"column":0},"end":{"line":5,"column":1}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "ForOfStatement",
"start":0,"end":17,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":17}},
"await": false,
"left": {
"type": "Identifier",
"start":5,"end":10,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":10},"identifierName":"async"},
"name": "async"
},
"right": {
"type": "Identifier",
"start":14,"end":15,"loc":{"start":{"line":1,"column":14},"end":{"line":1,"column":15},"identifierName":"x"},
"name": "x"
},
"body": {
"type": "EmptyStatement",
"start":16,"end":17,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":17}}
}
},
{
"type": "ExpressionStatement",
"start":19,"end":54,"loc":{"start":{"line":3,"column":0},"end":{"line":5,"column":1}},
"expression": {
"type": "ArrowFunctionExpression",
"start":19,"end":54,"loc":{"start":{"line":3,"column":0},"end":{"line":5,"column":1}},
"id": null,
"generator": false,
"async": true,
"params": [],
"body": {
"type": "BlockStatement",
"start":31,"end":54,"loc":{"start":{"line":3,"column":12},"end":{"line":5,"column":1}},
"body": [
{
"type": "ForOfStatement",
"start":35,"end":52,"loc":{"start":{"line":4,"column":2},"end":{"line":4,"column":19}},
"await": false,
"left": {
"type": "Identifier",
"start":40,"end":45,"loc":{"start":{"line":4,"column":7},"end":{"line":4,"column":12},"identifierName":"async"},
"name": "async"
},
"right": {
"type": "Identifier",
"start":49,"end":50,"loc":{"start":{"line":4,"column":16},"end":{"line":4,"column":17},"identifierName":"x"},
"name": "x"
},
"body": {
"type": "EmptyStatement",
"start":51,"end":52,"loc":{"start":{"line":4,"column":18},"end":{"line":4,"column":19}}
}
}
],
"directives": []
}
}
}
],
"directives": []
}
}

View File

@@ -0,0 +1 @@
for ((async) of x);

View File

@@ -0,0 +1,36 @@
{
"type": "File",
"start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}},
"program": {
"type": "Program",
"start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "ForOfStatement",
"start":0,"end":19,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":19}},
"await": false,
"left": {
"type": "Identifier",
"start":6,"end":11,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":11},"identifierName":"async"},
"extra": {
"parenthesized": true,
"parenStart": 5
},
"name": "async"
},
"right": {
"type": "Identifier",
"start":16,"end":17,"loc":{"start":{"line":1,"column":16},"end":{"line":1,"column":17},"identifierName":"x"},
"name": "x"
},
"body": {
"type": "EmptyStatement",
"start":18,"end":19,"loc":{"start":{"line":1,"column":18},"end":{"line":1,"column":19}}
}
}
],
"directives": []
}
}

View File

@@ -218,9 +218,21 @@ function runTest(test, parseFunction, compareErrorsOnly = false) {
return save(test, ast);
}
throw new Error(
"Expected error message: " + opts.throws + ". But parsing succeeded.",
);
if (ast.errors?.length) {
throw new Error(
`Expected non-recoverable error message: ${
opts.throws
}. But instead parsing recovered from errors: ${JSON.stringify(
ast.errors,
null,
2,
)}`,
);
} else {
throw new Error(
`Expected error message: ${opts.throws}. But parsing succeeded without errors.`,
);
}
} else if (compareErrorsOnly) {
const mis = misMatch(JSON.parse(test.expect.code).errors, ast.errors);
if (mis) {