@@ -198,13 +198,10 @@ namespace ts {
198
198
},
199
199
isContextSensitive,
200
200
getFullyQualifiedName,
201
- getResolvedSignature: (nodeIn, candidatesOutArray, theArgumentCount) => {
202
- const node = getParseTreeNode(nodeIn, isCallLikeExpression);
203
- apparentArgumentCount = theArgumentCount;
204
- const res = node ? getResolvedSignature(node, candidatesOutArray) : undefined;
205
- apparentArgumentCount = undefined;
206
- return res;
207
- },
201
+ getResolvedSignature: (node, candidatesOutArray, agumentCount) =>
202
+ getResolvedSignatureWorker(node, candidatesOutArray, agumentCount, /*isForSignatureHelp*/ false),
203
+ getResolvedSignatureForSignatureHelp: (node, candidatesOutArray, agumentCount) =>
204
+ getResolvedSignatureWorker(node, candidatesOutArray, agumentCount, /*isForSignatureHelp*/ true),
208
205
getConstantValue: nodeIn => {
209
206
const node = getParseTreeNode(nodeIn, canHaveConstantValue);
210
207
return node ? getConstantValue(node) : undefined;
@@ -354,6 +351,14 @@ namespace ts {
354
351
}
355
352
};
356
353
354
+ function getResolvedSignatureWorker(nodeIn: CallLikeExpression, candidatesOutArray: Signature[] | undefined, argumentCount: number | undefined, isForSignatureHelp: boolean): Signature | undefined {
355
+ const node = getParseTreeNode(nodeIn, isCallLikeExpression);
356
+ apparentArgumentCount = argumentCount;
357
+ const res = node ? getResolvedSignature(node, candidatesOutArray, isForSignatureHelp) : undefined;
358
+ apparentArgumentCount = undefined;
359
+ return res;
360
+ }
361
+
357
362
const tupleTypes = createMap<GenericType>();
358
363
const unionTypes = createMap<UnionType>();
359
364
const intersectionTypes = createMap<IntersectionType>();
@@ -17194,7 +17199,7 @@ namespace ts {
17194
17199
const jsxStatelessElementType = getJsxStatelessElementTypeAt(openingLikeElement);
17195
17200
if (jsxStatelessElementType) {
17196
17201
// We don't call getResolvedSignature here because we have already resolve the type of JSX Element.
17197
- const callSignature = getResolvedJsxStatelessFunctionSignature(openingLikeElement, elementType, /*candidatesOutArray*/ undefined);
17202
+ const callSignature = getResolvedJsxStatelessFunctionSignature(openingLikeElement, elementType, /*candidatesOutArray*/ undefined, /*isForSignatureHelp*/ false );
17198
17203
if (callSignature !== unknownSignature) {
17199
17204
const callReturnType = callSignature && getReturnTypeOfSignature(callSignature);
17200
17205
let paramType = callReturnType && (callSignature!.parameters.length === 0 ? emptyObjectType : getTypeOfSymbol(callSignature!.parameters[0]));
@@ -17231,7 +17236,7 @@ namespace ts {
17231
17236
if (jsxStatelessElementType) {
17232
17237
// We don't call getResolvedSignature because here we have already resolve the type of JSX Element.
17233
17238
const candidatesOutArray: Signature[] = [];
17234
- getResolvedJsxStatelessFunctionSignature(openingLikeElement, elementType, candidatesOutArray);
17239
+ getResolvedJsxStatelessFunctionSignature(openingLikeElement, elementType, candidatesOutArray, /*isForSignatureHelp*/ false );
17235
17240
let result: Type | undefined;
17236
17241
let allMatchingAttributesType: Type | undefined;
17237
17242
for (const candidate of candidatesOutArray) {
@@ -19094,7 +19099,7 @@ namespace ts {
19094
19099
return createDiagnosticForNodeArray(getSourceFileOfNode(node), typeArguments, Diagnostics.Expected_0_type_arguments_but_got_1, paramCount, typeArguments.length);
19095
19100
}
19096
19101
19097
- function resolveCall(node: CallLikeExpression, signatures: ReadonlyArray<Signature>, candidatesOutArray: Signature[] | undefined, fallbackError?: DiagnosticMessage): Signature {
19102
+ function resolveCall(node: CallLikeExpression, signatures: ReadonlyArray<Signature>, candidatesOutArray: Signature[] | undefined, isForSignatureHelp: boolean, fallbackError?: DiagnosticMessage): Signature {
19098
19103
const isTaggedTemplate = node.kind === SyntaxKind.TaggedTemplateExpression;
19099
19104
const isDecorator = node.kind === SyntaxKind.Decorator;
19100
19105
const isJsxOpeningOrSelfClosingElement = isJsxOpeningLikeElement(node);
@@ -19180,7 +19185,7 @@ namespace ts {
19180
19185
// If we are in signature help, a trailing comma indicates that we intend to provide another argument,
19181
19186
// so we will only accept overloads with arity at least 1 higher than the current number of provided arguments.
19182
19187
const signatureHelpTrailingComma =
19183
- candidatesOutArray && node.kind === SyntaxKind.CallExpression && node.arguments.hasTrailingComma;
19188
+ isForSignatureHelp && node.kind === SyntaxKind.CallExpression && node.arguments.hasTrailingComma;
19184
19189
19185
19190
// Section 4.12.1:
19186
19191
// if the candidate list contains one or more signatures for which the type of each argument
@@ -19422,7 +19427,7 @@ namespace ts {
19422
19427
return maxParamsIndex;
19423
19428
}
19424
19429
19425
- function resolveCallExpression(node: CallExpression, candidatesOutArray: Signature[] | undefined): Signature {
19430
+ function resolveCallExpression(node: CallExpression, candidatesOutArray: Signature[] | undefined, isForSignatureHelp: boolean ): Signature {
19426
19431
if (node.expression.kind === SyntaxKind.SuperKeyword) {
19427
19432
const superType = checkSuperExpression(node.expression);
19428
19433
if (isTypeAny(superType)) {
@@ -19437,7 +19442,7 @@ namespace ts {
19437
19442
const baseTypeNode = getEffectiveBaseTypeNode(getContainingClass(node)!);
19438
19443
if (baseTypeNode) {
19439
19444
const baseConstructors = getInstantiatedConstructorsForTypeArguments(superType, baseTypeNode.typeArguments, baseTypeNode);
19440
- return resolveCall(node, baseConstructors, candidatesOutArray);
19445
+ return resolveCall(node, baseConstructors, candidatesOutArray, isForSignatureHelp );
19441
19446
}
19442
19447
}
19443
19448
return resolveUntypedCall(node);
@@ -19490,7 +19495,7 @@ namespace ts {
19490
19495
}
19491
19496
return resolveErrorCall(node);
19492
19497
}
19493
- return resolveCall(node, callSignatures, candidatesOutArray);
19498
+ return resolveCall(node, callSignatures, candidatesOutArray, isForSignatureHelp );
19494
19499
}
19495
19500
19496
19501
/**
@@ -19504,7 +19509,7 @@ namespace ts {
19504
19509
!numCallSignatures && !numConstructSignatures && !(apparentFuncType.flags & (TypeFlags.Union | TypeFlags.Never)) && isTypeAssignableTo(funcType, globalFunctionType);
19505
19510
}
19506
19511
19507
- function resolveNewExpression(node: NewExpression, candidatesOutArray: Signature[] | undefined): Signature {
19512
+ function resolveNewExpression(node: NewExpression, candidatesOutArray: Signature[] | undefined, isForSignatureHelp: boolean ): Signature {
19508
19513
if (node.arguments && languageVersion < ScriptTarget.ES5) {
19509
19514
const spreadIndex = getSpreadArgumentIndex(node.arguments);
19510
19515
if (spreadIndex >= 0) {
@@ -19557,7 +19562,7 @@ namespace ts {
19557
19562
return resolveErrorCall(node);
19558
19563
}
19559
19564
19560
- return resolveCall(node, constructSignatures, candidatesOutArray);
19565
+ return resolveCall(node, constructSignatures, candidatesOutArray, isForSignatureHelp );
19561
19566
}
19562
19567
19563
19568
// If expressionType's apparent type is an object type with no construct signatures but
@@ -19566,7 +19571,7 @@ namespace ts {
19566
19571
// operation is Any. It is an error to have a Void this type.
19567
19572
const callSignatures = getSignaturesOfType(expressionType, SignatureKind.Call);
19568
19573
if (callSignatures.length) {
19569
- const signature = resolveCall(node, callSignatures, candidatesOutArray);
19574
+ const signature = resolveCall(node, callSignatures, candidatesOutArray, isForSignatureHelp );
19570
19575
if (!isJavaScriptConstructor(signature.declaration) && getReturnTypeOfSignature(signature) !== voidType) {
19571
19576
error(node, Diagnostics.Only_a_void_function_can_be_called_with_the_new_keyword);
19572
19577
}
@@ -19673,7 +19678,7 @@ namespace ts {
19673
19678
}
19674
19679
}
19675
19680
19676
- function resolveTaggedTemplateExpression(node: TaggedTemplateExpression, candidatesOutArray: Signature[] | undefined): Signature {
19681
+ function resolveTaggedTemplateExpression(node: TaggedTemplateExpression, candidatesOutArray: Signature[] | undefined, isForSignatureHelp: boolean ): Signature {
19677
19682
const tagType = checkExpression(node.tag);
19678
19683
const apparentType = getApparentType(tagType);
19679
19684
@@ -19694,7 +19699,7 @@ namespace ts {
19694
19699
return resolveErrorCall(node);
19695
19700
}
19696
19701
19697
- return resolveCall(node, callSignatures, candidatesOutArray);
19702
+ return resolveCall(node, callSignatures, candidatesOutArray, isForSignatureHelp );
19698
19703
}
19699
19704
19700
19705
/**
@@ -19725,7 +19730,7 @@ namespace ts {
19725
19730
/**
19726
19731
* Resolves a decorator as if it were a call expression.
19727
19732
*/
19728
- function resolveDecorator(node: Decorator, candidatesOutArray: Signature[] | undefined): Signature {
19733
+ function resolveDecorator(node: Decorator, candidatesOutArray: Signature[] | undefined, isForSignatureHelp: boolean ): Signature {
19729
19734
const funcType = checkExpression(node.expression);
19730
19735
const apparentType = getApparentType(funcType);
19731
19736
if (apparentType === errorType) {
@@ -19754,7 +19759,7 @@ namespace ts {
19754
19759
return resolveErrorCall(node);
19755
19760
}
19756
19761
19757
- return resolveCall(node, callSignatures, candidatesOutArray, headMessage);
19762
+ return resolveCall(node, callSignatures, candidatesOutArray, isForSignatureHelp, headMessage);
19758
19763
}
19759
19764
19760
19765
/**
@@ -19779,32 +19784,32 @@ namespace ts {
19779
19784
* @param candidatesOutArray an array of signature to be filled in by the function. It is passed by signature help in the language service;
19780
19785
* the function will fill it up with appropriate candidate signatures
19781
19786
*/
19782
- function getResolvedJsxStatelessFunctionSignature(openingLikeElement: JsxOpeningLikeElement, elementType: Type, candidatesOutArray: Signature[] | undefined): Signature | undefined {
19787
+ function getResolvedJsxStatelessFunctionSignature(openingLikeElement: JsxOpeningLikeElement, elementType: Type, candidatesOutArray: Signature[] | undefined, isForSignatureHelp: boolean ): Signature | undefined {
19783
19788
Debug.assert(!(elementType.flags & TypeFlags.Union));
19784
19789
const callSignatures = elementType && getSignaturesOfType(elementType, SignatureKind.Call);
19785
19790
if (callSignatures && callSignatures.length > 0) {
19786
- return resolveCall(openingLikeElement, callSignatures, candidatesOutArray);
19791
+ return resolveCall(openingLikeElement, callSignatures, candidatesOutArray, isForSignatureHelp );
19787
19792
}
19788
19793
19789
19794
return undefined;
19790
19795
}
19791
19796
19792
- function resolveSignature(node: CallLikeExpression, candidatesOutArray? : Signature[]): Signature {
19797
+ function resolveSignature(node: CallLikeExpression, candidatesOutArray: Signature[] | undefined, isForSignatureHelp: boolean ): Signature {
19793
19798
switch (node.kind) {
19794
19799
case SyntaxKind.CallExpression:
19795
- return resolveCallExpression(node, candidatesOutArray);
19800
+ return resolveCallExpression(node, candidatesOutArray, isForSignatureHelp );
19796
19801
case SyntaxKind.NewExpression:
19797
- return resolveNewExpression(node, candidatesOutArray);
19802
+ return resolveNewExpression(node, candidatesOutArray, isForSignatureHelp );
19798
19803
case SyntaxKind.TaggedTemplateExpression:
19799
- return resolveTaggedTemplateExpression(node, candidatesOutArray);
19804
+ return resolveTaggedTemplateExpression(node, candidatesOutArray, isForSignatureHelp );
19800
19805
case SyntaxKind.Decorator:
19801
- return resolveDecorator(node, candidatesOutArray);
19806
+ return resolveDecorator(node, candidatesOutArray, isForSignatureHelp );
19802
19807
case SyntaxKind.JsxOpeningElement:
19803
19808
case SyntaxKind.JsxSelfClosingElement:
19804
19809
// This code-path is called by language service
19805
19810
const exprTypes = checkExpression(node.tagName);
19806
19811
return forEachType(exprTypes, exprType => {
19807
- const sfcResult = getResolvedJsxStatelessFunctionSignature(node, exprType, candidatesOutArray);
19812
+ const sfcResult = getResolvedJsxStatelessFunctionSignature(node, exprType, candidatesOutArray, isForSignatureHelp );
19808
19813
if (sfcResult && sfcResult !== unknownSignature) {
19809
19814
return sfcResult;
19810
19815
}
@@ -19825,7 +19830,7 @@ namespace ts {
19825
19830
* the function will fill it up with appropriate candidate signatures
19826
19831
* @return a signature of the call-like expression or undefined if one can't be found
19827
19832
*/
19828
- function getResolvedSignature(node: CallLikeExpression, candidatesOutArray?: Signature[]): Signature {
19833
+ function getResolvedSignature(node: CallLikeExpression, candidatesOutArray?: Signature[] | undefined, isForSignatureHelp = false ): Signature {
19829
19834
const links = getNodeLinks(node);
19830
19835
// If getResolvedSignature has already been called, we will have cached the resolvedSignature.
19831
19836
// However, it is possible that either candidatesOutArray was not passed in the first time,
@@ -19836,7 +19841,7 @@ namespace ts {
19836
19841
return cached;
19837
19842
}
19838
19843
links.resolvedSignature = resolvingSignature;
19839
- const result = resolveSignature(node, candidatesOutArray);
19844
+ const result = resolveSignature(node, candidatesOutArray, isForSignatureHelp );
19840
19845
// If signature resolution originated in control flow type analysis (for example to compute the
19841
19846
// assigned type in a flow assignment) we don't cache the result as it may be based on temporary
19842
19847
// types from the control flow analysis.
0 commit comments