diff --git a/src/parser.ts b/src/parser.ts index 58050e837e..a1339d12c7 100644 --- a/src/parser.ts +++ b/src/parser.ts @@ -4278,6 +4278,23 @@ export class Parser extends DiagnosticEmitter { case Token.In: { let next = this.parseExpression(tn, nextPrecedence + 1); if (!next) return null; + let state = tn.mark(); + if ( + expr.kind != NodeKind.Literal && + token == Token.LessThan && + tn.skip(Token.GreaterThan) && + tn.skip(Token.OpenParen) && + tn.skip(Token.CloseParen) && + !tn.skip(Token.Equals_GreaterThan) + ) { + // detect Expr '<' Expr '>' '(' ')' + // except Expr '<' Expr '>' '(' ')' '=>' + this.error(DiagnosticCode.Type_expected, next.range); + tn.discard(state); + return null; + } + tn.reset(state); + tn.discard(state); expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos)); break; } diff --git a/tests/parser/diagnose-generic.ts b/tests/parser/diagnose-generic.ts new file mode 100644 index 0000000000..73032ec0d4 --- /dev/null +++ b/tests/parser/diagnose-generic.ts @@ -0,0 +1,9 @@ +true(true); +a<12345>() => {}; +1 < 2,3,4 > (1,2,3); +{ + a<12345>(); +} +{ + 1 + a<12345>() + 1; +} diff --git a/tests/parser/diagnose-generic.ts.fixture.ts b/tests/parser/diagnose-generic.ts.fixture.ts new file mode 100644 index 0000000000..d55412a379 --- /dev/null +++ b/tests/parser/diagnose-generic.ts.fixture.ts @@ -0,0 +1,7 @@ +true < false > (true); +a < 12345 > () => {}; +1 < 2,3,4 > (1,2,3); +{} +{} +// ERROR 1110: "Type expected." in diagnose-generic.ts(5,5+5) +// ERROR 1110: "Type expected." in diagnose-generic.ts(8,9+5)