@@ -901,14 +901,14 @@ export class Tokenizer extends DiagnosticEmitter {
901901 }
902902 }
903903
904- readRegexpPattern ( ) : string | null {
904+ readRegexpPattern ( ) : string {
905905 var text = this . source . text ;
906906 var start = this . pos ;
907907 var escaped = false ;
908908 while ( true ) {
909909 if ( this . pos >= this . end ) {
910910 this . error ( DiagnosticCode . Unterminated_regular_expression_literal , this . range ( start , this . end ) ) ;
911- return null ;
911+ break ;
912912 }
913913 if ( text . charCodeAt ( this . pos ) == CharCode . BACKSLASH ) {
914914 ++ this . pos ;
@@ -920,31 +920,43 @@ export class Tokenizer extends DiagnosticEmitter {
920920 break ;
921921 if ( isLineBreak ( c ) ) {
922922 this . error ( DiagnosticCode . Unterminated_regular_expression_literal , this . range ( start , this . pos ) ) ;
923- return null ;
923+ break ;
924924 }
925925 ++ this . pos ;
926926 escaped = false ;
927927 }
928928 return text . substring ( start , this . pos ) ;
929929 }
930930
931- readRegexpModifiers ( ) : string {
931+ readRegexpFlags ( ) : string {
932932 var text = this . source . text ;
933933 var start = this . pos ;
934- / a /
934+ var flags = 0 ;
935935 while ( this . pos < this . end ) {
936- switch ( text . charCodeAt ( this . pos ) ) {
936+ var c : i32 = text . charCodeAt ( this . pos ) ;
937+ if ( ! isIdentifierPart ( c ) )
938+ break ;
939+ ++ this . pos ;
940+ switch ( c ) {
937941
942+ // make sure each supported flag is unique
938943 case CharCode . g :
944+ flags |= select < i32 > ( 1 , - 1 , ! ( flags & 1 ) ) ;
945+ break ;
939946 case CharCode . i :
947+ flags |= select < i32 > ( 2 , - 1 , ! ( flags & 2 ) ) ;
948+ break ;
940949 case CharCode . m :
941- ++ this . pos ;
950+ flags |= select < i32 > ( 4 , - 1 , ! ( flags & 4 ) ) ;
942951 break ;
943952
944953 default :
945- return text . substring ( start , this . pos ) ;
954+ flags = - 1 ;
955+ break ;
946956 }
947957 }
958+ if ( flags == - 1 )
959+ this . error ( DiagnosticCode . Invalid_regular_expression_flags , this . range ( start , this . pos ) ) ;
948960 return text . substring ( start , this . pos ) ;
949961 }
950962
0 commit comments