Skip to content

Commit 341def6

Browse files
committed
fix: improve diagnose for invalid generic function call
Fixes AssemblyScript#2780
1 parent af2a250 commit 341def6

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

src/parser.ts

+18
Original file line numberDiff line numberDiff line change
@@ -4278,6 +4278,24 @@ export class Parser extends DiagnosticEmitter {
42784278
case Token.In: {
42794279
let next = this.parseExpression(tn, nextPrecedence + 1);
42804280
if (!next) return null;
4281+
let state = tn.mark();
4282+
if (
4283+
expr.kind != NodeKind.Literal &&
4284+
token == Token.LessThan &&
4285+
tn.skip(Token.GreaterThan) &&
4286+
tn.skip(Token.OpenParen) &&
4287+
tn.skip(Token.CloseParen) &&
4288+
!(tn.skip(Token.Equals_GreaterThan) || tn.skip(Token.Colon))
4289+
) {
4290+
// detect Expr '<' Expr '>' '(' ')'
4291+
// except Expr '<' Expr '>' '(' ')' '=>'
4292+
// except Expr '<' Expr '>' '(' ')' ':'
4293+
this.error(DiagnosticCode.Type_expected, next.range);
4294+
tn.discard(state);
4295+
return null;
4296+
}
4297+
tn.reset(state);
4298+
tn.discard(state);
42814299
expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));
42824300
break;
42834301
}

tests/parser/diagnose-generic.ts

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
true<false>(true);
2+
a<12345>() => {};
3+
a<12345>() : void => {};
4+
1 < 2,3,4 > (1,2,3);
5+
{
6+
a<12345>();
7+
}
8+
{
9+
1 + a<12345>() + 1;
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
true < false > (true);
2+
a < 12345 > () => {};
3+
a < 12345 > (): void => {};
4+
1 < 2,3,4 > (1,2,3);
5+
{}
6+
{}
7+
// ERROR 1110: "Type expected." in diagnose-generic.ts(6,5+5)
8+
// ERROR 1110: "Type expected." in diagnose-generic.ts(9,9+5)

0 commit comments

Comments
 (0)