@@ -155,7 +155,11 @@ export class Parser extends DiagnosticEmitter {
155155 var statements = source . statements ;
156156 while ( ! tn . skip ( Token . ENDOFFILE ) ) {
157157 let statement = this . parseTopLevelStatement ( tn , null ) ;
158- if ( statement ) statements . push ( statement ) ;
158+ if ( statement ) {
159+ statements . push ( statement ) ;
160+ } else {
161+ this . skipStatement ( tn ) ;
162+ }
159163 }
160164 }
161165
@@ -538,6 +542,12 @@ export class Parser extends DiagnosticEmitter {
538542 Node . createSimpleTypeName ( "bool" , tn . range ( ) ) , [ ] , false , tn . range ( startPos , tn . pos )
539543 ) ;
540544
545+ // 'null'
546+ } else if ( token == Token . NULL ) {
547+ type = Node . createNamedType (
548+ Node . createSimpleTypeName ( "null" , tn . range ( ) ) , [ ] , false , tn . range ( startPos , tn . pos )
549+ ) ;
550+
541551 // StringLiteral
542552 } else if ( token == Token . STRINGLITERAL ) {
543553 tn . readString ( ) ;
@@ -550,7 +560,6 @@ export class Parser extends DiagnosticEmitter {
550560 let name = this . parseTypeName ( tn ) ;
551561 if ( ! name ) return null ;
552562 let parameters : TypeNode [ ] | null = null ;
553- let nullable = false ;
554563
555564 // Name<T>
556565 if ( tn . skip ( Token . LESSTHAN ) ) {
@@ -570,31 +579,33 @@ export class Parser extends DiagnosticEmitter {
570579 return null ;
571580 }
572581 }
573- // ... | null
574- while ( tn . skip ( Token . BAR ) ) {
575- if ( tn . skip ( Token . NULL ) ) {
576- nullable = true ;
577- } else {
578- if ( ! suppressErrors ) {
579- this . error (
580- DiagnosticCode . _0_expected ,
581- tn . range ( tn . pos ) , "null"
582- ) ;
583- }
584- return null ;
585- }
586- }
587582 if ( ! parameters ) parameters = [ ] ;
588- type = Node . createNamedType ( name , parameters , nullable , tn . range ( startPos , tn . pos ) ) ;
583+ type = Node . createNamedType ( name , parameters , false , tn . range ( startPos , tn . pos ) ) ;
589584 } else {
590585 if ( ! suppressErrors ) {
591586 this . error (
592- DiagnosticCode . Identifier_expected ,
587+ DiagnosticCode . Type_expected ,
593588 tn . range ( )
594589 ) ;
595590 }
596591 return null ;
597592 }
593+ // ... | null
594+ while ( tn . skip ( Token . BAR ) ) {
595+ if ( tn . skip ( Token . NULL ) ) {
596+ type . isNullable = true ;
597+ } else {
598+ let notNullStart = tn . pos ;
599+ let notNull = this . parseType ( tn , false , true ) ;
600+ if ( ! suppressErrors ) {
601+ this . error (
602+ DiagnosticCode . _0_expected ,
603+ notNull ? notNull . range : tn . range ( notNullStart ) , "null"
604+ ) ;
605+ }
606+ return null ;
607+ }
608+ }
598609 // ... [][]
599610 while ( tn . skip ( Token . OPENBRACKET ) ) {
600611 let bracketStart = tn . tokenPos ;
0 commit comments