Skip to content

Commit 89f0f78

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

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

src/parser.ts

+17
Original file line numberDiff line numberDiff line change
@@ -4278,6 +4278,23 @@ 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)
4289+
) {
4290+
// detect Expr '<' Expr '>' '(' ')'
4291+
// except Expr '<' Expr '>' '(' ')' '=>'
4292+
this.error(DiagnosticCode.Type_expected, next.range);
4293+
tn.discard(state);
4294+
return null;
4295+
}
4296+
tn.reset(state);
4297+
tn.discard(state);
42814298
expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));
42824299
break;
42834300
}

tests/parser/diagnose-generic.ts

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

0 commit comments

Comments
 (0)