Parse for-await statements when asyncGenerators plugin is active
This commit is contained in:
parent
8b150813f5
commit
f81c281fc4
@ -224,9 +224,18 @@ pp.parseDoStatement = function (node) {
|
||||
pp.parseForStatement = function (node) {
|
||||
this.next();
|
||||
this.state.labels.push(loopLabel);
|
||||
|
||||
let forAwait = false;
|
||||
if (this.hasPlugin("asyncGenerators") && this.state.inAsync && this.isContextual("await")) {
|
||||
forAwait = true;
|
||||
this.next();
|
||||
}
|
||||
this.expect(tt.parenL);
|
||||
|
||||
if (this.match(tt.semi)) {
|
||||
if (forAwait) {
|
||||
this.unexpected();
|
||||
}
|
||||
return this.parseFor(node, null);
|
||||
}
|
||||
|
||||
@ -238,10 +247,12 @@ pp.parseForStatement = function (node) {
|
||||
|
||||
if (this.match(tt._in) || this.isContextual("of")) {
|
||||
if (init.declarations.length === 1 && !init.declarations[0].init) {
|
||||
return this.parseForIn(node, init);
|
||||
return this.parseForIn(node, init, forAwait);
|
||||
}
|
||||
}
|
||||
|
||||
if (forAwait) {
|
||||
this.unexpected();
|
||||
}
|
||||
return this.parseFor(node, init);
|
||||
}
|
||||
|
||||
@ -250,10 +261,13 @@ pp.parseForStatement = function (node) {
|
||||
if (this.match(tt._in) || this.isContextual("of")) {
|
||||
this.toAssignable(init);
|
||||
this.checkLVal(init);
|
||||
return this.parseForIn(node, init);
|
||||
return this.parseForIn(node, init, forAwait);
|
||||
} else if (refShorthandDefaultPos.start) {
|
||||
this.unexpected(refShorthandDefaultPos.start);
|
||||
}
|
||||
if (forAwait) {
|
||||
this.unexpected();
|
||||
}
|
||||
return this.parseFor(node, init);
|
||||
};
|
||||
|
||||
@ -508,9 +522,15 @@ pp.parseFor = function (node, init) {
|
||||
// Parse a `for`/`in` and `for`/`of` loop, which are almost
|
||||
// same from parser's perspective.
|
||||
|
||||
pp.parseForIn = function (node, init) {
|
||||
let type = this.match(tt._in) ? "ForInStatement" : "ForOfStatement";
|
||||
this.next();
|
||||
pp.parseForIn = function (node, init, forAwait) {
|
||||
let type;
|
||||
if (forAwait) {
|
||||
this.eatContextual("of");
|
||||
type = "ForAwaitStatement";
|
||||
} else {
|
||||
type = this.match(tt._in) ? "ForInStatement" : "ForOfStatement";
|
||||
this.next();
|
||||
}
|
||||
node.left = init;
|
||||
node.right = this.parseExpression();
|
||||
this.expect(tt.parenR);
|
||||
|
||||
3
test/fixtures/experimental/async-generators/for-await-async-context/actual.js
vendored
Normal file
3
test/fixtures/experimental/async-generators/for-await-async-context/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
function f() {
|
||||
for await (let x of y);
|
||||
}
|
||||
3
test/fixtures/experimental/async-generators/for-await-async-context/options.json
vendored
Normal file
3
test/fixtures/experimental/async-generators/for-await-async-context/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Unexpected token (2:6)"
|
||||
}
|
||||
3
test/fixtures/experimental/async-generators/for-await-no-in/actual.js
vendored
Normal file
3
test/fixtures/experimental/async-generators/for-await-no-in/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
async function f() {
|
||||
for await (let x in y);
|
||||
}
|
||||
184
test/fixtures/experimental/async-generators/for-await-no-in/expected.json
vendored
Normal file
184
test/fixtures/experimental/async-generators/for-await-no-in/expected.json
vendored
Normal file
@ -0,0 +1,184 @@
|
||||
{
|
||||
"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",
|
||||
"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
|
||||
}
|
||||
},
|
||||
"name": "f"
|
||||
},
|
||||
"generator": false,
|
||||
"expression": false,
|
||||
"async": true,
|
||||
"params": [],
|
||||
"body": {
|
||||
"type": "BlockStatement",
|
||||
"start": 19,
|
||||
"end": 48,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 19
|
||||
},
|
||||
"end": {
|
||||
"line": 3,
|
||||
"column": 1
|
||||
}
|
||||
},
|
||||
"body": [
|
||||
{
|
||||
"type": "ForAwaitStatement",
|
||||
"start": 23,
|
||||
"end": 46,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 2
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 25
|
||||
}
|
||||
},
|
||||
"await": true,
|
||||
"left": {
|
||||
"type": "VariableDeclaration",
|
||||
"start": 34,
|
||||
"end": 39,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 13
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 18
|
||||
}
|
||||
},
|
||||
"declarations": [
|
||||
{
|
||||
"type": "VariableDeclarator",
|
||||
"start": 38,
|
||||
"end": 39,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 17
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 18
|
||||
}
|
||||
},
|
||||
"id": {
|
||||
"type": "Identifier",
|
||||
"start": 38,
|
||||
"end": 39,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 17
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 18
|
||||
}
|
||||
},
|
||||
"name": "x"
|
||||
},
|
||||
"init": null
|
||||
}
|
||||
],
|
||||
"kind": "let"
|
||||
},
|
||||
"right": {
|
||||
"type": "Identifier",
|
||||
"start": 43,
|
||||
"end": 44,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 22
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 23
|
||||
}
|
||||
},
|
||||
"name": "y"
|
||||
},
|
||||
"body": {
|
||||
"type": "EmptyStatement",
|
||||
"start": 45,
|
||||
"end": 46,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 24
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 25
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
3
test/fixtures/experimental/async-generators/for-await-no-in/options.json
vendored
Normal file
3
test/fixtures/experimental/async-generators/for-await-no-in/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Unexpected token (2:19)"
|
||||
}
|
||||
3
test/fixtures/experimental/async-generators/for-await-no-semi-1/actual.js
vendored
Normal file
3
test/fixtures/experimental/async-generators/for-await-no-semi-1/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
async function f() {
|
||||
for await (;false;);
|
||||
}
|
||||
3
test/fixtures/experimental/async-generators/for-await-no-semi-1/options.json
vendored
Normal file
3
test/fixtures/experimental/async-generators/for-await-no-semi-1/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Unexpected token (2:13)"
|
||||
}
|
||||
3
test/fixtures/experimental/async-generators/for-await-no-semi-2/actual.js
vendored
Normal file
3
test/fixtures/experimental/async-generators/for-await-no-semi-2/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
async function f() {
|
||||
for await (let i = 0;false;);
|
||||
}
|
||||
3
test/fixtures/experimental/async-generators/for-await-no-semi-2/options.json
vendored
Normal file
3
test/fixtures/experimental/async-generators/for-await-no-semi-2/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Unexpected token (2:22)"
|
||||
}
|
||||
3
test/fixtures/experimental/async-generators/for-await-no-semi-3/actual.js
vendored
Normal file
3
test/fixtures/experimental/async-generators/for-await-no-semi-3/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
async function f() {
|
||||
for await (x = 0;false;);
|
||||
}
|
||||
3
test/fixtures/experimental/async-generators/for-await-no-semi-3/options.json
vendored
Normal file
3
test/fixtures/experimental/async-generators/for-await-no-semi-3/options.json
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"throws": "Unexpected token (2:18)"
|
||||
}
|
||||
3
test/fixtures/experimental/async-generators/for-await/actual.js
vendored
Normal file
3
test/fixtures/experimental/async-generators/for-await/actual.js
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
async function f() {
|
||||
for await (let x of y);
|
||||
}
|
||||
183
test/fixtures/experimental/async-generators/for-await/expected.json
vendored
Normal file
183
test/fixtures/experimental/async-generators/for-await/expected.json
vendored
Normal file
@ -0,0 +1,183 @@
|
||||
{
|
||||
"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",
|
||||
"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
|
||||
}
|
||||
},
|
||||
"name": "f"
|
||||
},
|
||||
"generator": false,
|
||||
"expression": false,
|
||||
"async": true,
|
||||
"params": [],
|
||||
"body": {
|
||||
"type": "BlockStatement",
|
||||
"start": 19,
|
||||
"end": 48,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 1,
|
||||
"column": 19
|
||||
},
|
||||
"end": {
|
||||
"line": 3,
|
||||
"column": 1
|
||||
}
|
||||
},
|
||||
"body": [
|
||||
{
|
||||
"type": "ForAwaitStatement",
|
||||
"start": 23,
|
||||
"end": 46,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 2
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 25
|
||||
}
|
||||
},
|
||||
"left": {
|
||||
"type": "VariableDeclaration",
|
||||
"start": 34,
|
||||
"end": 39,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 13
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 18
|
||||
}
|
||||
},
|
||||
"declarations": [
|
||||
{
|
||||
"type": "VariableDeclarator",
|
||||
"start": 38,
|
||||
"end": 39,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 17
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 18
|
||||
}
|
||||
},
|
||||
"id": {
|
||||
"type": "Identifier",
|
||||
"start": 38,
|
||||
"end": 39,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 17
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 18
|
||||
}
|
||||
},
|
||||
"name": "x"
|
||||
},
|
||||
"init": null
|
||||
}
|
||||
],
|
||||
"kind": "let"
|
||||
},
|
||||
"right": {
|
||||
"type": "Identifier",
|
||||
"start": 43,
|
||||
"end": 44,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 22
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 23
|
||||
}
|
||||
},
|
||||
"name": "y"
|
||||
},
|
||||
"body": {
|
||||
"type": "EmptyStatement",
|
||||
"start": 45,
|
||||
"end": 46,
|
||||
"loc": {
|
||||
"start": {
|
||||
"line": 2,
|
||||
"column": 24
|
||||
},
|
||||
"end": {
|
||||
"line": 2,
|
||||
"column": 25
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
],
|
||||
"directives": []
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user