From c8f2405456edf7ec09c80feb9d18876c4571d0e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Wed, 26 Jun 2024 21:40:07 +0200 Subject: [PATCH] Fixed an issue with top-level for-await loops not being allowed with `--module preserve` (#59042) --- src/compiler/checker.ts | 1 + ...veTopLevelAwait1(target=es2016).errors.txt | 14 +++++++++++ ...serveTopLevelAwait1(target=es2016).symbols | 13 +++++++++++ ...reserveTopLevelAwait1(target=es2016).types | 23 +++++++++++++++++++ ...serveTopLevelAwait1(target=esnext).symbols | 13 +++++++++++ ...reserveTopLevelAwait1(target=esnext).types | 22 ++++++++++++++++++ .../compiler/modulePreserveTopLevelAwait1.ts | 8 +++++++ 7 files changed, 94 insertions(+) create mode 100644 tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).errors.txt create mode 100644 tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).symbols create mode 100644 tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).types create mode 100644 tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).symbols create mode 100644 tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).types create mode 100644 tests/cases/compiler/modulePreserveTopLevelAwait1.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 146bbc540b0..2ca07e30f28 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -51097,6 +51097,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { // fallthrough case ModuleKind.ES2022: case ModuleKind.ESNext: + case ModuleKind.Preserve: case ModuleKind.System: if (languageVersion >= ScriptTarget.ES2017) { break; diff --git a/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).errors.txt b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).errors.txt new file mode 100644 index 00000000000..2e1dbfa53b9 --- /dev/null +++ b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).errors.txt @@ -0,0 +1,14 @@ +modulePreserveTopLevelAwait1.ts(1,5): error TS1432: Top-level 'for await' loops are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', 'nodenext', or 'preserve', and the 'target' option is set to 'es2017' or higher. +modulePreserveTopLevelAwait1.ts(2,1): error TS1378: Top-level 'await' expressions are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', 'nodenext', or 'preserve', and the 'target' option is set to 'es2017' or higher. + + +==== modulePreserveTopLevelAwait1.ts (2 errors) ==== + for await (const x of []) {} + ~~~~~ +!!! error TS1432: Top-level 'for await' loops are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', 'nodenext', or 'preserve', and the 'target' option is set to 'es2017' or higher. + await Promise.resolve(); + ~~~~~ +!!! error TS1378: Top-level 'await' expressions are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', 'nodenext', or 'preserve', and the 'target' option is set to 'es2017' or higher. + + export {}; + \ No newline at end of file diff --git a/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).symbols b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).symbols new file mode 100644 index 00000000000..e34950bb843 --- /dev/null +++ b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).symbols @@ -0,0 +1,13 @@ +//// [tests/cases/compiler/modulePreserveTopLevelAwait1.ts] //// + +=== modulePreserveTopLevelAwait1.ts === +for await (const x of []) {} +>x : Symbol(x, Decl(modulePreserveTopLevelAwait1.ts, 0, 16)) + +await Promise.resolve(); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + +export {}; + diff --git a/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).types b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).types new file mode 100644 index 00000000000..ad0f7ca92f3 --- /dev/null +++ b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=es2016).types @@ -0,0 +1,23 @@ +//// [tests/cases/compiler/modulePreserveTopLevelAwait1.ts] //// + +=== modulePreserveTopLevelAwait1.ts === +for await (const x of []) {} +>x : any +> : ^^^ +>[] : undefined[] +> : ^^^^^^^^^^^ + +await Promise.resolve(); +>await Promise.resolve() : void +> : ^^^^ +>Promise.resolve() : Promise +> : ^^^^^^^^^^^^^ +>Promise.resolve : { (): Promise; (value: T): Promise>; (value: T | PromiseLike): Promise>; } +> : ^^^^^^ ^^^ ^^ ^^ ^^^ ^^^ ^^ ^^ ^^^ ^^^ +>Promise : PromiseConstructor +> : ^^^^^^^^^^^^^^^^^^ +>resolve : { (): Promise; (value: T): Promise>; (value: T | PromiseLike): Promise>; } +> : ^^^^^^ ^^^ ^^ ^^ ^^^ ^^^ ^^ ^^ ^^^ ^^^ + +export {}; + diff --git a/tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).symbols b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).symbols new file mode 100644 index 00000000000..f85c12370b4 --- /dev/null +++ b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).symbols @@ -0,0 +1,13 @@ +//// [tests/cases/compiler/modulePreserveTopLevelAwait1.ts] //// + +=== modulePreserveTopLevelAwait1.ts === +for await (const x of []) {} +>x : Symbol(x, Decl(modulePreserveTopLevelAwait1.ts, 0, 16)) + +await Promise.resolve(); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + +export {}; + diff --git a/tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).types b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).types new file mode 100644 index 00000000000..16729eb0603 --- /dev/null +++ b/tests/baselines/reference/modulePreserveTopLevelAwait1(target=esnext).types @@ -0,0 +1,22 @@ +//// [tests/cases/compiler/modulePreserveTopLevelAwait1.ts] //// + +=== modulePreserveTopLevelAwait1.ts === +for await (const x of []) {} +>x : any +>[] : undefined[] +> : ^^^^^^^^^^^ + +await Promise.resolve(); +>await Promise.resolve() : void +> : ^^^^ +>Promise.resolve() : Promise +> : ^^^^^^^^^^^^^ +>Promise.resolve : { (): Promise; (value: T): Promise>; (value: T | PromiseLike): Promise>; } +> : ^^^^^^ ^^^ ^^ ^^ ^^^ ^^^ ^^ ^^ ^^^ ^^^ +>Promise : PromiseConstructor +> : ^^^^^^^^^^^^^^^^^^ +>resolve : { (): Promise; (value: T): Promise>; (value: T | PromiseLike): Promise>; } +> : ^^^^^^ ^^^ ^^ ^^ ^^^ ^^^ ^^ ^^ ^^^ ^^^ + +export {}; + diff --git a/tests/cases/compiler/modulePreserveTopLevelAwait1.ts b/tests/cases/compiler/modulePreserveTopLevelAwait1.ts new file mode 100644 index 00000000000..16da28db4a0 --- /dev/null +++ b/tests/cases/compiler/modulePreserveTopLevelAwait1.ts @@ -0,0 +1,8 @@ +// @module: preserve +// @target: es2016, esnext +// @noEmit: true + +for await (const x of []) {} +await Promise.resolve(); + +export {};