From 388f0853847e6dc53a307f8f10245be5b091657d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Wed, 26 Jun 2024 21:19:06 +0200 Subject: [PATCH] Fixed an issue with top-level for-await loops not being allowed with `--module preserve` --- 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 146bbc540b006..2ca07e30f287b 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 0000000000000..2e1dbfa53b9c9 --- /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 0000000000000..e34950bb8432c --- /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 0000000000000..ad0f7ca92f387 --- /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 0000000000000..f85c12370b472 --- /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 0000000000000..16729eb060358 --- /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 0000000000000..16da28db4a006 --- /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 {};