From a591ca3fdcf056fbb70d4b4a964c8dd47bd412b4 Mon Sep 17 00:00:00 2001 From: "Oleksandr T." Date: Fri, 6 Jun 2025 02:37:40 +0300 Subject: [PATCH] fix(61747): for (using of = is incorrectly parsed (#61764) --- src/compiler/parser.ts | 9 ++++++++- .../usingDeclarationsInForOf.4.errors.txt | 10 ++++++++++ .../reference/usingDeclarationsInForOf.4.js | 15 +++++++++++++++ .../usingDeclarationsInForOf.4.ts | 8 ++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/usingDeclarationsInForOf.4.errors.txt create mode 100644 tests/baselines/reference/usingDeclarationsInForOf.4.js create mode 100644 tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarationsInForOf.4.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 8c69cccba12..e7df1250364 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -7328,9 +7328,16 @@ namespace Parser { return nextTokenIsBindingIdentifierOrStartOfDestructuringOnSameLine(/*disallowOf*/ true); } + function nextTokenIsEqualsOrSemicolonOrColonToken() { + nextToken(); + return token() === SyntaxKind.EqualsToken || token() === SyntaxKind.SemicolonToken || token() === SyntaxKind.ColonToken; + } + function nextTokenIsBindingIdentifierOrStartOfDestructuringOnSameLine(disallowOf?: boolean) { nextToken(); - if (disallowOf && token() === SyntaxKind.OfKeyword) return false; + if (disallowOf && token() === SyntaxKind.OfKeyword) { + return lookAhead(nextTokenIsEqualsOrSemicolonOrColonToken); + } return (isBindingIdentifier() || token() === SyntaxKind.OpenBraceToken) && !scanner.hasPrecedingLineBreak(); } diff --git a/tests/baselines/reference/usingDeclarationsInForOf.4.errors.txt b/tests/baselines/reference/usingDeclarationsInForOf.4.errors.txt new file mode 100644 index 00000000000..2f75f6f5beb --- /dev/null +++ b/tests/baselines/reference/usingDeclarationsInForOf.4.errors.txt @@ -0,0 +1,10 @@ +usingDeclarationsInForOf.4.ts(3,12): error TS1155: 'using' declarations must be initialized. + + +==== usingDeclarationsInForOf.4.ts (1 errors) ==== + for (using of = null;;) break; + for (using of: null = null;;) break; + for (using of;;) break; + ~~ +!!! error TS1155: 'using' declarations must be initialized. + \ No newline at end of file diff --git a/tests/baselines/reference/usingDeclarationsInForOf.4.js b/tests/baselines/reference/usingDeclarationsInForOf.4.js new file mode 100644 index 00000000000..f16eec71148 --- /dev/null +++ b/tests/baselines/reference/usingDeclarationsInForOf.4.js @@ -0,0 +1,15 @@ +//// [tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarationsInForOf.4.ts] //// + +//// [usingDeclarationsInForOf.4.ts] +for (using of = null;;) break; +for (using of: null = null;;) break; +for (using of;;) break; + + +//// [usingDeclarationsInForOf.4.js] +for (using of = null;;) + break; +for (using of = null;;) + break; +for (using of;;) + break; diff --git a/tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarationsInForOf.4.ts b/tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarationsInForOf.4.ts new file mode 100644 index 00000000000..359a01d2b06 --- /dev/null +++ b/tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarationsInForOf.4.ts @@ -0,0 +1,8 @@ +// @target: esnext +// @module: esnext +// @lib: esnext +// @noTypesAndSymbols: true + +for (using of = null;;) break; +for (using of: null = null;;) break; +for (using of;;) break;