@@ -1048,6 +1048,7 @@ module TypeScript.Parser {
1048
1048
case SyntaxKind . ExportKeyword :
1049
1049
case SyntaxKind . PublicKeyword :
1050
1050
case SyntaxKind . PrivateKeyword :
1051
+ case SyntaxKind . ProtectedKeyword :
1051
1052
case SyntaxKind . StaticKeyword :
1052
1053
case SyntaxKind . DeclareKeyword :
1053
1054
return true ;
@@ -1434,6 +1435,19 @@ module TypeScript.Parser {
1434
1435
return new syntaxFactory . ObjectTypeSyntax ( parseNodeData , openBraceToken , typeMembers , eatToken ( SyntaxKind . CloseBraceToken ) ) ;
1435
1436
}
1436
1437
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
+
1437
1451
function isTypeMember ( inErrorRecovery : boolean ) : boolean {
1438
1452
if ( SyntaxUtilities . isTypeMember ( currentNode ( ) ) ) {
1439
1453
return true ;
@@ -1663,6 +1677,7 @@ module TypeScript.Parser {
1663
1677
// ERROR RECOVERY
1664
1678
case SyntaxKind . PublicKeyword :
1665
1679
case SyntaxKind . PrivateKeyword :
1680
+ case SyntaxKind . ProtectedKeyword :
1666
1681
case SyntaxKind . StaticKeyword :
1667
1682
// None of the above are actually keywords. And they might show up in a real
1668
1683
// statement (i.e. "public();"). However, if we see 'public <identifier>' then
@@ -1731,6 +1746,7 @@ module TypeScript.Parser {
1731
1746
// ERROR RECOVERY
1732
1747
case SyntaxKind . PublicKeyword :
1733
1748
case SyntaxKind . PrivateKeyword :
1749
+ case SyntaxKind . ProtectedKeyword :
1734
1750
case SyntaxKind . StaticKeyword :
1735
1751
// None of the above are actually keywords. And they might show up in a real
1736
1752
// statement (i.e. "public();"). However, if we see 'public <identifier>' then
@@ -3133,7 +3149,7 @@ module TypeScript.Parser {
3133
3149
token2 = peekToken ( 2 ) ;
3134
3150
token2Kind = token2 . kind ( ) ;
3135
3151
3136
- if ( token1Kind === SyntaxKind . PublicKeyword || token1Kind === SyntaxKind . PrivateKeyword ) {
3152
+ if ( SyntaxFacts . isAccessibilityModifier ( token1Kind ) ) {
3137
3153
if ( isIdentifier ( token2 ) ) {
3138
3154
// "(public id" or "(function id". Definitely an arrow function. Could never
3139
3155
// be a parenthesized expression. Note: this will be an *illegal* arrow
@@ -3557,11 +3573,12 @@ module TypeScript.Parser {
3557
3573
3558
3574
return consumeToken ( _currentToken ) ;
3559
3575
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 ) ;
3565
3582
}
3566
3583
3567
3584
return tryParseNameOrGenericType ( ) ;
@@ -3973,6 +3990,7 @@ module TypeScript.Parser {
3973
3990
case ListParsingState . IndexSignature_Parameters : return isExpectedIndexSignature_ParametersTerminator ( ) ;
3974
3991
case ListParsingState . TypeArgumentList_Types : return isExpectedTypeArgumentList_TypesTerminator ( ) ;
3975
3992
case ListParsingState . TypeParameterList_TypeParameters : return isExpectedTypeParameterList_TypeParametersTerminator ( ) ;
3993
+ case ListParsingState . TupleType_Types : return isExpectedTupleType_TypesTerminator ( ) ;
3976
3994
default :
3977
3995
throw Errors . invalidOperation ( ) ;
3978
3996
}
@@ -4019,6 +4037,17 @@ module TypeScript.Parser {
4019
4037
return false ;
4020
4038
}
4021
4039
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
+
4022
4051
function isExpectedTypeParameterList_TypeParametersTerminator ( ) : boolean {
4023
4052
var tokenKind = currentToken ( ) . kind ( ) ;
4024
4053
if ( tokenKind === SyntaxKind . GreaterThanToken ) {
@@ -4187,6 +4216,7 @@ module TypeScript.Parser {
4187
4216
case ListParsingState . IndexSignature_Parameters : return isParameter ( ) ;
4188
4217
case ListParsingState . TypeArgumentList_Types : return isType ( ) ;
4189
4218
case ListParsingState . TypeParameterList_TypeParameters : return isTypeParameter ( ) ;
4219
+ case ListParsingState . TupleType_Types : return isType ( ) ;
4190
4220
default : throw Errors . invalidOperation ( ) ;
4191
4221
}
4192
4222
}
@@ -4230,6 +4260,7 @@ module TypeScript.Parser {
4230
4260
case ListParsingState . IndexSignature_Parameters : return tryParseParameter ( ) ;
4231
4261
case ListParsingState . TypeArgumentList_Types : return tryParseType ( ) ;
4232
4262
case ListParsingState . TypeParameterList_TypeParameters : return tryParseTypeParameter ( ) ;
4263
+ case ListParsingState . TupleType_Types : return tryParseType ( ) ;
4233
4264
default : throw Errors . invalidOperation ( ) ;
4234
4265
}
4235
4266
}
@@ -4254,6 +4285,7 @@ module TypeScript.Parser {
4254
4285
case ListParsingState . IndexSignature_Parameters : return getLocalizedText ( DiagnosticCode . parameter , null ) ;
4255
4286
case ListParsingState . TypeArgumentList_Types : return getLocalizedText ( DiagnosticCode . type , null ) ;
4256
4287
case ListParsingState . TypeParameterList_TypeParameters : return getLocalizedText ( DiagnosticCode . type_parameter , null ) ;
4288
+ case ListParsingState . TupleType_Types : return getLocalizedText ( DiagnosticCode . type , null ) ;
4257
4289
case ListParsingState . ArrayLiteralExpression_AssignmentExpressions : return getLocalizedText ( DiagnosticCode . expression , null ) ;
4258
4290
default : throw Errors . invalidOperation ( ) ;
4259
4291
}
@@ -4376,9 +4408,10 @@ module TypeScript.Parser {
4376
4408
IndexSignature_Parameters = 18 ,
4377
4409
TypeArgumentList_Types = 19 ,
4378
4410
TypeParameterList_TypeParameters = 20 ,
4411
+ TupleType_Types = 21 ,
4379
4412
4380
4413
FirstListParsingState = SourceUnit_ModuleElements ,
4381
- LastListParsingState = TypeParameterList_TypeParameters ,
4414
+ LastListParsingState = TupleType_Types ,
4382
4415
}
4383
4416
4384
4417
// We keep the parser around as a singleton. This is because calling createParser is actually
0 commit comments