@@ -267,9 +267,9 @@ namespace ts {
267
267
},
268
268
getAugmentedPropertiesOfType,
269
269
getRootSymbols,
270
- getContextualType: nodeIn => {
270
+ getContextualType: ( nodeIn, contextFlags) => {
271
271
const node = getParseTreeNode(nodeIn, isExpression);
272
- return node ? getContextualType(node) : undefined;
272
+ return node ? getContextualType(node, contextFlags ) : undefined;
273
273
},
274
274
getContextualTypeForObjectLiteralElement: nodeIn => {
275
275
const node = getParseTreeNode(nodeIn, isObjectLiteralElementLike);
@@ -805,11 +805,6 @@ namespace ts {
805
805
IsForSignatureHelp = 1 << 4, // Call resolution for purposes of signature help
806
806
}
807
807
808
- const enum ContextFlags {
809
- None = 0,
810
- Signature = 1 << 0, // Obtaining contextual signature
811
- }
812
-
813
808
const enum AccessFlags {
814
809
None = 0,
815
810
NoIndexSignatures = 1 << 0,
@@ -15978,7 +15973,7 @@ namespace ts {
15978
15973
return getWidenedType(unwidenedType);
15979
15974
}
15980
15975
15981
- function getInferredType(context: InferenceContext, index: number): Type {
15976
+ function getInferredType(context: InferenceContext, index: number, contextFlags?: ContextFlags ): Type {
15982
15977
const inference = context.inferences[index];
15983
15978
if (!inference.inferredType) {
15984
15979
let inferredType: Type | undefined;
@@ -16023,7 +16018,8 @@ namespace ts {
16023
16018
const constraint = getConstraintOfTypeParameter(inference.typeParameter);
16024
16019
if (constraint) {
16025
16020
const instantiatedConstraint = instantiateType(constraint, context.nonFixingMapper);
16026
- if (!inferredType || !context.compareTypes(inferredType, getTypeWithThisArgument(instantiatedConstraint, inferredType))) {
16021
+ const isCompletionContext = contextFlags && ((contextFlags | ContextFlags.Completion) === contextFlags);
16022
+ if (!inferredType || !context.compareTypes(inferredType, getTypeWithThisArgument(instantiatedConstraint, inferredType)) || isCompletionContext) {
16027
16023
inference.inferredType = inferredType = instantiatedConstraint;
16028
16024
}
16029
16025
}
@@ -16036,10 +16032,10 @@ namespace ts {
16036
16032
return isInJavaScriptFile ? anyType : unknownType;
16037
16033
}
16038
16034
16039
- function getInferredTypes(context: InferenceContext): Type[] {
16035
+ function getInferredTypes(context: InferenceContext, contextFlags?: ContextFlags ): Type[] {
16040
16036
const result: Type[] = [];
16041
16037
for (let i = 0; i < context.inferences.length; i++) {
16042
- result.push(getInferredType(context, i));
16038
+ result.push(getInferredType(context, i, contextFlags ));
16043
16039
}
16044
16040
return result;
16045
16041
}
@@ -18737,16 +18733,16 @@ namespace ts {
18737
18733
}
18738
18734
18739
18735
// In a typed function call, an argument or substitution expression is contextually typed by the type of the corresponding parameter.
18740
- function getContextualTypeForArgument(callTarget: CallLikeExpression, arg: Expression): Type | undefined {
18736
+ function getContextualTypeForArgument(callTarget: CallLikeExpression, arg: Expression, contextFlags?: ContextFlags ): Type | undefined {
18741
18737
const args = getEffectiveCallArguments(callTarget);
18742
18738
const argIndex = args.indexOf(arg); // -1 for e.g. the expression of a CallExpression, or the tag of a TaggedTemplateExpression
18743
- return argIndex === -1 ? undefined : getContextualTypeForArgumentAtIndex(callTarget, argIndex);
18739
+ return argIndex === -1 ? undefined : getContextualTypeForArgumentAtIndex(callTarget, argIndex, contextFlags );
18744
18740
}
18745
18741
18746
- function getContextualTypeForArgumentAtIndex(callTarget: CallLikeExpression, argIndex: number): Type {
18742
+ function getContextualTypeForArgumentAtIndex(callTarget: CallLikeExpression, argIndex: number, contextFlags?: ContextFlags ): Type {
18747
18743
// If we're already in the process of resolving the given signature, don't resolve again as
18748
18744
// that could cause infinite recursion. Instead, return anySignature.
18749
- const signature = getNodeLinks(callTarget).resolvedSignature === resolvingSignature ? resolvingSignature : getResolvedSignature(callTarget);
18745
+ const signature = getNodeLinks(callTarget).resolvedSignature === resolvingSignature ? resolvingSignature : getResolvedSignature(callTarget, /*candidatesOutArray*/ undefined, /*checkMode*/ undefined, contextFlags );
18750
18746
if (isJsxOpeningLikeElement(callTarget) && argIndex === 0) {
18751
18747
return getEffectiveFirstArgumentForJsxSignature(signature, callTarget);
18752
18748
}
@@ -19133,7 +19129,7 @@ namespace ts {
19133
19129
}
19134
19130
/* falls through */
19135
19131
case SyntaxKind.NewExpression:
19136
- return getContextualTypeForArgument(<CallExpression | NewExpression>parent, node);
19132
+ return getContextualTypeForArgument(<CallExpression | NewExpression>parent, node, contextFlags );
19137
19133
case SyntaxKind.TypeAssertionExpression:
19138
19134
case SyntaxKind.AsExpression:
19139
19135
return isConstTypeReference((<AssertionExpression>parent).type) ? undefined : getTypeFromTypeNode((<AssertionExpression>parent).type);
@@ -21240,7 +21236,7 @@ namespace ts {
21240
21236
return getInferredTypes(context);
21241
21237
}
21242
21238
21243
- function inferTypeArguments(node: CallLikeExpression, signature: Signature, args: ReadonlyArray<Expression>, checkMode: CheckMode, context: InferenceContext): Type[] {
21239
+ function inferTypeArguments(node: CallLikeExpression, signature: Signature, args: ReadonlyArray<Expression>, checkMode: CheckMode, context: InferenceContext, contextFlags?: ContextFlags ): Type[] {
21244
21240
if (isJsxOpeningLikeElement(node)) {
21245
21241
return inferJsxTypeArguments(node, signature, checkMode, context);
21246
21242
}
@@ -21306,7 +21302,7 @@ namespace ts {
21306
21302
inferTypes(context.inferences, spreadType, restType);
21307
21303
}
21308
21304
21309
- return getInferredTypes(context);
21305
+ return getInferredTypes(context, contextFlags );
21310
21306
}
21311
21307
21312
21308
function getArrayifiedType(type: Type) {
@@ -21742,7 +21738,7 @@ namespace ts {
21742
21738
return createDiagnosticForNodeArray(getSourceFileOfNode(node), typeArguments, Diagnostics.Expected_0_type_arguments_but_got_1, belowArgCount === -Infinity ? aboveArgCount : belowArgCount, argCount);
21743
21739
}
21744
21740
21745
- function resolveCall(node: CallLikeExpression, signatures: ReadonlyArray<Signature>, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode, fallbackError?: DiagnosticMessage): Signature {
21741
+ function resolveCall(node: CallLikeExpression, signatures: ReadonlyArray<Signature>, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode, fallbackError?: DiagnosticMessage, contextFlags?: ContextFlags ): Signature {
21746
21742
const isTaggedTemplate = node.kind === SyntaxKind.TaggedTemplateExpression;
21747
21743
const isDecorator = node.kind === SyntaxKind.Decorator;
21748
21744
const isJsxOpeningOrSelfClosingElement = isJsxOpeningLikeElement(node);
@@ -21831,7 +21827,7 @@ namespace ts {
21831
21827
result = chooseOverload(candidates, subtypeRelation, signatureHelpTrailingComma);
21832
21828
}
21833
21829
if (!result) {
21834
- result = chooseOverload(candidates, assignableRelation, signatureHelpTrailingComma);
21830
+ result = chooseOverload(candidates, assignableRelation, signatureHelpTrailingComma, contextFlags );
21835
21831
}
21836
21832
if (result) {
21837
21833
return result;
@@ -21923,7 +21919,7 @@ namespace ts {
21923
21919
21924
21920
return produceDiagnostics || !args ? resolveErrorCall(node) : getCandidateForOverloadFailure(node, candidates, args, !!candidatesOutArray);
21925
21921
21926
- function chooseOverload(candidates: Signature[], relation: Map<RelationComparisonResult>, signatureHelpTrailingComma = false) {
21922
+ function chooseOverload(candidates: Signature[], relation: Map<RelationComparisonResult>, signatureHelpTrailingComma = false, contextFlags?: ContextFlags ) {
21927
21923
candidatesForArgumentError = undefined;
21928
21924
candidateForArgumentArityError = undefined;
21929
21925
candidateForTypeArgumentError = undefined;
@@ -21960,7 +21956,7 @@ namespace ts {
21960
21956
}
21961
21957
else {
21962
21958
inferenceContext = createInferenceContext(candidate.typeParameters, candidate, /*flags*/ isInJSFile(node) ? InferenceFlags.AnyDefault : InferenceFlags.None);
21963
- typeArgumentTypes = inferTypeArguments(node, candidate, args, argCheckMode | CheckMode.SkipGenericFunctions, inferenceContext);
21959
+ typeArgumentTypes = inferTypeArguments(node, candidate, args, argCheckMode | CheckMode.SkipGenericFunctions, inferenceContext, contextFlags );
21964
21960
argCheckMode |= inferenceContext.flags & InferenceFlags.SkippedGenericFunction ? CheckMode.SkipGenericFunctions : CheckMode.Normal;
21965
21961
}
21966
21962
checkCandidate = getSignatureInstantiation(candidate, typeArgumentTypes, isInJSFile(candidate.declaration), inferenceContext && inferenceContext.inferredTypeParameters);
@@ -22130,7 +22126,7 @@ namespace ts {
22130
22126
return maxParamsIndex;
22131
22127
}
22132
22128
22133
- function resolveCallExpression(node: CallExpression, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode): Signature {
22129
+ function resolveCallExpression(node: CallExpression, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode, contextFlags?: ContextFlags ): Signature {
22134
22130
if (node.expression.kind === SyntaxKind.SuperKeyword) {
22135
22131
const superType = checkSuperExpression(node.expression);
22136
22132
if (isTypeAny(superType)) {
@@ -22226,7 +22222,7 @@ namespace ts {
22226
22222
error(node, Diagnostics.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new, typeToString(funcType));
22227
22223
return resolveErrorCall(node);
22228
22224
}
22229
- return resolveCall(node, callSignatures, candidatesOutArray, checkMode);
22225
+ return resolveCall(node, callSignatures, candidatesOutArray, checkMode, /*fallbackError*/ undefined, contextFlags );
22230
22226
}
22231
22227
22232
22228
function isGenericFunctionReturningFunction(signature: Signature) {
@@ -22652,10 +22648,10 @@ namespace ts {
22652
22648
signature.parameters.length < getDecoratorArgumentCount(decorator, signature));
22653
22649
}
22654
22650
22655
- function resolveSignature(node: CallLikeExpression, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode): Signature {
22651
+ function resolveSignature(node: CallLikeExpression, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode, contextFlags?: ContextFlags ): Signature {
22656
22652
switch (node.kind) {
22657
22653
case SyntaxKind.CallExpression:
22658
- return resolveCallExpression(node, candidatesOutArray, checkMode);
22654
+ return resolveCallExpression(node, candidatesOutArray, checkMode, contextFlags );
22659
22655
case SyntaxKind.NewExpression:
22660
22656
return resolveNewExpression(node, candidatesOutArray, checkMode);
22661
22657
case SyntaxKind.TaggedTemplateExpression:
@@ -22676,7 +22672,7 @@ namespace ts {
22676
22672
* the function will fill it up with appropriate candidate signatures
22677
22673
* @return a signature of the call-like expression or undefined if one can't be found
22678
22674
*/
22679
- function getResolvedSignature(node: CallLikeExpression, candidatesOutArray?: Signature[] | undefined, checkMode?: CheckMode): Signature {
22675
+ function getResolvedSignature(node: CallLikeExpression, candidatesOutArray?: Signature[] | undefined, checkMode?: CheckMode, contextFlags?: ContextFlags ): Signature {
22680
22676
const links = getNodeLinks(node);
22681
22677
// If getResolvedSignature has already been called, we will have cached the resolvedSignature.
22682
22678
// However, it is possible that either candidatesOutArray was not passed in the first time,
@@ -22687,7 +22683,7 @@ namespace ts {
22687
22683
return cached;
22688
22684
}
22689
22685
links.resolvedSignature = resolvingSignature;
22690
- const result = resolveSignature(node, candidatesOutArray, checkMode || CheckMode.Normal);
22686
+ const result = resolveSignature(node, candidatesOutArray, checkMode || CheckMode.Normal, contextFlags );
22691
22687
// When CheckMode.SkipGenericFunctions is set we use resolvingSignature to indicate that call
22692
22688
// resolution should be deferred.
22693
22689
if (result !== resolvingSignature) {
0 commit comments