diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a5c161abae051..54ad1d96c53d2 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -52790,17 +52790,28 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker { } const blockScopeFlags = declarationList.flags & NodeFlags.BlockScoped; - if ((blockScopeFlags === NodeFlags.Using || blockScopeFlags === NodeFlags.AwaitUsing) && isForInStatement(declarationList.parent)) { - return grammarErrorOnNode( - declarationList, - blockScopeFlags === NodeFlags.Using ? - Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_using_declaration : - Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_an_await_using_declaration, - ); - } + if (blockScopeFlags === NodeFlags.Using || blockScopeFlags === NodeFlags.AwaitUsing) { + if (isForInStatement(declarationList.parent)) { + return grammarErrorOnNode( + declarationList, + blockScopeFlags === NodeFlags.Using ? + Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_using_declaration : + Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_an_await_using_declaration, + ); + } - if (blockScopeFlags === NodeFlags.AwaitUsing) { - return checkAwaitGrammar(declarationList); + if (declarationList.flags & NodeFlags.Ambient) { + return grammarErrorOnNode( + declarationList, + blockScopeFlags === NodeFlags.Using ? + Diagnostics.using_declarations_are_not_allowed_in_ambient_contexts : + Diagnostics.await_using_declarations_are_not_allowed_in_ambient_contexts, + ); + } + + if (blockScopeFlags === NodeFlags.AwaitUsing) { + return checkAwaitGrammar(declarationList); + } } return false; diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index d137bd53fd1cd..45d7d5ddb3626 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1837,6 +1837,14 @@ "category": "Error", "code": 1544 }, + "'using' declarations are not allowed in ambient contexts.": { + "category": "Error", + "code": 1545 + }, + "'await using' declarations are not allowed in ambient contexts.": { + "category": "Error", + "code": 1546 + }, "The types of '{0}' are incompatible between these types.": { "category": "Error", diff --git a/tests/baselines/reference/awaitUsingDeclarations.16.errors.txt b/tests/baselines/reference/awaitUsingDeclarations.16.errors.txt new file mode 100644 index 0000000000000..9cd24341b297c --- /dev/null +++ b/tests/baselines/reference/awaitUsingDeclarations.16.errors.txt @@ -0,0 +1,24 @@ +awaitUsingDeclarations.16.ts(2,5): error TS1546: 'await using' declarations are not allowed in ambient contexts. +awaitUsingDeclarations.16.ts(3,5): error TS1546: 'await using' declarations are not allowed in ambient contexts. +awaitUsingDeclarations.16.ts(6,5): error TS1546: 'await using' declarations are not allowed in ambient contexts. +awaitUsingDeclarations.16.ts(7,5): error TS1546: 'await using' declarations are not allowed in ambient contexts. + + +==== awaitUsingDeclarations.16.ts (4 errors) ==== + declare namespace N { + await using x: { [Symbol.asyncDispose](): Promise }; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS1546: 'await using' declarations are not allowed in ambient contexts. + await using y: null; + ~~~~~~~~~~~~~~~~~~~ +!!! error TS1546: 'await using' declarations are not allowed in ambient contexts. + } + declare module 'M' { + await using x: { [Symbol.asyncDispose](): Promise }; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS1546: 'await using' declarations are not allowed in ambient contexts. + await using y: null; + ~~~~~~~~~~~~~~~~~~~ +!!! error TS1546: 'await using' declarations are not allowed in ambient contexts. + } + \ No newline at end of file diff --git a/tests/baselines/reference/awaitUsingDeclarations.16.js b/tests/baselines/reference/awaitUsingDeclarations.16.js new file mode 100644 index 0000000000000..4f9c01e8e2895 --- /dev/null +++ b/tests/baselines/reference/awaitUsingDeclarations.16.js @@ -0,0 +1,14 @@ +//// [tests/cases/conformance/statements/VariableStatements/usingDeclarations/awaitUsingDeclarations.16.ts] //// + +//// [awaitUsingDeclarations.16.ts] +declare namespace N { + await using x: { [Symbol.asyncDispose](): Promise }; + await using y: null; +} +declare module 'M' { + await using x: { [Symbol.asyncDispose](): Promise }; + await using y: null; +} + + +//// [awaitUsingDeclarations.16.js] diff --git a/tests/baselines/reference/usingDeclarations.16.errors.txt b/tests/baselines/reference/usingDeclarations.16.errors.txt new file mode 100644 index 0000000000000..90514ada95dc7 --- /dev/null +++ b/tests/baselines/reference/usingDeclarations.16.errors.txt @@ -0,0 +1,24 @@ +usingDeclarations.16.ts(2,5): error TS1545: 'using' declarations are not allowed in ambient contexts. +usingDeclarations.16.ts(3,5): error TS1545: 'using' declarations are not allowed in ambient contexts. +usingDeclarations.16.ts(6,5): error TS1545: 'using' declarations are not allowed in ambient contexts. +usingDeclarations.16.ts(7,5): error TS1545: 'using' declarations are not allowed in ambient contexts. + + +==== usingDeclarations.16.ts (4 errors) ==== + declare namespace N { + using x: { [Symbol.dispose](): void }; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS1545: 'using' declarations are not allowed in ambient contexts. + using y: null; + ~~~~~~~~~~~~~ +!!! error TS1545: 'using' declarations are not allowed in ambient contexts. + } + declare module 'M' { + using x: { [Symbol.dispose](): void }; + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS1545: 'using' declarations are not allowed in ambient contexts. + using y: null; + ~~~~~~~~~~~~~ +!!! error TS1545: 'using' declarations are not allowed in ambient contexts. + } + \ No newline at end of file diff --git a/tests/baselines/reference/usingDeclarations.16.js b/tests/baselines/reference/usingDeclarations.16.js new file mode 100644 index 0000000000000..d59b139c2d543 --- /dev/null +++ b/tests/baselines/reference/usingDeclarations.16.js @@ -0,0 +1,14 @@ +//// [tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarations.16.ts] //// + +//// [usingDeclarations.16.ts] +declare namespace N { + using x: { [Symbol.dispose](): void }; + using y: null; +} +declare module 'M' { + using x: { [Symbol.dispose](): void }; + using y: null; +} + + +//// [usingDeclarations.16.js] diff --git a/tests/cases/conformance/statements/VariableStatements/usingDeclarations/awaitUsingDeclarations.16.ts b/tests/cases/conformance/statements/VariableStatements/usingDeclarations/awaitUsingDeclarations.16.ts new file mode 100644 index 0000000000000..867d58ae3ffde --- /dev/null +++ b/tests/cases/conformance/statements/VariableStatements/usingDeclarations/awaitUsingDeclarations.16.ts @@ -0,0 +1,13 @@ +// @target: esnext +// @module: esnext +// @lib: esnext +// @noTypesAndSymbols: true + +declare namespace N { + await using x: { [Symbol.asyncDispose](): Promise }; + await using y: null; +} +declare module 'M' { + await using x: { [Symbol.asyncDispose](): Promise }; + await using y: null; +} diff --git a/tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarations.16.ts b/tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarations.16.ts new file mode 100644 index 0000000000000..570d8c22990ce --- /dev/null +++ b/tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarations.16.ts @@ -0,0 +1,13 @@ +// @target: esnext +// @module: esnext +// @lib: esnext +// @noTypesAndSymbols: true + +declare namespace N { + using x: { [Symbol.dispose](): void }; + using y: null; +} +declare module 'M' { + using x: { [Symbol.dispose](): void }; + using y: null; +}