From d532628b977c0d9496c21588c56ba2b9fec520f2 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Wed, 15 Jun 2022 07:37:35 -0700 Subject: [PATCH 1/2] Properly re-scan '>' token in type argument list determination logic --- src/compiler/parser.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 76e2fe0e351f7..e6a0183f36b6e 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -5764,10 +5764,11 @@ namespace ts { nextToken(); const typeArguments = parseDelimitedList(ParsingContext.TypeArguments, parseType); - if (!parseExpected(SyntaxKind.GreaterThanToken)) { + if (reScanGreaterToken() !== SyntaxKind.GreaterThanToken) { // If it doesn't have the closing `>` then it's definitely not an type argument list. return undefined; } + nextToken(); // We successfully parsed a type argument list. The next token determines whether we want to // treat it as such. If the type argument list is followed by `(` or a template literal, as in From f1f6af80a2a212fbf879ee82ac31c24f5890951c Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Wed, 15 Jun 2022 07:44:39 -0700 Subject: [PATCH 2/2] Add regression test --- .../instantiationExpressionErrors.errors.txt | 6 ++++ .../instantiationExpressionErrors.js | 14 ++++++++ .../instantiationExpressionErrors.symbols | 26 +++++++++++++++ .../instantiationExpressionErrors.types | 33 +++++++++++++++++++ .../instantiationExpressionErrors.ts | 6 ++++ 5 files changed, 85 insertions(+) diff --git a/tests/baselines/reference/instantiationExpressionErrors.errors.txt b/tests/baselines/reference/instantiationExpressionErrors.errors.txt index 2745416807fc8..8a725af6b4485 100644 --- a/tests/baselines/reference/instantiationExpressionErrors.errors.txt +++ b/tests/baselines/reference/instantiationExpressionErrors.errors.txt @@ -140,4 +140,10 @@ tests/cases/conformance/types/typeParameters/typeArgumentLists/instantiationExpr protected specialFoo = f protected bar = 123 } + + // Repro from #49551 + + const enum MyVer { v1 = 1, v2 = 2 } + let ver = 21 + const a = ver < (MyVer.v1 >= MyVer.v2 ? MyVer.v1 : MyVer.v2) \ No newline at end of file diff --git a/tests/baselines/reference/instantiationExpressionErrors.js b/tests/baselines/reference/instantiationExpressionErrors.js index c29046d913e85..de16b60071be2 100644 --- a/tests/baselines/reference/instantiationExpressionErrors.js +++ b/tests/baselines/reference/instantiationExpressionErrors.js @@ -96,6 +96,12 @@ class C4 { protected specialFoo = f protected bar = 123 } + +// Repro from #49551 + +const enum MyVer { v1 = 1, v2 = 2 } +let ver = 21 +const a = ver < (MyVer.v1 >= MyVer.v2 ? MyVer.v1 : MyVer.v2) //// [instantiationExpressionErrors.js] @@ -179,6 +185,8 @@ var C4 = /** @class */ (function () { } return C4; }()); +var ver = 21; +var a = ver < (1 /* MyVer.v1 */ >= 2 /* MyVer.v2 */ ? 1 /* MyVer.v1 */ : 2 /* MyVer.v2 */); //// [instantiationExpressionErrors.d.ts] @@ -283,3 +291,9 @@ declare class C4 { }; protected bar: number; } +declare const enum MyVer { + v1 = 1, + v2 = 2 +} +declare let ver: number; +declare const a: boolean; diff --git a/tests/baselines/reference/instantiationExpressionErrors.symbols b/tests/baselines/reference/instantiationExpressionErrors.symbols index 86f97631ea8db..eca85200cbd25 100644 --- a/tests/baselines/reference/instantiationExpressionErrors.symbols +++ b/tests/baselines/reference/instantiationExpressionErrors.symbols @@ -239,3 +239,29 @@ class C4 { >bar : Symbol(C4.bar, Decl(instantiationExpressionErrors.ts, 94, 36)) } +// Repro from #49551 + +const enum MyVer { v1 = 1, v2 = 2 } +>MyVer : Symbol(MyVer, Decl(instantiationExpressionErrors.ts, 96, 1)) +>v1 : Symbol(MyVer.v1, Decl(instantiationExpressionErrors.ts, 100, 18)) +>v2 : Symbol(MyVer.v2, Decl(instantiationExpressionErrors.ts, 100, 26)) + +let ver = 21 +>ver : Symbol(ver, Decl(instantiationExpressionErrors.ts, 101, 3)) + +const a = ver < (MyVer.v1 >= MyVer.v2 ? MyVer.v1 : MyVer.v2) +>a : Symbol(a, Decl(instantiationExpressionErrors.ts, 102, 5)) +>ver : Symbol(ver, Decl(instantiationExpressionErrors.ts, 101, 3)) +>MyVer.v1 : Symbol(MyVer.v1, Decl(instantiationExpressionErrors.ts, 100, 18)) +>MyVer : Symbol(MyVer, Decl(instantiationExpressionErrors.ts, 96, 1)) +>v1 : Symbol(MyVer.v1, Decl(instantiationExpressionErrors.ts, 100, 18)) +>MyVer.v2 : Symbol(MyVer.v2, Decl(instantiationExpressionErrors.ts, 100, 26)) +>MyVer : Symbol(MyVer, Decl(instantiationExpressionErrors.ts, 96, 1)) +>v2 : Symbol(MyVer.v2, Decl(instantiationExpressionErrors.ts, 100, 26)) +>MyVer.v1 : Symbol(MyVer.v1, Decl(instantiationExpressionErrors.ts, 100, 18)) +>MyVer : Symbol(MyVer, Decl(instantiationExpressionErrors.ts, 96, 1)) +>v1 : Symbol(MyVer.v1, Decl(instantiationExpressionErrors.ts, 100, 18)) +>MyVer.v2 : Symbol(MyVer.v2, Decl(instantiationExpressionErrors.ts, 100, 26)) +>MyVer : Symbol(MyVer, Decl(instantiationExpressionErrors.ts, 96, 1)) +>v2 : Symbol(MyVer.v2, Decl(instantiationExpressionErrors.ts, 100, 26)) + diff --git a/tests/baselines/reference/instantiationExpressionErrors.types b/tests/baselines/reference/instantiationExpressionErrors.types index 9b77ad997aee0..c1296a6e8bf19 100644 --- a/tests/baselines/reference/instantiationExpressionErrors.types +++ b/tests/baselines/reference/instantiationExpressionErrors.types @@ -325,3 +325,36 @@ class C4 { >123 : 123 } +// Repro from #49551 + +const enum MyVer { v1 = 1, v2 = 2 } +>MyVer : MyVer +>v1 : MyVer.v1 +>1 : 1 +>v2 : MyVer.v2 +>2 : 2 + +let ver = 21 +>ver : number +>21 : 21 + +const a = ver < (MyVer.v1 >= MyVer.v2 ? MyVer.v1 : MyVer.v2) +>a : boolean +>ver < (MyVer.v1 >= MyVer.v2 ? MyVer.v1 : MyVer.v2) : boolean +>ver : number +>(MyVer.v1 >= MyVer.v2 ? MyVer.v1 : MyVer.v2) : MyVer +>MyVer.v1 >= MyVer.v2 ? MyVer.v1 : MyVer.v2 : MyVer +>MyVer.v1 >= MyVer.v2 : boolean +>MyVer.v1 : MyVer.v1 +>MyVer : typeof MyVer +>v1 : MyVer.v1 +>MyVer.v2 : MyVer.v2 +>MyVer : typeof MyVer +>v2 : MyVer.v2 +>MyVer.v1 : MyVer.v1 +>MyVer : typeof MyVer +>v1 : MyVer.v1 +>MyVer.v2 : MyVer.v2 +>MyVer : typeof MyVer +>v2 : MyVer.v2 + diff --git a/tests/cases/conformance/types/typeParameters/typeArgumentLists/instantiationExpressionErrors.ts b/tests/cases/conformance/types/typeParameters/typeArgumentLists/instantiationExpressionErrors.ts index 83e8f392830c3..384b29ec7769b 100644 --- a/tests/cases/conformance/types/typeParameters/typeArgumentLists/instantiationExpressionErrors.ts +++ b/tests/cases/conformance/types/typeParameters/typeArgumentLists/instantiationExpressionErrors.ts @@ -98,3 +98,9 @@ class C4 { protected specialFoo = f protected bar = 123 } + +// Repro from #49551 + +const enum MyVer { v1 = 1, v2 = 2 } +let ver = 21 +const a = ver < (MyVer.v1 >= MyVer.v2 ? MyVer.v1 : MyVer.v2)