@@ -216,9 +216,9 @@ namespace ts {
216
216
},
217
217
getAugmentedPropertiesOfType,
218
218
getRootSymbols,
219
- getContextualType: nodeIn => {
219
+ getContextualType: ( nodeIn, contextFlags) => {
220
220
const node = getParseTreeNode(nodeIn, isExpression);
221
- return node ? getContextualType(node) : undefined;
221
+ return node ? getContextualType(node, contextFlags ) : undefined;
222
222
},
223
223
getContextualTypeForObjectLiteralElement: nodeIn => {
224
224
const node = getParseTreeNode(nodeIn, isObjectLiteralElementLike);
@@ -712,11 +712,6 @@ namespace ts {
712
712
IsForSignatureHelp = 1 << 4, // Call resolution for purposes of signature help
713
713
}
714
714
715
- const enum ContextFlags {
716
- None = 0,
717
- Signature = 1 << 0, // Obtaining contextual signature
718
- }
719
-
720
715
const enum AccessFlags {
721
716
None = 0,
722
717
NoIndexSignatures = 1 << 0,
@@ -15689,7 +15684,7 @@ namespace ts {
15689
15684
return getWidenedType(unwidenedType);
15690
15685
}
15691
15686
15692
- function getInferredType(context: InferenceContext, index: number): Type {
15687
+ function getInferredType(context: InferenceContext, index: number, contextFlags?: ContextFlags ): Type {
15693
15688
const inference = context.inferences[index];
15694
15689
if (!inference.inferredType) {
15695
15690
let inferredType: Type | undefined;
@@ -15734,7 +15729,8 @@ namespace ts {
15734
15729
const constraint = getConstraintOfTypeParameter(inference.typeParameter);
15735
15730
if (constraint) {
15736
15731
const instantiatedConstraint = instantiateType(constraint, context.nonFixingMapper);
15737
- if (!inferredType || !context.compareTypes(inferredType, getTypeWithThisArgument(instantiatedConstraint, inferredType))) {
15732
+ const isCompletionContext = contextFlags && ((contextFlags | ContextFlags.Completion) === contextFlags);
15733
+ if (!inferredType || !context.compareTypes(inferredType, getTypeWithThisArgument(instantiatedConstraint, inferredType)) || isCompletionContext) {
15738
15734
inference.inferredType = inferredType = instantiatedConstraint;
15739
15735
}
15740
15736
}
@@ -15747,10 +15743,10 @@ namespace ts {
15747
15743
return isInJavaScriptFile ? anyType : unknownType;
15748
15744
}
15749
15745
15750
- function getInferredTypes(context: InferenceContext): Type[] {
15746
+ function getInferredTypes(context: InferenceContext, contextFlags?: ContextFlags ): Type[] {
15751
15747
const result: Type[] = [];
15752
15748
for (let i = 0; i < context.inferences.length; i++) {
15753
- result.push(getInferredType(context, i));
15749
+ result.push(getInferredType(context, i, contextFlags ));
15754
15750
}
15755
15751
return result;
15756
15752
}
@@ -18448,16 +18444,16 @@ namespace ts {
18448
18444
}
18449
18445
18450
18446
// In a typed function call, an argument or substitution expression is contextually typed by the type of the corresponding parameter.
18451
- function getContextualTypeForArgument(callTarget: CallLikeExpression, arg: Expression): Type | undefined {
18447
+ function getContextualTypeForArgument(callTarget: CallLikeExpression, arg: Expression, contextFlags?: ContextFlags ): Type | undefined {
18452
18448
const args = getEffectiveCallArguments(callTarget);
18453
18449
const argIndex = args.indexOf(arg); // -1 for e.g. the expression of a CallExpression, or the tag of a TaggedTemplateExpression
18454
- return argIndex === -1 ? undefined : getContextualTypeForArgumentAtIndex(callTarget, argIndex);
18450
+ return argIndex === -1 ? undefined : getContextualTypeForArgumentAtIndex(callTarget, argIndex, contextFlags );
18455
18451
}
18456
18452
18457
- function getContextualTypeForArgumentAtIndex(callTarget: CallLikeExpression, argIndex: number): Type {
18453
+ function getContextualTypeForArgumentAtIndex(callTarget: CallLikeExpression, argIndex: number, contextFlags?: ContextFlags ): Type {
18458
18454
// If we're already in the process of resolving the given signature, don't resolve again as
18459
18455
// that could cause infinite recursion. Instead, return anySignature.
18460
- const signature = getNodeLinks(callTarget).resolvedSignature === resolvingSignature ? resolvingSignature : getResolvedSignature(callTarget);
18456
+ const signature = getNodeLinks(callTarget).resolvedSignature === resolvingSignature ? resolvingSignature : getResolvedSignature(callTarget, /*candidatesOutArray*/ undefined, /*checkMode*/ undefined, contextFlags );
18461
18457
if (isJsxOpeningLikeElement(callTarget) && argIndex === 0) {
18462
18458
return getEffectiveFirstArgumentForJsxSignature(signature, callTarget);
18463
18459
}
@@ -18840,7 +18836,7 @@ namespace ts {
18840
18836
return getContextualTypeForAwaitOperand(<AwaitExpression>parent);
18841
18837
case SyntaxKind.CallExpression:
18842
18838
case SyntaxKind.NewExpression:
18843
- return getContextualTypeForArgument(<CallExpression | NewExpression>parent, node);
18839
+ return getContextualTypeForArgument(<CallExpression | NewExpression>parent, node, contextFlags );
18844
18840
case SyntaxKind.TypeAssertionExpression:
18845
18841
case SyntaxKind.AsExpression:
18846
18842
return isConstTypeReference((<AssertionExpression>parent).type) ? undefined : getTypeFromTypeNode((<AssertionExpression>parent).type);
@@ -20963,7 +20959,7 @@ namespace ts {
20963
20959
return getInferredTypes(context);
20964
20960
}
20965
20961
20966
- function inferTypeArguments(node: CallLikeExpression, signature: Signature, args: ReadonlyArray<Expression>, checkMode: CheckMode, context: InferenceContext): Type[] {
20962
+ function inferTypeArguments(node: CallLikeExpression, signature: Signature, args: ReadonlyArray<Expression>, checkMode: CheckMode, context: InferenceContext, contextFlags?: ContextFlags ): Type[] {
20967
20963
if (isJsxOpeningLikeElement(node)) {
20968
20964
return inferJsxTypeArguments(node, signature, checkMode, context);
20969
20965
}
@@ -21029,7 +21025,7 @@ namespace ts {
21029
21025
inferTypes(context.inferences, spreadType, restType);
21030
21026
}
21031
21027
21032
- return getInferredTypes(context);
21028
+ return getInferredTypes(context, contextFlags );
21033
21029
}
21034
21030
21035
21031
function getArrayifiedType(type: Type) {
@@ -21395,7 +21391,7 @@ namespace ts {
21395
21391
return createDiagnosticForNodeArray(getSourceFileOfNode(node), typeArguments, Diagnostics.Expected_0_type_arguments_but_got_1, belowArgCount === -Infinity ? aboveArgCount : belowArgCount, argCount);
21396
21392
}
21397
21393
21398
- function resolveCall(node: CallLikeExpression, signatures: ReadonlyArray<Signature>, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode, fallbackError?: DiagnosticMessage): Signature {
21394
+ function resolveCall(node: CallLikeExpression, signatures: ReadonlyArray<Signature>, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode, fallbackError?: DiagnosticMessage, contextFlags?: ContextFlags ): Signature {
21399
21395
const isTaggedTemplate = node.kind === SyntaxKind.TaggedTemplateExpression;
21400
21396
const isDecorator = node.kind === SyntaxKind.Decorator;
21401
21397
const isJsxOpeningOrSelfClosingElement = isJsxOpeningLikeElement(node);
@@ -21485,7 +21481,7 @@ namespace ts {
21485
21481
result = chooseOverload(candidates, subtypeRelation, signatureHelpTrailingComma);
21486
21482
}
21487
21483
if (!result) {
21488
- result = chooseOverload(candidates, assignableRelation, signatureHelpTrailingComma);
21484
+ result = chooseOverload(candidates, assignableRelation, signatureHelpTrailingComma, contextFlags );
21489
21485
}
21490
21486
if (result) {
21491
21487
return result;
@@ -21535,7 +21531,7 @@ namespace ts {
21535
21531
return node;
21536
21532
}
21537
21533
21538
- function chooseOverload(candidates: Signature[], relation: Map<RelationComparisonResult>, signatureHelpTrailingComma = false) {
21534
+ function chooseOverload(candidates: Signature[], relation: Map<RelationComparisonResult>, signatureHelpTrailingComma = false, contextFlags?: ContextFlags ) {
21539
21535
candidateForArgumentError = undefined;
21540
21536
candidateForArgumentArityError = undefined;
21541
21537
candidateForTypeArgumentError = undefined;
@@ -21572,7 +21568,7 @@ namespace ts {
21572
21568
}
21573
21569
else {
21574
21570
inferenceContext = createInferenceContext(candidate.typeParameters, candidate, /*flags*/ isInJSFile(node) ? InferenceFlags.AnyDefault : InferenceFlags.None);
21575
- typeArgumentTypes = inferTypeArguments(node, candidate, args, argCheckMode | CheckMode.SkipGenericFunctions, inferenceContext);
21571
+ typeArgumentTypes = inferTypeArguments(node, candidate, args, argCheckMode | CheckMode.SkipGenericFunctions, inferenceContext, contextFlags );
21576
21572
argCheckMode |= inferenceContext.flags & InferenceFlags.SkippedGenericFunction ? CheckMode.SkipGenericFunctions : CheckMode.Normal;
21577
21573
}
21578
21574
checkCandidate = getSignatureInstantiation(candidate, typeArgumentTypes, isInJSFile(candidate.declaration), inferenceContext && inferenceContext.inferredTypeParameters);
@@ -21746,7 +21742,7 @@ namespace ts {
21746
21742
return maxParamsIndex;
21747
21743
}
21748
21744
21749
- function resolveCallExpression(node: CallExpression, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode): Signature {
21745
+ function resolveCallExpression(node: CallExpression, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode, contextFlags?: ContextFlags ): Signature {
21750
21746
if (node.expression.kind === SyntaxKind.SuperKeyword) {
21751
21747
const superType = checkSuperExpression(node.expression);
21752
21748
if (isTypeAny(superType)) {
@@ -21842,7 +21838,7 @@ namespace ts {
21842
21838
error(node, Diagnostics.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new, typeToString(funcType));
21843
21839
return resolveErrorCall(node);
21844
21840
}
21845
- return resolveCall(node, callSignatures, candidatesOutArray, checkMode);
21841
+ return resolveCall(node, callSignatures, candidatesOutArray, checkMode, /*fallbackError*/ undefined, contextFlags );
21846
21842
}
21847
21843
21848
21844
function isGenericFunctionReturningFunction(signature: Signature) {
@@ -22181,10 +22177,10 @@ namespace ts {
22181
22177
signature.parameters.length < getDecoratorArgumentCount(decorator, signature));
22182
22178
}
22183
22179
22184
- function resolveSignature(node: CallLikeExpression, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode): Signature {
22180
+ function resolveSignature(node: CallLikeExpression, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode, contextFlags?: ContextFlags ): Signature {
22185
22181
switch (node.kind) {
22186
22182
case SyntaxKind.CallExpression:
22187
- return resolveCallExpression(node, candidatesOutArray, checkMode);
22183
+ return resolveCallExpression(node, candidatesOutArray, checkMode, contextFlags );
22188
22184
case SyntaxKind.NewExpression:
22189
22185
return resolveNewExpression(node, candidatesOutArray, checkMode);
22190
22186
case SyntaxKind.TaggedTemplateExpression:
@@ -22205,7 +22201,7 @@ namespace ts {
22205
22201
* the function will fill it up with appropriate candidate signatures
22206
22202
* @return a signature of the call-like expression or undefined if one can't be found
22207
22203
*/
22208
- function getResolvedSignature(node: CallLikeExpression, candidatesOutArray?: Signature[] | undefined, checkMode?: CheckMode): Signature {
22204
+ function getResolvedSignature(node: CallLikeExpression, candidatesOutArray?: Signature[] | undefined, checkMode?: CheckMode, contextFlags?: ContextFlags ): Signature {
22209
22205
const links = getNodeLinks(node);
22210
22206
// If getResolvedSignature has already been called, we will have cached the resolvedSignature.
22211
22207
// However, it is possible that either candidatesOutArray was not passed in the first time,
@@ -22216,7 +22212,7 @@ namespace ts {
22216
22212
return cached;
22217
22213
}
22218
22214
links.resolvedSignature = resolvingSignature;
22219
- const result = resolveSignature(node, candidatesOutArray, checkMode || CheckMode.Normal);
22215
+ const result = resolveSignature(node, candidatesOutArray, checkMode || CheckMode.Normal, contextFlags );
22220
22216
// When CheckMode.SkipGenericFunctions is set we use resolvingSignature to indicate that call
22221
22217
// resolution should be deferred.
22222
22218
if (result !== resolvingSignature) {
0 commit comments