@@ -1267,14 +1267,25 @@ module ts {
1267
1267
return finishNode ( node ) ;
1268
1268
}
1269
1269
1270
- function parseSignature ( kind : SyntaxKind , returnToken : SyntaxKind ) : ParsedSignature {
1270
+ function parseSignature ( kind : SyntaxKind , returnToken : SyntaxKind , returnTokenRequired : boolean ) : ParsedSignature {
1271
1271
if ( kind === SyntaxKind . ConstructSignature ) {
1272
1272
parseExpected ( SyntaxKind . NewKeyword ) ;
1273
1273
}
1274
1274
var typeParameters = parseTypeParameters ( ) ;
1275
1275
var parameters = parseParameterList ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken ) ;
1276
1276
checkParameterList ( parameters ) ;
1277
- var type = parseOptional ( returnToken ) ? parseType ( ) : undefined ;
1277
+
1278
+ var type : TypeNode ;
1279
+
1280
+ if ( returnTokenRequired ) {
1281
+ parseExpected ( returnToken ) ;
1282
+ type = parseType ( ) ;
1283
+ }
1284
+ else if ( parseOptional ( returnToken ) )
1285
+ {
1286
+ type = parseType ( ) ;
1287
+ }
1288
+
1278
1289
return {
1279
1290
typeParameters : typeParameters ,
1280
1291
parameters : parameters ,
@@ -1338,7 +1349,7 @@ module ts {
1338
1349
1339
1350
function parseSignatureMember ( kind : SyntaxKind , returnToken : SyntaxKind ) : SignatureDeclaration {
1340
1351
var node = < SignatureDeclaration > createNode ( kind ) ;
1341
- var sig = parseSignature ( kind , returnToken ) ;
1352
+ var sig = parseSignature ( kind , returnToken , /* returnTokenRequired */ false ) ;
1342
1353
node . typeParameters = sig . typeParameters ;
1343
1354
node . parameters = sig . parameters ;
1344
1355
node . type = sig . type ;
@@ -1411,7 +1422,7 @@ module ts {
1411
1422
}
1412
1423
if ( token === SyntaxKind . OpenParenToken || token === SyntaxKind . LessThanToken ) {
1413
1424
node . kind = SyntaxKind . Method ;
1414
- var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken ) ;
1425
+ var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken , /* returnTokenRequired */ false ) ;
1415
1426
( < MethodDeclaration > node ) . typeParameters = sig . typeParameters ;
1416
1427
( < MethodDeclaration > node ) . parameters = sig . parameters ;
1417
1428
( < MethodDeclaration > node ) . type = sig . type ;
@@ -1472,7 +1483,7 @@ module ts {
1472
1483
function parseFunctionType ( signatureKind : SyntaxKind ) : TypeLiteralNode {
1473
1484
var node = < TypeLiteralNode > createNode ( SyntaxKind . TypeLiteral ) ;
1474
1485
var member = < SignatureDeclaration > createNode ( signatureKind ) ;
1475
- var sig = parseSignature ( signatureKind , SyntaxKind . EqualsGreaterThanToken ) ;
1486
+ var sig = parseSignature ( signatureKind , SyntaxKind . EqualsGreaterThanToken , /* returnTokenRequired */ true ) ;
1476
1487
member . typeParameters = sig . typeParameters ;
1477
1488
member . parameters = sig . parameters ;
1478
1489
member . type = sig . type ;
@@ -1728,7 +1739,7 @@ module ts {
1728
1739
var pos = getNodePos ( ) ;
1729
1740
1730
1741
if ( triState === Tristate . True ) {
1731
- var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken ) ;
1742
+ var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken , /* returnTokenRequired */ false ) ;
1732
1743
1733
1744
// If we have an arrow, then try to parse the body.
1734
1745
// Even if not, try to parse if we have an opening brace, just in case we're in an error state.
@@ -1831,7 +1842,7 @@ module ts {
1831
1842
1832
1843
function tryParseSignatureIfArrowOrBraceFollows ( ) : ParsedSignature {
1833
1844
return tryParse ( ( ) => {
1834
- var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken ) ;
1845
+ var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken , /* returnTokenRequired */ false ) ;
1835
1846
1836
1847
// Parsing a signature isn't enough.
1837
1848
// Parenthesized arrow signatures often look like other valid expressions.
@@ -2173,7 +2184,7 @@ module ts {
2173
2184
var node = < PropertyDeclaration > createNode ( SyntaxKind . PropertyAssignment ) ;
2174
2185
node . name = parsePropertyName ( ) ;
2175
2186
if ( token === SyntaxKind . OpenParenToken || token === SyntaxKind . LessThanToken ) {
2176
- var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken ) ;
2187
+ var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken , /* returnTokenRequired */ false ) ;
2177
2188
var body = parseBody ( /* ignoreMissingOpenBrace */ false ) ;
2178
2189
// do not propagate property name as name for function expression
2179
2190
// for scenarios like
@@ -2273,7 +2284,7 @@ module ts {
2273
2284
var pos = getNodePos ( ) ;
2274
2285
parseExpected ( SyntaxKind . FunctionKeyword ) ;
2275
2286
var name = isIdentifier ( ) ? parseIdentifier ( ) : undefined ;
2276
- var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken ) ;
2287
+ var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken , /* returnTokenRequired */ false ) ;
2277
2288
var body = parseBody ( /* ignoreMissingOpenBrace */ false ) ;
2278
2289
if ( name && isInStrictMode && isEvalOrArgumentsIdentifier ( name ) ) {
2279
2290
// It is a SyntaxError to use within strict mode code the identifiers eval or arguments as the
@@ -2888,7 +2899,7 @@ module ts {
2888
2899
if ( flags ) node . flags = flags ;
2889
2900
parseExpected ( SyntaxKind . FunctionKeyword ) ;
2890
2901
node . name = parseIdentifier ( ) ;
2891
- var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken ) ;
2902
+ var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken , /* returnTokenRequired */ false ) ;
2892
2903
node . typeParameters = sig . typeParameters ;
2893
2904
node . parameters = sig . parameters ;
2894
2905
node . type = sig . type ;
@@ -2905,7 +2916,7 @@ module ts {
2905
2916
var node = < ConstructorDeclaration > createNode ( SyntaxKind . Constructor , pos ) ;
2906
2917
node . flags = flags ;
2907
2918
parseExpected ( SyntaxKind . ConstructorKeyword ) ;
2908
- var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken ) ;
2919
+ var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken , /* returnTokenRequired */ false ) ;
2909
2920
node . typeParameters = sig . typeParameters ;
2910
2921
node . parameters = sig . parameters ;
2911
2922
node . type = sig . type ;
@@ -2932,7 +2943,7 @@ module ts {
2932
2943
var method = < MethodDeclaration > createNode ( SyntaxKind . Method , pos ) ;
2933
2944
method . flags = flags ;
2934
2945
method . name = name ;
2935
- var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken ) ;
2946
+ var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken , /* returnTokenRequired */ false ) ;
2936
2947
method . typeParameters = sig . typeParameters ;
2937
2948
method . parameters = sig . parameters ;
2938
2949
method . type = sig . type ;
@@ -3005,7 +3016,7 @@ module ts {
3005
3016
var node = < MethodDeclaration > createNode ( kind , pos ) ;
3006
3017
node . flags = flags ;
3007
3018
node . name = parsePropertyName ( ) ;
3008
- var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken ) ;
3019
+ var sig = parseSignature ( SyntaxKind . CallSignature , SyntaxKind . ColonToken , /* returnTokenRequired */ false ) ;
3009
3020
node . typeParameters = sig . typeParameters ;
3010
3021
node . parameters = sig . parameters ;
3011
3022
node . type = sig . type ;
0 commit comments