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 {};