@@ -1043,8 +1043,9 @@ export class Parser extends DiagnosticEmitter {
10431043
10441044 // at '<': TypeParameter (',' TypeParameter)* '>'
10451045
1046- var typeParameters : TypeParameterNode [ ] | null = null ;
1046+ var typeParameters = new Array < TypeParameterNode > ( ) ;
10471047 var seenOptional = false ;
1048+ var start = tn . tokenPos ;
10481049 while ( ! tn . skip ( Token . GREATERTHAN ) ) {
10491050 let typeParameter = this . parseTypeParameter ( tn ) ;
10501051 if ( ! typeParameter ) return null ;
@@ -1057,8 +1058,7 @@ export class Parser extends DiagnosticEmitter {
10571058 ) ;
10581059 typeParameter . defaultType = null ;
10591060 }
1060- if ( ! typeParameters ) typeParameters = [ typeParameter ] ;
1061- else typeParameters . push ( typeParameter ) ;
1061+ typeParameters . push ( typeParameter ) ;
10621062 if ( ! tn . skip ( Token . COMMA ) ) {
10631063 if ( tn . skip ( Token . GREATERTHAN ) ) {
10641064 break ;
@@ -1071,10 +1071,10 @@ export class Parser extends DiagnosticEmitter {
10711071 }
10721072 }
10731073 }
1074- if ( ! ( typeParameters && typeParameters . length ) ) {
1074+ if ( ! typeParameters . length ) {
10751075 this . error (
10761076 DiagnosticCode . Type_parameter_list_cannot_be_empty ,
1077- tn . range ( )
1077+ tn . range ( start , tn . pos )
10781078 ) ; // recoverable
10791079 }
10801080 return typeParameters ;
@@ -3618,7 +3618,8 @@ export class Parser extends DiagnosticEmitter {
36183618
36193619 var state = tn . mark ( ) ;
36203620 if ( ! tn . skip ( Token . LESSTHAN ) ) return null ;
3621- var typeArguments : TypeNode [ ] | null = null ;
3621+ var start = tn . tokenPos ;
3622+ var typeArguments = new Array < TypeNode > ( ) ;
36223623 do {
36233624 if ( tn . peek ( ) === Token . GREATERTHAN ) {
36243625 break ;
@@ -3628,11 +3629,19 @@ export class Parser extends DiagnosticEmitter {
36283629 tn . reset ( state ) ;
36293630 return null ;
36303631 }
3631- if ( ! typeArguments ) typeArguments = [ type ] ;
3632- else typeArguments . push ( type ) ;
3632+ typeArguments . push ( type ) ;
36333633 } 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+ }
36363645 }
36373646 tn . reset ( state ) ;
36383647 return null ;
0 commit comments