Skip to content

Commit 19cde06

Browse files
author
Andy
authored
Merge pull request #9890 from Microsoft/cast_of_await
Allow `await` in a simple unary expression
2 parents a621c09 + b482fa5 commit 19cde06

File tree

8 files changed

+117
-0
lines changed

8 files changed

+117
-0
lines changed

src/compiler/parser.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3417,6 +3417,7 @@ namespace ts {
34173417
* 6) - UnaryExpression[?yield]
34183418
* 7) ~ UnaryExpression[?yield]
34193419
* 8) ! UnaryExpression[?yield]
3420+
* 9) [+Await] await UnaryExpression[?yield]
34203421
*/
34213422
function parseSimpleUnaryExpression(): UnaryExpression {
34223423
switch (token()) {
@@ -3431,6 +3432,8 @@ namespace ts {
34313432
return parseTypeOfExpression();
34323433
case SyntaxKind.VoidKeyword:
34333434
return parseVoidExpression();
3435+
case SyntaxKind.AwaitKeyword:
3436+
return parseAwaitExpression();
34343437
case SyntaxKind.LessThanToken:
34353438
// This is modified UnaryExpression grammar in TypeScript
34363439
// UnaryExpression (modified):
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//// [castOfAwait.ts]
2+
async function f() {
3+
<number> await 0;
4+
typeof await 0;
5+
void await 0;
6+
await void <string> typeof <number> void await 0;
7+
await await 0;
8+
}
9+
10+
11+
//// [castOfAwait.js]
12+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13+
return new (P || (P = Promise))(function (resolve, reject) {
14+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
15+
function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }
16+
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
17+
step((generator = generator.apply(thisArg, _arguments)).next());
18+
});
19+
};
20+
function f() {
21+
return __awaiter(this, void 0, void 0, function* () {
22+
yield 0;
23+
typeof yield 0;
24+
void yield 0;
25+
yield void typeof void yield 0;
26+
yield yield 0;
27+
});
28+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
=== tests/cases/compiler/castOfAwait.ts ===
2+
async function f() {
3+
>f : Symbol(f, Decl(castOfAwait.ts, 0, 0))
4+
5+
<number> await 0;
6+
typeof await 0;
7+
void await 0;
8+
await void <string> typeof <number> void await 0;
9+
await await 0;
10+
}
11+
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
=== tests/cases/compiler/castOfAwait.ts ===
2+
async function f() {
3+
>f : () => Promise<void>
4+
5+
<number> await 0;
6+
><number> await 0 : number
7+
>await 0 : number
8+
>0 : number
9+
10+
typeof await 0;
11+
>typeof await 0 : string
12+
>await 0 : number
13+
>0 : number
14+
15+
void await 0;
16+
>void await 0 : undefined
17+
>await 0 : number
18+
>0 : number
19+
20+
await void <string> typeof <number> void await 0;
21+
>await void <string> typeof <number> void await 0 : any
22+
>void <string> typeof <number> void await 0 : undefined
23+
><string> typeof <number> void await 0 : string
24+
>typeof <number> void await 0 : string
25+
><number> void await 0 : number
26+
>void await 0 : undefined
27+
>await 0 : number
28+
>0 : number
29+
30+
await await 0;
31+
>await await 0 : number
32+
>await 0 : number
33+
>0 : number
34+
}
35+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
tests/cases/compiler/castOfYield.ts(4,14): error TS1109: Expression expected.
2+
3+
4+
==== tests/cases/compiler/castOfYield.ts (1 errors) ====
5+
function* f() {
6+
<number> (yield 0);
7+
// Unlike await, yield is not allowed to appear in a simple unary expression.
8+
<number> yield 0;
9+
~~~~~
10+
!!! error TS1109: Expression expected.
11+
}
12+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [castOfYield.ts]
2+
function* f() {
3+
<number> (yield 0);
4+
// Unlike await, yield is not allowed to appear in a simple unary expression.
5+
<number> yield 0;
6+
}
7+
8+
9+
//// [castOfYield.js]
10+
function f() {
11+
(yield 0);
12+
// Unlike await, yield is not allowed to appear in a simple unary expression.
13+
;
14+
yield 0;
15+
}

tests/cases/compiler/castOfAwait.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// @target: es6
2+
async function f() {
3+
<number> await 0;
4+
typeof await 0;
5+
void await 0;
6+
await void <string> typeof <number> void await 0;
7+
await await 0;
8+
}

tests/cases/compiler/castOfYield.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function* f() {
2+
<number> (yield 0);
3+
// Unlike await, yield is not allowed to appear in a simple unary expression.
4+
<number> yield 0;
5+
}

0 commit comments

Comments
 (0)