@@ -93,7 +93,7 @@ export class Parser extends DiagnosticEmitter {
9393 const normalizedPath : string = normalizePath ( path ) ;
9494 for ( let i : i32 = 0 , k : i32 = this . program . sources . length ; i < k ; ++ i )
9595 if ( this . program . sources [ i ] . normalizedPath == normalizedPath )
96- throw new Error ( "duplicate source" ) ;
96+ return ; // already parsed
9797 this . seenlog . add ( normalizedPath ) ;
9898
9999 const source : Source = new Source ( path , text , isEntry ) ;
@@ -104,10 +104,10 @@ export class Parser extends DiagnosticEmitter {
104104
105105 while ( ! tn . skip ( Token . ENDOFFILE ) ) {
106106 const statement : Statement | null = this . parseTopLevelStatement ( tn ) ;
107- if ( ! statement )
108- return ;
109- statement . parent = source ;
110- source . statements . push ( statement ) ;
107+ if ( statement ) {
108+ statement . parent = source ;
109+ source . statements . push ( statement ) ;
110+ }
111111 }
112112 }
113113
@@ -201,7 +201,7 @@ export class Parser extends DiagnosticEmitter {
201201 default :
202202 if ( hasModifier ( ModifierKind . EXPORT , modifiers ) ) {
203203 tn . reset ( ) ;
204- statement = this . parseExport ( tn , modifiers ) ; // TODO: why exactly does this have modifiers again?
204+ statement = this . parseExport ( tn , modifiers ) ; // TODO: why exactly does this have modifiers again? 'declare'?
205205 } else {
206206 if ( modifiers ) {
207207 if ( modifier = getModifier ( ModifierKind . DECLARE , modifiers ) )
@@ -713,13 +713,10 @@ export class Parser extends DiagnosticEmitter {
713713
714714 let isGetter : bool = false ;
715715 let isSetter : bool = false ;
716- if ( tn . skip ( Token . GET ) ) {
716+ if ( isGetter = tn . skip ( Token . GET ) )
717717 modifiers = addModifier ( Node . createModifier ( ModifierKind . GET , tn . range ( ) ) , modifiers ) ;
718- isGetter = true ;
719- } else if ( tn . skip ( Token . SET ) ) { // can't be both
718+ else if ( isSetter = tn . skip ( Token . SET ) ) // can't be both
720719 modifiers = addModifier ( Node . createModifier ( ModifierKind . SET , tn . range ( ) ) , modifiers ) ;
721- isSetter = true ;
722- }
723720
724721 if ( tn . skip ( Token . CONSTRUCTOR ) || tn . skip ( Token . IDENTIFIER ) ) { // order is important
725722 const identifier : IdentifierExpression = tn . token == Token . CONSTRUCTOR
@@ -899,10 +896,12 @@ export class Parser extends DiagnosticEmitter {
899896 }
900897
901898 parseImport ( tn : Tokenizer ) : ImportStatement | null {
902- // at 'import': '{' (ImportMember (',' ImportMember)*)? '}' 'from' StringLiteral ';'?
903- const startRange : Range = tn . range ( ) ;
899+ // at 'import': ('{' (ImportMember (',' ImportMember)*)? '}' | '*' 'as' Identifier) 'from' StringLiteral ';'?
900+ const startPos : i32 = tn . tokenPos ;
901+ let members : ImportDeclaration [ ] | null = null ;
902+ let namespaceName : IdentifierExpression | null = null ;
904903 if ( tn . skip ( Token . OPENBRACE ) ) {
905- const members : ImportDeclaration [ ] = new Array ( ) ;
904+ members = new Array ( ) ;
906905 if ( ! tn . skip ( Token . CLOSEBRACE ) ) {
907906 do {
908907 const member : ImportDeclaration | null = this . parseImportDeclaration ( tn ) ;
@@ -915,22 +914,49 @@ export class Parser extends DiagnosticEmitter {
915914 return null ;
916915 }
917916 }
918- if ( tn . skip ( Token . FROM ) ) {
919- if ( tn . skip ( Token . STRINGLITERAL ) ) {
920- const path : StringLiteralExpression = Node . createStringLiteral ( tn . readString ( ) , tn . range ( ) ) ;
921- const ret : ImportStatement = Node . createImport ( members , path , Range . join ( startRange , tn . range ( ) ) ) ;
922- if ( ! this . seenlog . has ( ret . normalizedPath ) ) {
923- this . backlog . push ( ret . normalizedPath ) ;
924- this . seenlog . add ( ret . normalizedPath ) ;
917+ } else if ( tn . skip ( Token . ASTERISK ) ) {
918+ if ( tn . skip ( Token . AS ) ) {
919+ if ( tn . skip ( Token . IDENTIFIER ) ) {
920+ namespaceName = Node . createIdentifier ( tn . readIdentifier ( ) , tn . range ( ) ) ;
921+ } else {
922+ this . error ( DiagnosticCode . Identifier_expected , tn . range ( ) ) ;
923+ return null ;
924+ }
925+ } else {
926+ this . error ( DiagnosticCode . _0_expected , tn . range ( ) , "as" ) ;
927+ return null ;
928+ }
929+ } else {
930+ this . error ( DiagnosticCode . _0_expected , tn . range ( ) , "{" ) ;
931+ return null ;
932+ }
933+ if ( tn . skip ( Token . FROM ) ) {
934+ if ( tn . skip ( Token . STRINGLITERAL ) ) {
935+ const path : StringLiteralExpression = Node . createStringLiteral ( tn . readString ( ) , tn . range ( ) ) ;
936+ let ret : ImportStatement ;
937+ if ( members ) {
938+ if ( ! namespaceName )
939+ ret = Node . createImport ( members , path , tn . range ( startPos , tn . pos ) ) ;
940+ else {
941+ assert ( false ) ;
942+ return null ;
925943 }
926- tn . skip ( Token . SEMICOLON ) ;
927- return ret ;
928- } else
929- this . error ( DiagnosticCode . String_literal_expected , tn . range ( ) ) ;
944+ } else if ( namespaceName ) {
945+ ret = Node . createImportAll ( namespaceName , path , tn . range ( startPos , tn . pos ) ) ;
946+ } else {
947+ assert ( false ) ;
948+ return null ;
949+ }
950+ if ( ! this . seenlog . has ( ret . normalizedPath ) ) {
951+ this . backlog . push ( ret . normalizedPath ) ;
952+ this . seenlog . add ( ret . normalizedPath ) ;
953+ }
954+ tn . skip ( Token . SEMICOLON ) ;
955+ return ret ;
930956 } else
931- this . error ( DiagnosticCode . _0_expected , tn . range ( ) , "from" ) ;
957+ this . error ( DiagnosticCode . String_literal_expected , tn . range ( ) ) ;
932958 } else
933- this . error ( DiagnosticCode . _0_expected , tn . range ( ) , "{ " ) ;
959+ this . error ( DiagnosticCode . _0_expected , tn . range ( ) , "from " ) ;
934960 return null ;
935961 }
936962
@@ -1363,7 +1389,7 @@ export class Parser extends DiagnosticEmitter {
13631389 // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing
13641390
13651391 parseExpressionStart ( tn : Tokenizer ) : Expression | null {
1366- const token : Token = tn . next ( ) ;
1392+ const token : Token = tn . next ( true ) ;
13671393 const startPos : i32 = tn . tokenPos ;
13681394 let expr : Expression | null = null ;
13691395
0 commit comments