@@ -2243,7 +2243,7 @@ namespace ts {
2243
2243
isStartOfType ( /*inStartOfParameter*/ true ) ;
2244
2244
}
2245
2245
2246
- function parseParameter ( ) : ParameterDeclaration {
2246
+ function parseParameter ( requireEqualsToken ?: boolean ) : ParameterDeclaration {
2247
2247
const node = < ParameterDeclaration > createNode ( SyntaxKind . Parameter ) ;
2248
2248
if ( token ( ) === SyntaxKind . ThisKeyword ) {
2249
2249
node . name = createIdentifier ( /*isIdentifier*/ true ) ;
@@ -2272,19 +2272,11 @@ namespace ts {
2272
2272
2273
2273
node . questionToken = parseOptionalToken ( SyntaxKind . QuestionToken ) ;
2274
2274
node . type = parseParameterType ( ) ;
2275
- node . initializer = parseBindingElementInitializer ( /*inParameter*/ true ) ;
2275
+ node . initializer = parseInitializer ( /*inParameter*/ true , requireEqualsToken ) ;
2276
2276
2277
2277
return addJSDocComment ( finishNode ( node ) ) ;
2278
2278
}
2279
2279
2280
- function parseBindingElementInitializer ( inParameter : boolean ) {
2281
- return inParameter ? parseParameterInitializer ( ) : parseNonParameterInitializer ( ) ;
2282
- }
2283
-
2284
- function parseParameterInitializer ( ) {
2285
- return parseInitializer ( /*inParameter*/ true ) ;
2286
- }
2287
-
2288
2280
function fillSignature (
2289
2281
returnToken : SyntaxKind . ColonToken | SyntaxKind . EqualsGreaterThanToken ,
2290
2282
flags : SignatureFlags ,
@@ -2335,7 +2327,8 @@ namespace ts {
2335
2327
setYieldContext ( ! ! ( flags & SignatureFlags . Yield ) ) ;
2336
2328
setAwaitContext ( ! ! ( flags & SignatureFlags . Await ) ) ;
2337
2329
2338
- const result = parseDelimitedList ( ParsingContext . Parameters , flags & SignatureFlags . JSDoc ? parseJSDocParameter : parseParameter ) ;
2330
+ const result = parseDelimitedList ( ParsingContext . Parameters ,
2331
+ flags & SignatureFlags . JSDoc ? parseJSDocParameter : ( ) => parseParameter ( ! ! ( flags & SignatureFlags . RequireCompleteParameterList ) ) ) ;
2339
2332
2340
2333
setYieldContext ( savedYieldContext ) ;
2341
2334
setAwaitContext ( savedAwaitContext ) ;
@@ -3016,7 +3009,7 @@ namespace ts {
3016
3009
return expr ;
3017
3010
}
3018
3011
3019
- function parseInitializer ( inParameter : boolean ) : Expression {
3012
+ function parseInitializer ( inParameter : boolean , requireEqualsToken ?: boolean ) : Expression {
3020
3013
if ( token ( ) !== SyntaxKind . EqualsToken ) {
3021
3014
// It's not uncommon during typing for the user to miss writing the '=' token. Check if
3022
3015
// there is no newline after the last token and if we're on an expression. If so, parse
@@ -3031,11 +3024,18 @@ namespace ts {
3031
3024
// do not try to parse initializer
3032
3025
return undefined ;
3033
3026
}
3027
+ if ( inParameter && requireEqualsToken ) {
3028
+ // this occurs with speculative parsing of lambdas, so try to consume the initializer,
3029
+ // but signal that the parameter was missing the equals sign so it can abort if it wants
3030
+ parseAssignmentExpressionOrHigher ( ) ;
3031
+ const result = createNode ( SyntaxKind . Identifier , scanner . getStartPos ( ) ) as Identifier ;
3032
+ result . escapedText = "= not found" as __String ;
3033
+ return result ;
3034
+ }
3034
3035
}
3035
3036
3036
3037
// Initializer[In, Yield] :
3037
3038
// = AssignmentExpression[?In, ?Yield]
3038
-
3039
3039
parseExpected ( SyntaxKind . EqualsToken ) ;
3040
3040
return parseAssignmentExpressionOrHigher ( ) ;
3041
3041
}
@@ -3351,8 +3351,7 @@ namespace ts {
3351
3351
function tryParseAsyncSimpleArrowFunctionExpression ( ) : ArrowFunction | undefined {
3352
3352
// We do a check here so that we won't be doing unnecessarily call to "lookAhead"
3353
3353
if ( token ( ) === SyntaxKind . AsyncKeyword ) {
3354
- const isUnParenthesizedAsyncArrowFunction = lookAhead ( isUnParenthesizedAsyncArrowFunctionWorker ) ;
3355
- if ( isUnParenthesizedAsyncArrowFunction === Tristate . True ) {
3354
+ if ( lookAhead ( isUnParenthesizedAsyncArrowFunctionWorker ) === Tristate . True ) {
3356
3355
const asyncModifier = parseModifiersForArrowFunction ( ) ;
3357
3356
const expr = parseBinaryExpressionOrHigher ( /*precedence*/ 0 ) ;
3358
3357
return parseSimpleArrowFunctionExpression ( < Identifier > expr , asyncModifier ) ;
@@ -3386,7 +3385,6 @@ namespace ts {
3386
3385
const node = < ArrowFunction > createNode ( SyntaxKind . ArrowFunction ) ;
3387
3386
node . modifiers = parseModifiersForArrowFunction ( ) ;
3388
3387
const isAsync = hasModifier ( node , ModifierFlags . Async ) ? SignatureFlags . Await : SignatureFlags . None ;
3389
-
3390
3388
// Arrow functions are never generators.
3391
3389
//
3392
3390
// If we're speculatively parsing a signature for a parenthesized arrow function, then
@@ -3409,7 +3407,8 @@ namespace ts {
3409
3407
// - "a ? (b): c" will have "(b):" parsed as a signature with a return type annotation.
3410
3408
//
3411
3409
// So we need just a bit of lookahead to ensure that it can only be a signature.
3412
- if ( ! allowAmbiguity && token ( ) !== SyntaxKind . EqualsGreaterThanToken && token ( ) !== SyntaxKind . OpenBraceToken ) {
3410
+ if ( ! allowAmbiguity && ( ( token ( ) !== SyntaxKind . EqualsGreaterThanToken && token ( ) !== SyntaxKind . OpenBraceToken ) ||
3411
+ find ( node . parameters , p => p . initializer && ts . isIdentifier ( p . initializer ) && p . initializer . escapedText === "= not found" ) ) ) {
3413
3412
// Returning undefined here will cause our caller to rewind to where we started from.
3414
3413
return undefined ;
3415
3414
}
@@ -5159,7 +5158,7 @@ namespace ts {
5159
5158
const node = < BindingElement > createNode ( SyntaxKind . BindingElement ) ;
5160
5159
node . dotDotDotToken = parseOptionalToken ( SyntaxKind . DotDotDotToken ) ;
5161
5160
node . name = parseIdentifierOrPattern ( ) ;
5162
- node . initializer = parseBindingElementInitializer ( /*inParameter*/ false ) ;
5161
+ node . initializer = parseInitializer ( /*inParameter*/ false ) ;
5163
5162
return finishNode ( node ) ;
5164
5163
}
5165
5164
@@ -5176,7 +5175,7 @@ namespace ts {
5176
5175
node . propertyName = propertyName ;
5177
5176
node . name = parseIdentifierOrPattern ( ) ;
5178
5177
}
5179
- node . initializer = parseBindingElementInitializer ( /*inParameter*/ false ) ;
5178
+ node . initializer = parseInitializer ( /*inParameter*/ false ) ;
5180
5179
return finishNode ( node ) ;
5181
5180
}
5182
5181
@@ -5215,7 +5214,7 @@ namespace ts {
5215
5214
node . name = parseIdentifierOrPattern ( ) ;
5216
5215
node . type = parseTypeAnnotation ( ) ;
5217
5216
if ( ! isInOrOfKeyword ( token ( ) ) ) {
5218
- node . initializer = parseInitializer ( /*inParameter*/ false ) ;
5217
+ node . initializer = parseNonParameterInitializer ( ) ;
5219
5218
}
5220
5219
return finishNode ( node ) ;
5221
5220
}
0 commit comments