From 5068c2ed5cbdfad39bbd69963ceaf9321573d50c Mon Sep 17 00:00:00 2001 From: Oleksandr Tarasiuk Date: Mon, 26 May 2025 01:03:48 +0300 Subject: [PATCH 1/3] fix(61747): fix parsing of 'using of' in for loops to follow spec --- src/compiler/parser.ts | 9 ++++++++- .../reference/usingDeclarationsInForOf.4.errors.txt | 9 +++++++++ .../reference/usingDeclarationsInForOf.4.js | 12 ++++++++++++ .../usingDeclarations/usingDeclarationsInForOf.4.ts | 7 +++++++ 4 files changed, 36 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 8c69cccba1282..77af624309898 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -7328,9 +7328,16 @@ namespace Parser { return nextTokenIsBindingIdentifierOrStartOfDestructuringOnSameLine(/*disallowOf*/ true); } + function nextTokenIsEqualsOrSemicolonToken() { + nextToken(); + return token() === SyntaxKind.EqualsToken || token() === SyntaxKind.SemicolonToken; + } + function nextTokenIsBindingIdentifierOrStartOfDestructuringOnSameLine(disallowOf?: boolean) { nextToken(); - if (disallowOf && token() === SyntaxKind.OfKeyword) return false; + if (disallowOf && token() === SyntaxKind.OfKeyword) { + return lookAhead(nextTokenIsEqualsOrSemicolonToken); + } 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 0000000000000..f8bed87144569 --- /dev/null +++ b/tests/baselines/reference/usingDeclarationsInForOf.4.errors.txt @@ -0,0 +1,9 @@ +usingDeclarationsInForOf.4.ts(2,12): error TS1155: 'using' declarations must be initialized. + + +==== usingDeclarationsInForOf.4.ts (1 errors) ==== + for (using of = 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 0000000000000..969dc25e2691e --- /dev/null +++ b/tests/baselines/reference/usingDeclarationsInForOf.4.js @@ -0,0 +1,12 @@ +//// [tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarationsInForOf.4.ts] //// + +//// [usingDeclarationsInForOf.4.ts] +for (using of = null;;) break; +for (using of;;) break; + + +//// [usingDeclarationsInForOf.4.js] +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 0000000000000..b0b64fa1382dc --- /dev/null +++ b/tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarationsInForOf.4.ts @@ -0,0 +1,7 @@ +// @target: esnext +// @module: esnext +// @lib: esnext +// @noTypesAndSymbols: true + +for (using of = null;;) break; +for (using of;;) break; From 3ef51f53e00598f2e1cb6c2fea64d89812882aa8 Mon Sep 17 00:00:00 2001 From: Oleksandr Tarasiuk Date: Mon, 26 May 2025 16:31:10 +0300 Subject: [PATCH 2/3] handle colon token --- src/compiler/parser.ts | 2 +- .../baselines/reference/usingDeclarationsInForOf.4.errors.txt | 3 ++- tests/baselines/reference/usingDeclarationsInForOf.4.js | 3 +++ .../usingDeclarations/usingDeclarationsInForOf.4.ts | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 77af624309898..271718c2c7f02 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -7330,7 +7330,7 @@ namespace Parser { function nextTokenIsEqualsOrSemicolonToken() { nextToken(); - return token() === SyntaxKind.EqualsToken || token() === SyntaxKind.SemicolonToken; + return token() === SyntaxKind.EqualsToken || token() === SyntaxKind.SemicolonToken || token() === SyntaxKind.ColonToken; } function nextTokenIsBindingIdentifierOrStartOfDestructuringOnSameLine(disallowOf?: boolean) { diff --git a/tests/baselines/reference/usingDeclarationsInForOf.4.errors.txt b/tests/baselines/reference/usingDeclarationsInForOf.4.errors.txt index f8bed87144569..2f75f6f5bebcb 100644 --- a/tests/baselines/reference/usingDeclarationsInForOf.4.errors.txt +++ b/tests/baselines/reference/usingDeclarationsInForOf.4.errors.txt @@ -1,8 +1,9 @@ -usingDeclarationsInForOf.4.ts(2,12): error TS1155: 'using' declarations must be initialized. +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. diff --git a/tests/baselines/reference/usingDeclarationsInForOf.4.js b/tests/baselines/reference/usingDeclarationsInForOf.4.js index 969dc25e2691e..f16eec711487d 100644 --- a/tests/baselines/reference/usingDeclarationsInForOf.4.js +++ b/tests/baselines/reference/usingDeclarationsInForOf.4.js @@ -2,10 +2,13 @@ //// [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;;) diff --git a/tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarationsInForOf.4.ts b/tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarationsInForOf.4.ts index b0b64fa1382dc..359a01d2b06fd 100644 --- a/tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarationsInForOf.4.ts +++ b/tests/cases/conformance/statements/VariableStatements/usingDeclarations/usingDeclarationsInForOf.4.ts @@ -4,4 +4,5 @@ // @noTypesAndSymbols: true for (using of = null;;) break; +for (using of: null = null;;) break; for (using of;;) break; From 6abde766162501c727f37664545eefa81467a56f Mon Sep 17 00:00:00 2001 From: Oleksandr Tarasiuk Date: Tue, 27 May 2025 17:41:58 +0300 Subject: [PATCH 3/3] update helper name --- src/compiler/parser.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 271718c2c7f02..e7df125036429 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -7328,7 +7328,7 @@ namespace Parser { return nextTokenIsBindingIdentifierOrStartOfDestructuringOnSameLine(/*disallowOf*/ true); } - function nextTokenIsEqualsOrSemicolonToken() { + function nextTokenIsEqualsOrSemicolonOrColonToken() { nextToken(); return token() === SyntaxKind.EqualsToken || token() === SyntaxKind.SemicolonToken || token() === SyntaxKind.ColonToken; } @@ -7336,7 +7336,7 @@ namespace Parser { function nextTokenIsBindingIdentifierOrStartOfDestructuringOnSameLine(disallowOf?: boolean) { nextToken(); if (disallowOf && token() === SyntaxKind.OfKeyword) { - return lookAhead(nextTokenIsEqualsOrSemicolonToken); + return lookAhead(nextTokenIsEqualsOrSemicolonOrColonToken); } return (isBindingIdentifier() || token() === SyntaxKind.OpenBraceToken) && !scanner.hasPrecedingLineBreak(); }