From 2b6feefcf60ff91e35020deadacf437b2b40939a Mon Sep 17 00:00:00 2001 From: kingwl Date: Sun, 6 Jun 2021 23:33:52 +0800 Subject: [PATCH 1/4] Improve parsing in await and yield context --- src/compiler/parser.ts | 6 +- ...syncOrYieldAsBindingIdentifier1.errors.txt | 68 +++++++++++++ .../asyncOrYieldAsBindingIdentifier1.js | 86 +++++++++++++++++ .../asyncOrYieldAsBindingIdentifier1.symbols | 84 ++++++++++++++++ .../asyncOrYieldAsBindingIdentifier1.types | 96 +++++++++++++++++++ .../asyncOrYieldAsBindingIdentifier1.ts | 49 ++++++++++ 6 files changed, 386 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.errors.txt create mode 100644 tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.js create mode 100644 tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.symbols create mode 100644 tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.types create mode 100644 tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 8a6743090f9dc..fb82b4d603341 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -6122,15 +6122,15 @@ namespace ts { } } - function nextTokenIsIdentifierOrStartOfDestructuring() { + function nextTokenIsBindingIdentifierOrStartOfDestructuring() { nextToken(); - return isIdentifier() || token() === SyntaxKind.OpenBraceToken || token() === SyntaxKind.OpenBracketToken; + return isBindingIdentifier() || token() === SyntaxKind.OpenBraceToken || token() === SyntaxKind.OpenBracketToken; } function isLetDeclaration() { // In ES6 'let' always starts a lexical declaration if followed by an identifier or { // or [. - return lookAhead(nextTokenIsIdentifierOrStartOfDestructuring); + return lookAhead(nextTokenIsBindingIdentifierOrStartOfDestructuring); } function parseStatement(): Statement { diff --git a/tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.errors.txt b/tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.errors.txt new file mode 100644 index 0000000000000..4b18189d9c90b --- /dev/null +++ b/tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.errors.txt @@ -0,0 +1,68 @@ +tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts(14,9): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts(18,9): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts(22,11): error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. +tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts(38,9): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. +tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts(42,9): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. +tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts(46,11): error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. + + +==== tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts (6 errors) ==== + function f_let () { + let await = 1 + } + + function f1_var () { + var await = 1 + } + + function f1_const () { + const await = 1 + } + + async function f2_let () { + let await = 1 + ~~~~~ +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. + } + + async function f2_var () { + var await = 1 + ~~~~~ +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. + } + + async function f2_const () { + const await = 1 + ~~~~~ +!!! error TS1359: Identifier expected. 'await' is a reserved word that cannot be used here. + } + + function f3_let () { + let yield = 2 + } + + function f3_var () { + var yield = 2 + } + + function f3_const () { + const yield = 2 + } + + function * f4_let () { + let yield = 2; + ~~~~~ +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. + } + + function * f4_var () { + var yield = 2; + ~~~~~ +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. + } + + function * f4_const () { + const yield = 2; + ~~~~~ +!!! error TS1359: Identifier expected. 'yield' is a reserved word that cannot be used here. + } \ No newline at end of file diff --git a/tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.js b/tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.js new file mode 100644 index 0000000000000..d770f71ab8a46 --- /dev/null +++ b/tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.js @@ -0,0 +1,86 @@ +//// [asyncOrYieldAsBindingIdentifier1.ts] +function f_let () { + let await = 1 +} + +function f1_var () { + var await = 1 +} + +function f1_const () { + const await = 1 +} + +async function f2_let () { + let await = 1 +} + +async function f2_var () { + var await = 1 +} + +async function f2_const () { + const await = 1 +} + +function f3_let () { + let yield = 2 +} + +function f3_var () { + var yield = 2 +} + +function f3_const () { + const yield = 2 +} + +function * f4_let () { + let yield = 2; +} + +function * f4_var () { + var yield = 2; +} + +function * f4_const () { + const yield = 2; +} + +//// [asyncOrYieldAsBindingIdentifier1.js] +function f_let() { + let await = 1; +} +function f1_var() { + var await = 1; +} +function f1_const() { + const await = 1; +} +async function f2_let() { + let await = 1; +} +async function f2_var() { + var await = 1; +} +async function f2_const() { + const await = 1; +} +function f3_let() { + let yield = 2; +} +function f3_var() { + var yield = 2; +} +function f3_const() { + const yield = 2; +} +function* f4_let() { + let yield = 2; +} +function* f4_var() { + var yield = 2; +} +function* f4_const() { + const yield = 2; +} diff --git a/tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.symbols b/tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.symbols new file mode 100644 index 0000000000000..830d08b69ad13 --- /dev/null +++ b/tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.symbols @@ -0,0 +1,84 @@ +=== tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts === +function f_let () { +>f_let : Symbol(f_let, Decl(asyncOrYieldAsBindingIdentifier1.ts, 0, 0)) + + let await = 1 +>await : Symbol(await, Decl(asyncOrYieldAsBindingIdentifier1.ts, 1, 7)) +} + +function f1_var () { +>f1_var : Symbol(f1_var, Decl(asyncOrYieldAsBindingIdentifier1.ts, 2, 1)) + + var await = 1 +>await : Symbol(await, Decl(asyncOrYieldAsBindingIdentifier1.ts, 5, 7)) +} + +function f1_const () { +>f1_const : Symbol(f1_const, Decl(asyncOrYieldAsBindingIdentifier1.ts, 6, 1)) + + const await = 1 +>await : Symbol(await, Decl(asyncOrYieldAsBindingIdentifier1.ts, 9, 9)) +} + +async function f2_let () { +>f2_let : Symbol(f2_let, Decl(asyncOrYieldAsBindingIdentifier1.ts, 10, 1)) + + let await = 1 +>await : Symbol(await, Decl(asyncOrYieldAsBindingIdentifier1.ts, 13, 7)) +} + +async function f2_var () { +>f2_var : Symbol(f2_var, Decl(asyncOrYieldAsBindingIdentifier1.ts, 14, 1)) + + var await = 1 +>await : Symbol(await, Decl(asyncOrYieldAsBindingIdentifier1.ts, 17, 7)) +} + +async function f2_const () { +>f2_const : Symbol(f2_const, Decl(asyncOrYieldAsBindingIdentifier1.ts, 18, 1)) + + const await = 1 +>await : Symbol(await, Decl(asyncOrYieldAsBindingIdentifier1.ts, 21, 9)) +} + +function f3_let () { +>f3_let : Symbol(f3_let, Decl(asyncOrYieldAsBindingIdentifier1.ts, 22, 1)) + + let yield = 2 +>yield : Symbol(yield, Decl(asyncOrYieldAsBindingIdentifier1.ts, 25, 7)) +} + +function f3_var () { +>f3_var : Symbol(f3_var, Decl(asyncOrYieldAsBindingIdentifier1.ts, 26, 1)) + + var yield = 2 +>yield : Symbol(yield, Decl(asyncOrYieldAsBindingIdentifier1.ts, 29, 7)) +} + +function f3_const () { +>f3_const : Symbol(f3_const, Decl(asyncOrYieldAsBindingIdentifier1.ts, 30, 1)) + + const yield = 2 +>yield : Symbol(yield, Decl(asyncOrYieldAsBindingIdentifier1.ts, 33, 9)) +} + +function * f4_let () { +>f4_let : Symbol(f4_let, Decl(asyncOrYieldAsBindingIdentifier1.ts, 34, 1)) + + let yield = 2; +>yield : Symbol(yield, Decl(asyncOrYieldAsBindingIdentifier1.ts, 37, 7)) +} + +function * f4_var () { +>f4_var : Symbol(f4_var, Decl(asyncOrYieldAsBindingIdentifier1.ts, 38, 1)) + + var yield = 2; +>yield : Symbol(yield, Decl(asyncOrYieldAsBindingIdentifier1.ts, 41, 7)) +} + +function * f4_const () { +>f4_const : Symbol(f4_const, Decl(asyncOrYieldAsBindingIdentifier1.ts, 42, 1)) + + const yield = 2; +>yield : Symbol(yield, Decl(asyncOrYieldAsBindingIdentifier1.ts, 45, 9)) +} diff --git a/tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.types b/tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.types new file mode 100644 index 0000000000000..e887b60eb21e4 --- /dev/null +++ b/tests/baselines/reference/asyncOrYieldAsBindingIdentifier1.types @@ -0,0 +1,96 @@ +=== tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts === +function f_let () { +>f_let : () => void + + let await = 1 +>await : number +>1 : 1 +} + +function f1_var () { +>f1_var : () => void + + var await = 1 +>await : number +>1 : 1 +} + +function f1_const () { +>f1_const : () => void + + const await = 1 +>await : 1 +>1 : 1 +} + +async function f2_let () { +>f2_let : () => Promise + + let await = 1 +>await : number +>1 : 1 +} + +async function f2_var () { +>f2_var : () => Promise + + var await = 1 +>await : number +>1 : 1 +} + +async function f2_const () { +>f2_const : () => Promise + + const await = 1 +>await : 1 +>1 : 1 +} + +function f3_let () { +>f3_let : () => void + + let yield = 2 +>yield : number +>2 : 2 +} + +function f3_var () { +>f3_var : () => void + + var yield = 2 +>yield : number +>2 : 2 +} + +function f3_const () { +>f3_const : () => void + + const yield = 2 +>yield : 2 +>2 : 2 +} + +function * f4_let () { +>f4_let : () => Generator + + let yield = 2; +>yield : number +>2 : 2 +} + +function * f4_var () { +>f4_var : () => Generator + + var yield = 2; +>yield : number +>2 : 2 +} + +function * f4_const () { +>f4_const : () => Generator + + const yield = 2; +>yield : 2 +>2 : 2 +} diff --git a/tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts b/tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts new file mode 100644 index 0000000000000..31c1c4055c531 --- /dev/null +++ b/tests/cases/conformance/async/es6/functionDeclarations/asyncOrYieldAsBindingIdentifier1.ts @@ -0,0 +1,49 @@ +// @target: esnext + +function f_let () { + let await = 1 +} + +function f1_var () { + var await = 1 +} + +function f1_const () { + const await = 1 +} + +async function f2_let () { + let await = 1 +} + +async function f2_var () { + var await = 1 +} + +async function f2_const () { + const await = 1 +} + +function f3_let () { + let yield = 2 +} + +function f3_var () { + var yield = 2 +} + +function f3_const () { + const yield = 2 +} + +function * f4_let () { + let yield = 2; +} + +function * f4_var () { + var yield = 2; +} + +function * f4_const () { + const yield = 2; +} \ No newline at end of file From 9644859f291840db87de6275f2e4cca7f665bf8a Mon Sep 17 00:00:00 2001 From: kingwl Date: Mon, 21 Jun 2021 15:45:53 +0800 Subject: [PATCH 2/4] Avoid yield and await check in identifier --- src/compiler/parser.ts | 22 ++-- .../await_unaryExpression_es2017_3.errors.txt | 16 ++- .../await_unaryExpression_es2017_3.js | 8 +- .../await_unaryExpression_es2017_3.types | 10 +- .../await_unaryExpression_es6_3.errors.txt | 16 ++- .../reference/await_unaryExpression_es6_3.js | 8 +- .../await_unaryExpression_es6_3.types | 10 +- .../reference/castOfYield.errors.txt | 9 +- tests/baselines/reference/castOfYield.js | 6 +- tests/baselines/reference/castOfYield.types | 5 +- .../topLevelAwaitErrors.1.errors.txt | 105 +++++++++++++----- .../reference/topLevelAwaitErrors.1.js | 44 ++++---- .../reference/topLevelAwaitErrors.1.symbols | 17 +-- .../reference/topLevelAwaitErrors.1.types | 39 ++++--- 14 files changed, 185 insertions(+), 130 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index fb82b4d603341..17d7bf85b823f 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1510,17 +1510,17 @@ namespace ts { return true; } - // If we have a 'yield' keyword, and we're in the [yield] context, then 'yield' is - // considered a keyword and is not an identifier. - if (token() === SyntaxKind.YieldKeyword && inYieldContext()) { - return false; - } - - // If we have a 'await' keyword, and we're in the [Await] context, then 'await' is - // considered a keyword and is not an identifier. - if (token() === SyntaxKind.AwaitKeyword && inAwaitContext()) { - return false; - } + // // If we have a 'yield' keyword, and we're in the [yield] context, then 'yield' is + // // considered a keyword and is not an identifier. + // if (token() === SyntaxKind.YieldKeyword && inYieldContext()) { + // return false; + // } + + // // If we have a 'await' keyword, and we're in the [Await] context, then 'await' is + // // considered a keyword and is not an identifier. + // if (token() === SyntaxKind.AwaitKeyword && inAwaitContext()) { + // return false; + // } return token() > SyntaxKind.LastReservedWord; } diff --git a/tests/baselines/reference/await_unaryExpression_es2017_3.errors.txt b/tests/baselines/reference/await_unaryExpression_es2017_3.errors.txt index da533765a0788..bffdd1b9a2082 100644 --- a/tests/baselines/reference/await_unaryExpression_es2017_3.errors.txt +++ b/tests/baselines/reference/await_unaryExpression_es2017_3.errors.txt @@ -1,18 +1,24 @@ -tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts(2,7): error TS1109: Expression expected. -tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts(6,7): error TS1109: Expression expected. +tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts(2,7): error TS2304: Cannot find name 'await'. +tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts(2,13): error TS1005: ';' expected. +tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts(6,7): error TS2304: Cannot find name 'await'. +tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts(6,13): error TS1005: ';' expected. -==== tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts (2 errors) ==== +==== tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts (4 errors) ==== async function bar1() { ++await 42; // Error ~~~~~ -!!! error TS1109: Expression expected. +!!! error TS2304: Cannot find name 'await'. + ~~ +!!! error TS1005: ';' expected. } async function bar2() { --await 42; // Error ~~~~~ -!!! error TS1109: Expression expected. +!!! error TS2304: Cannot find name 'await'. + ~~ +!!! error TS1005: ';' expected. } async function bar3() { diff --git a/tests/baselines/reference/await_unaryExpression_es2017_3.js b/tests/baselines/reference/await_unaryExpression_es2017_3.js index b2a1593a9d0bd..bbddded1a1d30 100644 --- a/tests/baselines/reference/await_unaryExpression_es2017_3.js +++ b/tests/baselines/reference/await_unaryExpression_es2017_3.js @@ -19,12 +19,12 @@ async function bar4() { //// [await_unaryExpression_es2017_3.js] async function bar1() { - ++; - await 42; // Error + ++await; + 42; // Error } async function bar2() { - --; - await 42; // Error + --await; + 42; // Error } async function bar3() { var x = 42; diff --git a/tests/baselines/reference/await_unaryExpression_es2017_3.types b/tests/baselines/reference/await_unaryExpression_es2017_3.types index b60ea42b2a0d5..f94d05515d657 100644 --- a/tests/baselines/reference/await_unaryExpression_es2017_3.types +++ b/tests/baselines/reference/await_unaryExpression_es2017_3.types @@ -3,9 +3,8 @@ async function bar1() { >bar1 : () => Promise ++await 42; // Error ->++ : number -> : any ->await 42 : 42 +>++await : number +>await : any >42 : 42 } @@ -13,9 +12,8 @@ async function bar2() { >bar2 : () => Promise --await 42; // Error ->-- : number -> : any ->await 42 : 42 +>--await : number +>await : any >42 : 42 } diff --git a/tests/baselines/reference/await_unaryExpression_es6_3.errors.txt b/tests/baselines/reference/await_unaryExpression_es6_3.errors.txt index 373e6739461b4..297c8887db945 100644 --- a/tests/baselines/reference/await_unaryExpression_es6_3.errors.txt +++ b/tests/baselines/reference/await_unaryExpression_es6_3.errors.txt @@ -1,18 +1,24 @@ -tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts(2,7): error TS1109: Expression expected. -tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts(6,7): error TS1109: Expression expected. +tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts(2,7): error TS2304: Cannot find name 'await'. +tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts(2,13): error TS1005: ';' expected. +tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts(6,7): error TS2304: Cannot find name 'await'. +tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts(6,13): error TS1005: ';' expected. -==== tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts (2 errors) ==== +==== tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts (4 errors) ==== async function bar1() { ++await 42; // Error ~~~~~ -!!! error TS1109: Expression expected. +!!! error TS2304: Cannot find name 'await'. + ~~ +!!! error TS1005: ';' expected. } async function bar2() { --await 42; // Error ~~~~~ -!!! error TS1109: Expression expected. +!!! error TS2304: Cannot find name 'await'. + ~~ +!!! error TS1005: ';' expected. } async function bar3() { diff --git a/tests/baselines/reference/await_unaryExpression_es6_3.js b/tests/baselines/reference/await_unaryExpression_es6_3.js index 42643caa262ae..f92401028025d 100644 --- a/tests/baselines/reference/await_unaryExpression_es6_3.js +++ b/tests/baselines/reference/await_unaryExpression_es6_3.js @@ -29,14 +29,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }; function bar1() { return __awaiter(this, void 0, void 0, function* () { - ++; - yield 42; // Error + ++await; + 42; // Error }); } function bar2() { return __awaiter(this, void 0, void 0, function* () { - --; - yield 42; // Error + --await; + 42; // Error }); } function bar3() { diff --git a/tests/baselines/reference/await_unaryExpression_es6_3.types b/tests/baselines/reference/await_unaryExpression_es6_3.types index db18c88955375..d24149449ac5b 100644 --- a/tests/baselines/reference/await_unaryExpression_es6_3.types +++ b/tests/baselines/reference/await_unaryExpression_es6_3.types @@ -3,9 +3,8 @@ async function bar1() { >bar1 : () => Promise ++await 42; // Error ->++ : number -> : any ->await 42 : 42 +>++await : number +>await : any >42 : 42 } @@ -13,9 +12,8 @@ async function bar2() { >bar2 : () => Promise --await 42; // Error ->-- : number -> : any ->await 42 : 42 +>--await : number +>await : any >42 : 42 } diff --git a/tests/baselines/reference/castOfYield.errors.txt b/tests/baselines/reference/castOfYield.errors.txt index 0d40a4dcd987d..b7c3035f68e4e 100644 --- a/tests/baselines/reference/castOfYield.errors.txt +++ b/tests/baselines/reference/castOfYield.errors.txt @@ -1,14 +1,17 @@ error TS2318: Cannot find global type 'IterableIterator'. -tests/cases/compiler/castOfYield.ts(4,14): error TS1109: Expression expected. +tests/cases/compiler/castOfYield.ts(4,14): error TS2304: Cannot find name 'yield'. +tests/cases/compiler/castOfYield.ts(4,20): error TS1005: ';' expected. !!! error TS2318: Cannot find global type 'IterableIterator'. -==== tests/cases/compiler/castOfYield.ts (1 errors) ==== +==== tests/cases/compiler/castOfYield.ts (2 errors) ==== function* f() { (yield 0); // Unlike await, yield is not allowed to appear in a simple unary expression. yield 0; ~~~~~ -!!! error TS1109: Expression expected. +!!! error TS2304: Cannot find name 'yield'. + ~ +!!! error TS1005: ';' expected. } \ No newline at end of file diff --git a/tests/baselines/reference/castOfYield.js b/tests/baselines/reference/castOfYield.js index 86d35bedad434..91b1f01a7852f 100644 --- a/tests/baselines/reference/castOfYield.js +++ b/tests/baselines/reference/castOfYield.js @@ -41,10 +41,8 @@ function f() { case 1: (_a.sent()); // Unlike await, yield is not allowed to appear in a simple unary expression. - ; - return [4 /*yield*/, 0]; - case 2: - _a.sent(); + yield; + 0; return [2 /*return*/]; } }); diff --git a/tests/baselines/reference/castOfYield.types b/tests/baselines/reference/castOfYield.types index c005205609196..008cf646686dd 100644 --- a/tests/baselines/reference/castOfYield.types +++ b/tests/baselines/reference/castOfYield.types @@ -10,9 +10,8 @@ function* f() { // Unlike await, yield is not allowed to appear in a simple unary expression. yield 0; -> : number -> : any ->yield 0 : any +> yield : number +>yield : any >0 : 0 } diff --git a/tests/baselines/reference/topLevelAwaitErrors.1.errors.txt b/tests/baselines/reference/topLevelAwaitErrors.1.errors.txt index 773e8446a6fda..525ce18f6d7a2 100644 --- a/tests/baselines/reference/topLevelAwaitErrors.1.errors.txt +++ b/tests/baselines/reference/topLevelAwaitErrors.1.errors.txt @@ -4,23 +4,40 @@ tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(5,14): error TS tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(5,16): error TS2693: 'string' only refers to a type, but is being used as a value here. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(8,14): error TS1005: '>' expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(8,16): error TS2693: 'string' only refers to a type, but is being used as a value here. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,17): error TS1109: Expression expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,22): error TS1109: Expression expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,23): error TS2693: 'string' only refers to a type, but is being used as a value here. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,29): error TS1005: ',' expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,17): error TS2304: Cannot find name 'await'. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(15,8): error TS1109: Expression expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(18,2): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(18,8): error TS1146: Declaration expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(18,8): error TS2304: Cannot find name 'x'. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(21,2): error TS1109: Expression expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(26,6): error TS1109: Expression expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(30,6): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(18,9): error TS1005: ';' expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(22,6): error TS1146: Declaration expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(22,7): error TS2304: Cannot find name 'C3'. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(22,10): error TS1005: ';' expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(26,6): error TS2304: Cannot find name 'await'. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(27,11): error TS1005: ';' expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(27,12): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(27,13): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(27,15): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(28,1): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(30,6): error TS2304: Cannot find name 'await'. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(30,13): error TS1005: ';' expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(34,12): error TS1109: Expression expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(40,14): error TS1109: Expression expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(41,14): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(40,14): error TS2304: Cannot find name 'await'. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(40,22): error TS1005: ')' expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(40,23): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(40,25): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(41,5): error TS2304: Cannot find name 'method2'. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(41,13): error TS1135: Argument expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(41,24): error TS2304: Cannot find name 'x'. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(41,28): error TS1005: ';' expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,5): error TS2304: Cannot find name 'method3'. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,13): error TS1135: Argument expression expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,20): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,23): error TS2304: Cannot find name 'x'. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,27): error TS1005: ';' expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(43,1): error TS1109: Expression expected. -==== tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts (20 errors) ==== +==== tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts (37 errors) ==== export {}; // reparse call as invalid await should error @@ -45,13 +62,7 @@ tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,20): error T // reparse class extends clause should fail class C extends await { ~~~~~ -!!! error TS1109: Expression expected. - ~ -!!! error TS1109: Expression expected. - ~~~~~~ -!!! error TS2693: 'string' only refers to a type, but is being used as a value here. - ~ -!!! error TS1005: ',' expected. +!!! error TS2304: Cannot find name 'await'. } // await in class decorators should fail @@ -61,28 +72,46 @@ tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,20): error T class C1 {} @await(x) - ~~~~~ -!!! error TS1109: Expression expected. + +!!! error TS1146: Declaration expected. ~ !!! error TS2304: Cannot find name 'x'. + ~ +!!! error TS1005: ';' expected. class C2 {} @await - ~~~~~ -!!! error TS1109: Expression expected. class C3 {} + +!!! error TS1146: Declaration expected. + ~~ +!!! error TS2304: Cannot find name 'C3'. + ~ +!!! error TS1005: ';' expected. // await in member decorators should fail class C4 { @await ~~~~~ -!!! error TS1109: Expression expected. +!!! error TS2304: Cannot find name 'await'. ["foo"]() {} + ~ +!!! error TS1005: ';' expected. + ~ +!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. + ~ +!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. + ~ +!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. } + ~ +!!! error TS1109: Expression expected. class C5 { @await(1) ~~~~~ -!!! error TS1109: Expression expected. +!!! error TS2304: Cannot find name 'await'. + ~ +!!! error TS1005: ';' expected. ["foo"]() {} } class C6 { @@ -96,12 +125,34 @@ tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,20): error T class C7 { method1(@await [x]) {} ~~~~~ -!!! error TS1109: Expression expected. +!!! error TS2304: Cannot find name 'await'. + ~ +!!! error TS1005: ')' expected. + ~ +!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. + ~ +!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. method2(@await(1) [x]) {} - ~~~~~ -!!! error TS1109: Expression expected. + ~~~~~~~ +!!! error TS2304: Cannot find name 'method2'. + ~ +!!! error TS1135: Argument expression expected. + ~ +!!! error TS2304: Cannot find name 'x'. + ~ +!!! error TS1005: ';' expected. method3(@(await) [x]) {} + ~~~~~~~ +!!! error TS2304: Cannot find name 'method3'. + ~ +!!! error TS1135: Argument expression expected. ~ !!! error TS1109: Expression expected. + ~ +!!! error TS2304: Cannot find name 'x'. + ~ +!!! error TS1005: ';' expected. } + ~ +!!! error TS1109: Expression expected. \ No newline at end of file diff --git a/tests/baselines/reference/topLevelAwaitErrors.1.js b/tests/baselines/reference/topLevelAwaitErrors.1.js index 175321a0513f8..b535c95dca4eb 100644 --- a/tests/baselines/reference/topLevelAwaitErrors.1.js +++ b/tests/baselines/reference/topLevelAwaitErrors.1.js @@ -51,7 +51,7 @@ await , string > (1); // reparse tagged template as invalid await should error await , string > ``; // reparse class extends clause should fail -class C extends string { +class C extends await { } // await in class decorators should fail let C1 = class C1 { @@ -59,27 +59,27 @@ let C1 = class C1 { C1 = __decorate([ (await ) ], C1); -let C2 = class C2 { -}; -C2 = __decorate([ - (x) -], C2); -let C3 = class C3 { -}; -C3 = __decorate([ -], C3); +x; +; +class C2 { +} +C3; +{ } // await in member decorators should fail class C4 { - ["foo"]() { } + "foo"; } __decorate([ -], C4.prototype, "foo", null); + await +], C4.prototype, "foo", void 0); +; class C5 { + 1; ["foo"]() { } } __decorate([ - (1) -], C5.prototype, "foo", null); + await +], C5.prototype, 1, void 0); class C6 { ["foo"]() { } } @@ -88,17 +88,13 @@ __decorate([ ], C6.prototype, "foo", null); // await in parameter decorators should fail class C7 { - method1([x]) { } - method2([x]) { } - method3([x]) { } } __decorate([ - __param(0, ) + __param(0, await) ], C7.prototype, "method1", null); -__decorate([ - __param(0, (1)) -], C7.prototype, "method2", null); -__decorate([ - __param(0, (await )) -], C7.prototype, "method3", null); +method2(await (1)[x]); +{ } +method3((await )[x]); +{ } +; export {}; diff --git a/tests/baselines/reference/topLevelAwaitErrors.1.symbols b/tests/baselines/reference/topLevelAwaitErrors.1.symbols index c414127bbe691..0384c15c740e2 100644 --- a/tests/baselines/reference/topLevelAwaitErrors.1.symbols +++ b/tests/baselines/reference/topLevelAwaitErrors.1.symbols @@ -20,11 +20,10 @@ class C1 {} @await(x) class C2 {} ->C2 : Symbol(C2, Decl(topLevelAwaitErrors.1.ts, 15, 11)) +>C2 : Symbol(C2, Decl(topLevelAwaitErrors.1.ts, 17, 9)) @await class C3 {} ->C3 : Symbol(C3, Decl(topLevelAwaitErrors.1.ts, 18, 11)) // await in member decorators should fail class C4 { @@ -32,16 +31,17 @@ class C4 { @await ["foo"]() {} ->["foo"] : Symbol(C4["foo"], Decl(topLevelAwaitErrors.1.ts, 24, 10)) >"foo" : Symbol(C4["foo"], Decl(topLevelAwaitErrors.1.ts, 24, 10)) } class C5 { >C5 : Symbol(C5, Decl(topLevelAwaitErrors.1.ts, 27, 1)) @await(1) +>1 : Symbol(C5[1], Decl(topLevelAwaitErrors.1.ts, 28, 10)) + ["foo"]() {} ->["foo"] : Symbol(C5["foo"], Decl(topLevelAwaitErrors.1.ts, 28, 10)) ->"foo" : Symbol(C5["foo"], Decl(topLevelAwaitErrors.1.ts, 28, 10)) +>["foo"] : Symbol(C5["foo"], Decl(topLevelAwaitErrors.1.ts, 29, 13)) +>"foo" : Symbol(C5["foo"], Decl(topLevelAwaitErrors.1.ts, 29, 13)) } class C6 { >C6 : Symbol(C6, Decl(topLevelAwaitErrors.1.ts, 31, 1)) @@ -58,14 +58,9 @@ class C7 { method1(@await [x]) {} >method1 : Symbol(C7.method1, Decl(topLevelAwaitErrors.1.ts, 38, 10)) ->x : Symbol(x, Decl(topLevelAwaitErrors.1.ts, 39, 20)) +>x : Symbol(x, Decl(topLevelAwaitErrors.1.ts, 39, 12)) method2(@await(1) [x]) {} ->method2 : Symbol(C7.method2, Decl(topLevelAwaitErrors.1.ts, 39, 26)) ->x : Symbol(x, Decl(topLevelAwaitErrors.1.ts, 40, 23)) - method3(@(await) [x]) {} ->method3 : Symbol(C7.method3, Decl(topLevelAwaitErrors.1.ts, 40, 29)) ->x : Symbol(x, Decl(topLevelAwaitErrors.1.ts, 41, 22)) } diff --git a/tests/baselines/reference/topLevelAwaitErrors.1.types b/tests/baselines/reference/topLevelAwaitErrors.1.types index 7e8efc49dce7f..3ce38b5cca110 100644 --- a/tests/baselines/reference/topLevelAwaitErrors.1.types +++ b/tests/baselines/reference/topLevelAwaitErrors.1.types @@ -32,7 +32,7 @@ await ``; // reparse class extends clause should fail class C extends await { >C : C ->string : any +>await : any } // await in class decorators should fail @@ -45,37 +45,37 @@ class C1 {} >C1 : C1 @await(x) ->await(x) : any -> : any +>await : any >x : any +> : any class C2 {} >C2 : C2 @await -> : any +>await : any class C3 {} ->C3 : C3 +>C3 : any // await in member decorators should fail class C4 { >C4 : C4 @await -> : any +>await : any ["foo"]() {} ->["foo"] : () => void ->"foo" : "foo" +>"foo" : any } +> : any + class C5 { >C5 : C5 @await(1) ->await(1) : any -> : any ->1 : 1 +>await : any +>1 : any ["foo"]() {} >["foo"] : () => void @@ -99,22 +99,27 @@ class C7 { >C7 : C7 method1(@await [x]) {} ->method1 : ([x]: [any]) => void -> : any +>method1 : (x: any) => any +>await : any >x : any method2(@await(1) [x]) {} ->method2 : ([x]: [any]) => void ->await(1) : any -> : any +>method2(@await(1) [x]) : any +>method2 : any +>await(1) [x] : any +>(1) [x] : any +>(1) : 1 >1 : 1 >x : any method3(@(await) [x]) {} ->method3 : ([x]: [any]) => void +>method3(@(await) [x]) : any +>method3 : any +>(await) [x] : any >(await) : any >await : any > : any >x : any } +> : any From 347094c9978659dc3def758308f829b99bb822ef Mon Sep 17 00:00:00 2001 From: kingwl Date: Mon, 21 Jun 2021 15:46:00 +0800 Subject: [PATCH 3/4] Revert "Avoid yield and awaitt check in identifier" This reverts commit 9644859f291840db87de6275f2e4cca7f665bf8a. --- src/compiler/parser.ts | 22 ++-- .../await_unaryExpression_es2017_3.errors.txt | 16 +-- .../await_unaryExpression_es2017_3.js | 8 +- .../await_unaryExpression_es2017_3.types | 10 +- .../await_unaryExpression_es6_3.errors.txt | 16 +-- .../reference/await_unaryExpression_es6_3.js | 8 +- .../await_unaryExpression_es6_3.types | 10 +- .../reference/castOfYield.errors.txt | 9 +- tests/baselines/reference/castOfYield.js | 6 +- tests/baselines/reference/castOfYield.types | 5 +- .../topLevelAwaitErrors.1.errors.txt | 105 +++++------------- .../reference/topLevelAwaitErrors.1.js | 44 ++++---- .../reference/topLevelAwaitErrors.1.symbols | 17 ++- .../reference/topLevelAwaitErrors.1.types | 39 +++---- 14 files changed, 130 insertions(+), 185 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 17d7bf85b823f..fb82b4d603341 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1510,17 +1510,17 @@ namespace ts { return true; } - // // If we have a 'yield' keyword, and we're in the [yield] context, then 'yield' is - // // considered a keyword and is not an identifier. - // if (token() === SyntaxKind.YieldKeyword && inYieldContext()) { - // return false; - // } - - // // If we have a 'await' keyword, and we're in the [Await] context, then 'await' is - // // considered a keyword and is not an identifier. - // if (token() === SyntaxKind.AwaitKeyword && inAwaitContext()) { - // return false; - // } + // If we have a 'yield' keyword, and we're in the [yield] context, then 'yield' is + // considered a keyword and is not an identifier. + if (token() === SyntaxKind.YieldKeyword && inYieldContext()) { + return false; + } + + // If we have a 'await' keyword, and we're in the [Await] context, then 'await' is + // considered a keyword and is not an identifier. + if (token() === SyntaxKind.AwaitKeyword && inAwaitContext()) { + return false; + } return token() > SyntaxKind.LastReservedWord; } diff --git a/tests/baselines/reference/await_unaryExpression_es2017_3.errors.txt b/tests/baselines/reference/await_unaryExpression_es2017_3.errors.txt index bffdd1b9a2082..da533765a0788 100644 --- a/tests/baselines/reference/await_unaryExpression_es2017_3.errors.txt +++ b/tests/baselines/reference/await_unaryExpression_es2017_3.errors.txt @@ -1,24 +1,18 @@ -tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts(2,7): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts(2,13): error TS1005: ';' expected. -tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts(6,7): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts(6,13): error TS1005: ';' expected. +tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts(2,7): error TS1109: Expression expected. +tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts(6,7): error TS1109: Expression expected. -==== tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts (4 errors) ==== +==== tests/cases/conformance/async/es2017/await_unaryExpression_es2017_3.ts (2 errors) ==== async function bar1() { ++await 42; // Error ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~~ -!!! error TS1005: ';' expected. +!!! error TS1109: Expression expected. } async function bar2() { --await 42; // Error ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~~ -!!! error TS1005: ';' expected. +!!! error TS1109: Expression expected. } async function bar3() { diff --git a/tests/baselines/reference/await_unaryExpression_es2017_3.js b/tests/baselines/reference/await_unaryExpression_es2017_3.js index bbddded1a1d30..b2a1593a9d0bd 100644 --- a/tests/baselines/reference/await_unaryExpression_es2017_3.js +++ b/tests/baselines/reference/await_unaryExpression_es2017_3.js @@ -19,12 +19,12 @@ async function bar4() { //// [await_unaryExpression_es2017_3.js] async function bar1() { - ++await; - 42; // Error + ++; + await 42; // Error } async function bar2() { - --await; - 42; // Error + --; + await 42; // Error } async function bar3() { var x = 42; diff --git a/tests/baselines/reference/await_unaryExpression_es2017_3.types b/tests/baselines/reference/await_unaryExpression_es2017_3.types index f94d05515d657..b60ea42b2a0d5 100644 --- a/tests/baselines/reference/await_unaryExpression_es2017_3.types +++ b/tests/baselines/reference/await_unaryExpression_es2017_3.types @@ -3,8 +3,9 @@ async function bar1() { >bar1 : () => Promise ++await 42; // Error ->++await : number ->await : any +>++ : number +> : any +>await 42 : 42 >42 : 42 } @@ -12,8 +13,9 @@ async function bar2() { >bar2 : () => Promise --await 42; // Error ->--await : number ->await : any +>-- : number +> : any +>await 42 : 42 >42 : 42 } diff --git a/tests/baselines/reference/await_unaryExpression_es6_3.errors.txt b/tests/baselines/reference/await_unaryExpression_es6_3.errors.txt index 297c8887db945..373e6739461b4 100644 --- a/tests/baselines/reference/await_unaryExpression_es6_3.errors.txt +++ b/tests/baselines/reference/await_unaryExpression_es6_3.errors.txt @@ -1,24 +1,18 @@ -tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts(2,7): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts(2,13): error TS1005: ';' expected. -tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts(6,7): error TS2304: Cannot find name 'await'. -tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts(6,13): error TS1005: ';' expected. +tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts(2,7): error TS1109: Expression expected. +tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts(6,7): error TS1109: Expression expected. -==== tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts (4 errors) ==== +==== tests/cases/conformance/async/es6/await_unaryExpression_es6_3.ts (2 errors) ==== async function bar1() { ++await 42; // Error ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~~ -!!! error TS1005: ';' expected. +!!! error TS1109: Expression expected. } async function bar2() { --await 42; // Error ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~~ -!!! error TS1005: ';' expected. +!!! error TS1109: Expression expected. } async function bar3() { diff --git a/tests/baselines/reference/await_unaryExpression_es6_3.js b/tests/baselines/reference/await_unaryExpression_es6_3.js index f92401028025d..42643caa262ae 100644 --- a/tests/baselines/reference/await_unaryExpression_es6_3.js +++ b/tests/baselines/reference/await_unaryExpression_es6_3.js @@ -29,14 +29,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }; function bar1() { return __awaiter(this, void 0, void 0, function* () { - ++await; - 42; // Error + ++; + yield 42; // Error }); } function bar2() { return __awaiter(this, void 0, void 0, function* () { - --await; - 42; // Error + --; + yield 42; // Error }); } function bar3() { diff --git a/tests/baselines/reference/await_unaryExpression_es6_3.types b/tests/baselines/reference/await_unaryExpression_es6_3.types index d24149449ac5b..db18c88955375 100644 --- a/tests/baselines/reference/await_unaryExpression_es6_3.types +++ b/tests/baselines/reference/await_unaryExpression_es6_3.types @@ -3,8 +3,9 @@ async function bar1() { >bar1 : () => Promise ++await 42; // Error ->++await : number ->await : any +>++ : number +> : any +>await 42 : 42 >42 : 42 } @@ -12,8 +13,9 @@ async function bar2() { >bar2 : () => Promise --await 42; // Error ->--await : number ->await : any +>-- : number +> : any +>await 42 : 42 >42 : 42 } diff --git a/tests/baselines/reference/castOfYield.errors.txt b/tests/baselines/reference/castOfYield.errors.txt index b7c3035f68e4e..0d40a4dcd987d 100644 --- a/tests/baselines/reference/castOfYield.errors.txt +++ b/tests/baselines/reference/castOfYield.errors.txt @@ -1,17 +1,14 @@ error TS2318: Cannot find global type 'IterableIterator'. -tests/cases/compiler/castOfYield.ts(4,14): error TS2304: Cannot find name 'yield'. -tests/cases/compiler/castOfYield.ts(4,20): error TS1005: ';' expected. +tests/cases/compiler/castOfYield.ts(4,14): error TS1109: Expression expected. !!! error TS2318: Cannot find global type 'IterableIterator'. -==== tests/cases/compiler/castOfYield.ts (2 errors) ==== +==== tests/cases/compiler/castOfYield.ts (1 errors) ==== function* f() { (yield 0); // Unlike await, yield is not allowed to appear in a simple unary expression. yield 0; ~~~~~ -!!! error TS2304: Cannot find name 'yield'. - ~ -!!! error TS1005: ';' expected. +!!! error TS1109: Expression expected. } \ No newline at end of file diff --git a/tests/baselines/reference/castOfYield.js b/tests/baselines/reference/castOfYield.js index 91b1f01a7852f..86d35bedad434 100644 --- a/tests/baselines/reference/castOfYield.js +++ b/tests/baselines/reference/castOfYield.js @@ -41,8 +41,10 @@ function f() { case 1: (_a.sent()); // Unlike await, yield is not allowed to appear in a simple unary expression. - yield; - 0; + ; + return [4 /*yield*/, 0]; + case 2: + _a.sent(); return [2 /*return*/]; } }); diff --git a/tests/baselines/reference/castOfYield.types b/tests/baselines/reference/castOfYield.types index 008cf646686dd..c005205609196 100644 --- a/tests/baselines/reference/castOfYield.types +++ b/tests/baselines/reference/castOfYield.types @@ -10,8 +10,9 @@ function* f() { // Unlike await, yield is not allowed to appear in a simple unary expression. yield 0; -> yield : number ->yield : any +> : number +> : any +>yield 0 : any >0 : 0 } diff --git a/tests/baselines/reference/topLevelAwaitErrors.1.errors.txt b/tests/baselines/reference/topLevelAwaitErrors.1.errors.txt index 525ce18f6d7a2..773e8446a6fda 100644 --- a/tests/baselines/reference/topLevelAwaitErrors.1.errors.txt +++ b/tests/baselines/reference/topLevelAwaitErrors.1.errors.txt @@ -4,40 +4,23 @@ tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(5,14): error TS tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(5,16): error TS2693: 'string' only refers to a type, but is being used as a value here. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(8,14): error TS1005: '>' expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(8,16): error TS2693: 'string' only refers to a type, but is being used as a value here. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,17): error TS2304: Cannot find name 'await'. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,17): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,22): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,23): error TS2693: 'string' only refers to a type, but is being used as a value here. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(11,29): error TS1005: ',' expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(15,8): error TS1109: Expression expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(18,8): error TS1146: Declaration expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(18,2): error TS1109: Expression expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(18,8): error TS2304: Cannot find name 'x'. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(18,9): error TS1005: ';' expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(22,6): error TS1146: Declaration expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(22,7): error TS2304: Cannot find name 'C3'. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(22,10): error TS1005: ';' expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(26,6): error TS2304: Cannot find name 'await'. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(27,11): error TS1005: ';' expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(27,12): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(27,13): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(27,15): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(28,1): error TS1109: Expression expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(30,6): error TS2304: Cannot find name 'await'. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(30,13): error TS1005: ';' expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(21,2): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(26,6): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(30,6): error TS1109: Expression expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(34,12): error TS1109: Expression expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(40,14): error TS2304: Cannot find name 'await'. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(40,22): error TS1005: ')' expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(40,23): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(40,25): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(41,5): error TS2304: Cannot find name 'method2'. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(41,13): error TS1135: Argument expression expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(41,24): error TS2304: Cannot find name 'x'. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(41,28): error TS1005: ';' expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,5): error TS2304: Cannot find name 'method3'. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,13): error TS1135: Argument expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(40,14): error TS1109: Expression expected. +tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(41,14): error TS1109: Expression expected. tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,20): error TS1109: Expression expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,23): error TS2304: Cannot find name 'x'. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(42,27): error TS1005: ';' expected. -tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(43,1): error TS1109: Expression expected. -==== tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts (37 errors) ==== +==== tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts (20 errors) ==== export {}; // reparse call as invalid await should error @@ -62,7 +45,13 @@ tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(43,1): error TS // reparse class extends clause should fail class C extends await { ~~~~~ -!!! error TS2304: Cannot find name 'await'. +!!! error TS1109: Expression expected. + ~ +!!! error TS1109: Expression expected. + ~~~~~~ +!!! error TS2693: 'string' only refers to a type, but is being used as a value here. + ~ +!!! error TS1005: ',' expected. } // await in class decorators should fail @@ -72,46 +61,28 @@ tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(43,1): error TS class C1 {} @await(x) - -!!! error TS1146: Declaration expected. + ~~~~~ +!!! error TS1109: Expression expected. ~ !!! error TS2304: Cannot find name 'x'. - ~ -!!! error TS1005: ';' expected. class C2 {} @await + ~~~~~ +!!! error TS1109: Expression expected. class C3 {} - -!!! error TS1146: Declaration expected. - ~~ -!!! error TS2304: Cannot find name 'C3'. - ~ -!!! error TS1005: ';' expected. // await in member decorators should fail class C4 { @await ~~~~~ -!!! error TS2304: Cannot find name 'await'. +!!! error TS1109: Expression expected. ["foo"]() {} - ~ -!!! error TS1005: ';' expected. - ~ -!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. - ~ -!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. - ~ -!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. } - ~ -!!! error TS1109: Expression expected. class C5 { @await(1) ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~ -!!! error TS1005: ';' expected. +!!! error TS1109: Expression expected. ["foo"]() {} } class C6 { @@ -125,34 +96,12 @@ tests/cases/conformance/externalModules/topLevelAwaitErrors.1.ts(43,1): error TS class C7 { method1(@await [x]) {} ~~~~~ -!!! error TS2304: Cannot find name 'await'. - ~ -!!! error TS1005: ')' expected. - ~ -!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. - ~ -!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. +!!! error TS1109: Expression expected. method2(@await(1) [x]) {} - ~~~~~~~ -!!! error TS2304: Cannot find name 'method2'. - ~ -!!! error TS1135: Argument expression expected. - ~ -!!! error TS2304: Cannot find name 'x'. - ~ -!!! error TS1005: ';' expected. + ~~~~~ +!!! error TS1109: Expression expected. method3(@(await) [x]) {} - ~~~~~~~ -!!! error TS2304: Cannot find name 'method3'. - ~ -!!! error TS1135: Argument expression expected. ~ !!! error TS1109: Expression expected. - ~ -!!! error TS2304: Cannot find name 'x'. - ~ -!!! error TS1005: ';' expected. } - ~ -!!! error TS1109: Expression expected. \ No newline at end of file diff --git a/tests/baselines/reference/topLevelAwaitErrors.1.js b/tests/baselines/reference/topLevelAwaitErrors.1.js index b535c95dca4eb..175321a0513f8 100644 --- a/tests/baselines/reference/topLevelAwaitErrors.1.js +++ b/tests/baselines/reference/topLevelAwaitErrors.1.js @@ -51,7 +51,7 @@ await , string > (1); // reparse tagged template as invalid await should error await , string > ``; // reparse class extends clause should fail -class C extends await { +class C extends string { } // await in class decorators should fail let C1 = class C1 { @@ -59,27 +59,27 @@ let C1 = class C1 { C1 = __decorate([ (await ) ], C1); -x; -; -class C2 { -} -C3; -{ } +let C2 = class C2 { +}; +C2 = __decorate([ + (x) +], C2); +let C3 = class C3 { +}; +C3 = __decorate([ +], C3); // await in member decorators should fail class C4 { - "foo"; + ["foo"]() { } } __decorate([ - await -], C4.prototype, "foo", void 0); -; +], C4.prototype, "foo", null); class C5 { - 1; ["foo"]() { } } __decorate([ - await -], C5.prototype, 1, void 0); + (1) +], C5.prototype, "foo", null); class C6 { ["foo"]() { } } @@ -88,13 +88,17 @@ __decorate([ ], C6.prototype, "foo", null); // await in parameter decorators should fail class C7 { + method1([x]) { } + method2([x]) { } + method3([x]) { } } __decorate([ - __param(0, await) + __param(0, ) ], C7.prototype, "method1", null); -method2(await (1)[x]); -{ } -method3((await )[x]); -{ } -; +__decorate([ + __param(0, (1)) +], C7.prototype, "method2", null); +__decorate([ + __param(0, (await )) +], C7.prototype, "method3", null); export {}; diff --git a/tests/baselines/reference/topLevelAwaitErrors.1.symbols b/tests/baselines/reference/topLevelAwaitErrors.1.symbols index 0384c15c740e2..c414127bbe691 100644 --- a/tests/baselines/reference/topLevelAwaitErrors.1.symbols +++ b/tests/baselines/reference/topLevelAwaitErrors.1.symbols @@ -20,10 +20,11 @@ class C1 {} @await(x) class C2 {} ->C2 : Symbol(C2, Decl(topLevelAwaitErrors.1.ts, 17, 9)) +>C2 : Symbol(C2, Decl(topLevelAwaitErrors.1.ts, 15, 11)) @await class C3 {} +>C3 : Symbol(C3, Decl(topLevelAwaitErrors.1.ts, 18, 11)) // await in member decorators should fail class C4 { @@ -31,17 +32,16 @@ class C4 { @await ["foo"]() {} +>["foo"] : Symbol(C4["foo"], Decl(topLevelAwaitErrors.1.ts, 24, 10)) >"foo" : Symbol(C4["foo"], Decl(topLevelAwaitErrors.1.ts, 24, 10)) } class C5 { >C5 : Symbol(C5, Decl(topLevelAwaitErrors.1.ts, 27, 1)) @await(1) ->1 : Symbol(C5[1], Decl(topLevelAwaitErrors.1.ts, 28, 10)) - ["foo"]() {} ->["foo"] : Symbol(C5["foo"], Decl(topLevelAwaitErrors.1.ts, 29, 13)) ->"foo" : Symbol(C5["foo"], Decl(topLevelAwaitErrors.1.ts, 29, 13)) +>["foo"] : Symbol(C5["foo"], Decl(topLevelAwaitErrors.1.ts, 28, 10)) +>"foo" : Symbol(C5["foo"], Decl(topLevelAwaitErrors.1.ts, 28, 10)) } class C6 { >C6 : Symbol(C6, Decl(topLevelAwaitErrors.1.ts, 31, 1)) @@ -58,9 +58,14 @@ class C7 { method1(@await [x]) {} >method1 : Symbol(C7.method1, Decl(topLevelAwaitErrors.1.ts, 38, 10)) ->x : Symbol(x, Decl(topLevelAwaitErrors.1.ts, 39, 12)) +>x : Symbol(x, Decl(topLevelAwaitErrors.1.ts, 39, 20)) method2(@await(1) [x]) {} +>method2 : Symbol(C7.method2, Decl(topLevelAwaitErrors.1.ts, 39, 26)) +>x : Symbol(x, Decl(topLevelAwaitErrors.1.ts, 40, 23)) + method3(@(await) [x]) {} +>method3 : Symbol(C7.method3, Decl(topLevelAwaitErrors.1.ts, 40, 29)) +>x : Symbol(x, Decl(topLevelAwaitErrors.1.ts, 41, 22)) } diff --git a/tests/baselines/reference/topLevelAwaitErrors.1.types b/tests/baselines/reference/topLevelAwaitErrors.1.types index 3ce38b5cca110..7e8efc49dce7f 100644 --- a/tests/baselines/reference/topLevelAwaitErrors.1.types +++ b/tests/baselines/reference/topLevelAwaitErrors.1.types @@ -32,7 +32,7 @@ await ``; // reparse class extends clause should fail class C extends await { >C : C ->await : any +>string : any } // await in class decorators should fail @@ -45,37 +45,37 @@ class C1 {} >C1 : C1 @await(x) ->await : any ->x : any +>await(x) : any > : any +>x : any class C2 {} >C2 : C2 @await ->await : any +> : any class C3 {} ->C3 : any +>C3 : C3 // await in member decorators should fail class C4 { >C4 : C4 @await ->await : any +> : any ["foo"]() {} ->"foo" : any +>["foo"] : () => void +>"foo" : "foo" } -> : any - class C5 { >C5 : C5 @await(1) ->await : any ->1 : any +>await(1) : any +> : any +>1 : 1 ["foo"]() {} >["foo"] : () => void @@ -99,27 +99,22 @@ class C7 { >C7 : C7 method1(@await [x]) {} ->method1 : (x: any) => any ->await : any +>method1 : ([x]: [any]) => void +> : any >x : any method2(@await(1) [x]) {} ->method2(@await(1) [x]) : any ->method2 : any ->await(1) [x] : any ->(1) [x] : any ->(1) : 1 +>method2 : ([x]: [any]) => void +>await(1) : any +> : any >1 : 1 >x : any method3(@(await) [x]) {} ->method3(@(await) [x]) : any ->method3 : any ->(await) [x] : any +>method3 : ([x]: [any]) => void >(await) : any >await : any > : any >x : any } -> : any From 23cd5e97023a3798e81520d4a9b0285736d2b240 Mon Sep 17 00:00:00 2001 From: kingwl Date: Mon, 21 Jun 2021 15:48:53 +0800 Subject: [PATCH 4/4] Add some comments --- src/compiler/parser.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index fb82b4d603341..4ba7f4fad5804 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1501,6 +1501,8 @@ namespace ts { if (token() === SyntaxKind.Identifier) { return true; } + + // `let await`/`let yield` in [Yield] or [Await] are allowed here and disallowed in the binder. return token() > SyntaxKind.LastReservedWord; }