@@ -1657,8 +1657,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
16571657 getFullyQualifiedName,
16581658 getResolvedSignature: (node, candidatesOutArray, argumentCount) =>
16591659 getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.Normal),
1660- getResolvedSignatureForStringLiteralCompletions: (call, editingArgument, candidatesOutArray) =>
1661- runWithInferenceBlockedFromSourceNode(editingArgument, () => getResolvedSignatureWorker(call, candidatesOutArray, /*argumentCount*/ undefined, CheckMode.IsForStringLiteralArgumentCompletions)),
1660+ getCandidateSignaturesForStringLiteralCompletions,
16621661 getResolvedSignatureForSignatureHelp: (node, candidatesOutArray, argumentCount) =>
16631662 runWithoutResolvedSignatureCaching(node, () => getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.IsForSignatureHelp)),
16641663 getExpandedParameters,
@@ -1839,17 +1838,41 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
18391838 typeHasCallOrConstructSignatures,
18401839 };
18411840
1841+ function getCandidateSignaturesForStringLiteralCompletions(call: CallLikeExpression, editingArgument: Node) {
1842+ const candidatesSet = new Set<Signature>();
1843+ const candidates: Signature[] = [];
1844+
1845+ // first, get candidates when inference is blocked from the source node.
1846+ runWithInferenceBlockedFromSourceNode(editingArgument, () => getResolvedSignatureWorker(call, candidates, /*argumentCount*/ undefined, CheckMode.IsForStringLiteralArgumentCompletions));
1847+ for (const candidate of candidates) {
1848+ candidatesSet.add(candidate);
1849+ }
1850+
1851+ // reset candidates for second pass
1852+ candidates.length = 0;
1853+
1854+ // next, get candidates where the source node is considered for inference.
1855+ runWithoutResolvedSignatureCaching(editingArgument, () => getResolvedSignatureWorker(call, candidates, /*argumentCount*/ undefined, CheckMode.IsForStringLiteralArgumentCompletions));
1856+ for (const candidate of candidates) {
1857+ candidatesSet.add(candidate);
1858+ }
1859+
1860+ return arrayFrom(candidatesSet);
1861+ }
1862+
18421863 function runWithoutResolvedSignatureCaching<T>(node: Node | undefined, fn: () => T): T {
18431864 const containingCall = findAncestor(node, isCallLikeExpression);
1844- const containingCallResolvedSignature = containingCall && getNodeLinks(containingCall).resolvedSignature;
18451865 if (containingCall) {
1846- getNodeLinks(containingCall).resolvedSignature = undefined;
1866+ const links = getNodeLinks(containingCall);
1867+ const containingCallResolvedSignature = links.resolvedSignature;
1868+ links.resolvedSignature = undefined;
1869+ const result = fn();
1870+ links.resolvedSignature = containingCallResolvedSignature;
1871+ return result;
18471872 }
1848- const result = fn();
1849- if (containingCall) {
1850- getNodeLinks(containingCall).resolvedSignature = containingCallResolvedSignature;
1873+ else {
1874+ return fn();
18511875 }
1852- return result;
18531876 }
18541877
18551878 function runWithInferenceBlockedFromSourceNode<T>(node: Node | undefined, fn: () => T): T {
0 commit comments