@@ -1043,8 +1043,9 @@ export class Parser extends DiagnosticEmitter {
1043
1043
1044
1044
// at '<': TypeParameter (',' TypeParameter)* '>'
1045
1045
1046
- var typeParameters : TypeParameterNode [ ] | null = null ;
1046
+ var typeParameters = new Array < TypeParameterNode > ( ) ;
1047
1047
var seenOptional = false ;
1048
+ var start = tn . tokenPos ;
1048
1049
while ( ! tn . skip ( Token . GREATERTHAN ) ) {
1049
1050
let typeParameter = this . parseTypeParameter ( tn ) ;
1050
1051
if ( ! typeParameter ) return null ;
@@ -1057,8 +1058,7 @@ export class Parser extends DiagnosticEmitter {
1057
1058
) ;
1058
1059
typeParameter . defaultType = null ;
1059
1060
}
1060
- if ( ! typeParameters ) typeParameters = [ typeParameter ] ;
1061
- else typeParameters . push ( typeParameter ) ;
1061
+ typeParameters . push ( typeParameter ) ;
1062
1062
if ( ! tn . skip ( Token . COMMA ) ) {
1063
1063
if ( tn . skip ( Token . GREATERTHAN ) ) {
1064
1064
break ;
@@ -1071,10 +1071,10 @@ export class Parser extends DiagnosticEmitter {
1071
1071
}
1072
1072
}
1073
1073
}
1074
- if ( ! ( typeParameters && typeParameters . length ) ) {
1074
+ if ( ! typeParameters . length ) {
1075
1075
this . error (
1076
1076
DiagnosticCode . Type_parameter_list_cannot_be_empty ,
1077
- tn . range ( )
1077
+ tn . range ( start , tn . pos )
1078
1078
) ; // recoverable
1079
1079
}
1080
1080
return typeParameters ;
@@ -3618,7 +3618,8 @@ export class Parser extends DiagnosticEmitter {
3618
3618
3619
3619
var state = tn . mark ( ) ;
3620
3620
if ( ! tn . skip ( Token . LESSTHAN ) ) return null ;
3621
- var typeArguments : TypeNode [ ] | null = null ;
3621
+ var start = tn . tokenPos ;
3622
+ var typeArguments = new Array < TypeNode > ( ) ;
3622
3623
do {
3623
3624
if ( tn . peek ( ) === Token . GREATERTHAN ) {
3624
3625
break ;
@@ -3628,11 +3629,19 @@ export class Parser extends DiagnosticEmitter {
3628
3629
tn . reset ( state ) ;
3629
3630
return null ;
3630
3631
}
3631
- if ( ! typeArguments ) typeArguments = [ type ] ;
3632
- else typeArguments . push ( type ) ;
3632
+ typeArguments . push ( type ) ;
3633
3633
} while ( tn . skip ( Token . COMMA ) ) ;
3634
- if ( tn . skip ( Token . GREATERTHAN ) && tn . skip ( Token . OPENPAREN ) ) {
3635
- return typeArguments ;
3634
+ if ( tn . skip ( Token . GREATERTHAN ) ) {
3635
+ let end = tn . pos ;
3636
+ if ( tn . skip ( Token . OPENPAREN ) ) {
3637
+ if ( ! typeArguments . length ) {
3638
+ this . error (
3639
+ DiagnosticCode . Type_argument_list_cannot_be_empty ,
3640
+ tn . range ( start , end )
3641
+ ) ;
3642
+ }
3643
+ return typeArguments ;
3644
+ }
3636
3645
}
3637
3646
tn . reset ( state ) ;
3638
3647
return null ;
0 commit comments