@@ -1048,6 +1048,7 @@ module TypeScript.Parser {
10481048 case SyntaxKind . ExportKeyword :
10491049 case SyntaxKind . PublicKeyword :
10501050 case SyntaxKind . PrivateKeyword :
1051+ case SyntaxKind . ProtectedKeyword :
10511052 case SyntaxKind . StaticKeyword :
10521053 case SyntaxKind . DeclareKeyword :
10531054 return true ;
@@ -1434,6 +1435,19 @@ module TypeScript.Parser {
14341435 return new syntaxFactory . ObjectTypeSyntax ( parseNodeData , openBraceToken , typeMembers , eatToken ( SyntaxKind . CloseBraceToken ) ) ;
14351436 }
14361437
1438+ function parseTupleType ( currentToken : ISyntaxToken ) : TupleTypeSyntax {
1439+ var openBracket = consumeToken ( currentToken ) ;
1440+
1441+ var types = Syntax . emptySeparatedList < ITypeSyntax > ( ) ;
1442+ if ( openBracket . fullWidth ( ) > 0 ) {
1443+ var skippedTokens : ISyntaxToken [ ] = getArray ( ) ;
1444+ types = parseSeparatedSyntaxList < ITypeSyntax > ( ListParsingState . TupleType_Types , skippedTokens ) ;
1445+ openBracket = addSkippedTokensAfterToken ( openBracket , skippedTokens ) ;
1446+ }
1447+
1448+ return new syntaxFactory . TupleTypeSyntax ( parseNodeData , openBracket , types , eatToken ( SyntaxKind . CloseBracketToken ) ) ;
1449+ }
1450+
14371451 function isTypeMember ( inErrorRecovery : boolean ) : boolean {
14381452 if ( SyntaxUtilities . isTypeMember ( currentNode ( ) ) ) {
14391453 return true ;
@@ -1663,6 +1677,7 @@ module TypeScript.Parser {
16631677 // ERROR RECOVERY
16641678 case SyntaxKind . PublicKeyword :
16651679 case SyntaxKind . PrivateKeyword :
1680+ case SyntaxKind . ProtectedKeyword :
16661681 case SyntaxKind . StaticKeyword :
16671682 // None of the above are actually keywords. And they might show up in a real
16681683 // statement (i.e. "public();"). However, if we see 'public <identifier>' then
@@ -1731,6 +1746,7 @@ module TypeScript.Parser {
17311746 // ERROR RECOVERY
17321747 case SyntaxKind . PublicKeyword :
17331748 case SyntaxKind . PrivateKeyword :
1749+ case SyntaxKind . ProtectedKeyword :
17341750 case SyntaxKind . StaticKeyword :
17351751 // None of the above are actually keywords. And they might show up in a real
17361752 // statement (i.e. "public();"). However, if we see 'public <identifier>' then
@@ -3133,7 +3149,7 @@ module TypeScript.Parser {
31333149 token2 = peekToken ( 2 ) ;
31343150 token2Kind = token2 . kind ( ) ;
31353151
3136- if ( token1Kind === SyntaxKind . PublicKeyword || token1Kind === SyntaxKind . PrivateKeyword ) {
3152+ if ( SyntaxFacts . isAccessibilityModifier ( token1Kind ) ) {
31373153 if ( isIdentifier ( token2 ) ) {
31383154 // "(public id" or "(function id". Definitely an arrow function. Could never
31393155 // be a parenthesized expression. Note: this will be an *illegal* arrow
@@ -3557,11 +3573,12 @@ module TypeScript.Parser {
35573573
35583574 return consumeToken ( _currentToken ) ;
35593575 case SyntaxKind . OpenParenToken :
3560- case SyntaxKind . LessThanToken : return tryParseFunctionType ( ) ;
3561- case SyntaxKind . VoidKeyword : return consumeToken ( _currentToken ) ;
3562- case SyntaxKind . OpenBraceToken : return parseObjectType ( ) ;
3563- case SyntaxKind . NewKeyword : return parseConstructorType ( ) ;
3564- case SyntaxKind . TypeOfKeyword : return parseTypeQuery ( _currentToken ) ;
3576+ case SyntaxKind . LessThanToken : return tryParseFunctionType ( ) ;
3577+ case SyntaxKind . VoidKeyword : return consumeToken ( _currentToken ) ;
3578+ case SyntaxKind . OpenBraceToken : return parseObjectType ( ) ;
3579+ case SyntaxKind . NewKeyword : return parseConstructorType ( ) ;
3580+ case SyntaxKind . TypeOfKeyword : return parseTypeQuery ( _currentToken ) ;
3581+ case SyntaxKind . OpenBracketToken : return parseTupleType ( _currentToken ) ;
35653582 }
35663583
35673584 return tryParseNameOrGenericType ( ) ;
@@ -3973,6 +3990,7 @@ module TypeScript.Parser {
39733990 case ListParsingState . IndexSignature_Parameters : return isExpectedIndexSignature_ParametersTerminator ( ) ;
39743991 case ListParsingState . TypeArgumentList_Types : return isExpectedTypeArgumentList_TypesTerminator ( ) ;
39753992 case ListParsingState . TypeParameterList_TypeParameters : return isExpectedTypeParameterList_TypeParametersTerminator ( ) ;
3993+ case ListParsingState . TupleType_Types : return isExpectedTupleType_TypesTerminator ( ) ;
39763994 default :
39773995 throw Errors . invalidOperation ( ) ;
39783996 }
@@ -4019,6 +4037,17 @@ module TypeScript.Parser {
40194037 return false ;
40204038 }
40214039
4040+ function isExpectedTupleType_TypesTerminator ( ) : boolean {
4041+ var token = currentToken ( ) ;
4042+ var tokenKind = token . kind ( ) ;
4043+ if ( tokenKind === SyntaxKind . CloseBracketToken ) {
4044+ return true ;
4045+ }
4046+
4047+ // TODO: add more cases as necessary for error tolerance.
4048+ return false ;
4049+ }
4050+
40224051 function isExpectedTypeParameterList_TypeParametersTerminator ( ) : boolean {
40234052 var tokenKind = currentToken ( ) . kind ( ) ;
40244053 if ( tokenKind === SyntaxKind . GreaterThanToken ) {
@@ -4187,7 +4216,8 @@ module TypeScript.Parser {
41874216 case ListParsingState . IndexSignature_Parameters : return isParameter ( ) ;
41884217 case ListParsingState . TypeArgumentList_Types : return isType ( ) ;
41894218 case ListParsingState . TypeParameterList_TypeParameters : return isTypeParameter ( ) ;
4190- default : throw Errors . invalidOperation ( ) ;
4219+ case ListParsingState . TupleType_Types : return isType ( ) ;
4220+ default : throw Errors . invalidOperation ( ) ;
41914221 }
41924222 }
41934223
@@ -4230,6 +4260,7 @@ module TypeScript.Parser {
42304260 case ListParsingState . IndexSignature_Parameters : return tryParseParameter ( ) ;
42314261 case ListParsingState . TypeArgumentList_Types : return tryParseType ( ) ;
42324262 case ListParsingState . TypeParameterList_TypeParameters : return tryParseTypeParameter ( ) ;
4263+ case ListParsingState . TupleType_Types : return tryParseType ( ) ;
42334264 default : throw Errors . invalidOperation ( ) ;
42344265 }
42354266 }
@@ -4254,6 +4285,7 @@ module TypeScript.Parser {
42544285 case ListParsingState . IndexSignature_Parameters : return getLocalizedText ( DiagnosticCode . parameter , null ) ;
42554286 case ListParsingState . TypeArgumentList_Types : return getLocalizedText ( DiagnosticCode . type , null ) ;
42564287 case ListParsingState . TypeParameterList_TypeParameters : return getLocalizedText ( DiagnosticCode . type_parameter , null ) ;
4288+ case ListParsingState . TupleType_Types : return getLocalizedText ( DiagnosticCode . type , null ) ;
42574289 case ListParsingState . ArrayLiteralExpression_AssignmentExpressions : return getLocalizedText ( DiagnosticCode . expression , null ) ;
42584290 default : throw Errors . invalidOperation ( ) ;
42594291 }
@@ -4376,9 +4408,10 @@ module TypeScript.Parser {
43764408 IndexSignature_Parameters = 18 ,
43774409 TypeArgumentList_Types = 19 ,
43784410 TypeParameterList_TypeParameters = 20 ,
4411+ TupleType_Types = 21 ,
43794412
43804413 FirstListParsingState = SourceUnit_ModuleElements ,
4381- LastListParsingState = TypeParameterList_TypeParameters ,
4414+ LastListParsingState = TupleType_Types ,
43824415 }
43834416
43844417 // We keep the parser around as a singleton. This is because calling createParser is actually
0 commit comments