@@ -1637,9 +1637,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1637
1637
getResolvedSignature: (node, candidatesOutArray, argumentCount) =>
1638
1638
getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.Normal),
1639
1639
getResolvedSignatureForStringLiteralCompletions: (call, editingArgument, candidatesOutArray) =>
1640
- getResolvedSignatureWorker(call, candidatesOutArray, /*argumentCount*/ undefined, CheckMode.IsForStringLiteralArgumentCompletions, editingArgument ),
1640
+ runWithInferenceBlockedFromSourceNode(editingArgument, () => getResolvedSignatureWorker(call, candidatesOutArray, /*argumentCount*/ undefined, CheckMode.IsForStringLiteralArgumentCompletions) ),
1641
1641
getResolvedSignatureForSignatureHelp: (node, candidatesOutArray, argumentCount) =>
1642
- getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.IsForSignatureHelp),
1642
+ runWithoutResolvedSignatureCaching(node, () => getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.IsForSignatureHelp) ),
1643
1643
getExpandedParameters,
1644
1644
hasEffectiveRestParameter,
1645
1645
containsArgumentsReference,
@@ -1814,36 +1814,43 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1814
1814
isTypeParameterPossiblyReferenced,
1815
1815
};
1816
1816
1817
- function runWithInferenceBlockedFromSourceNode <T>(node: Node | undefined, fn: () => T): T {
1817
+ function runWithoutResolvedSignatureCaching <T>(node: Node | undefined, fn: () => T): T {
1818
1818
const containingCall = findAncestor(node, isCallLikeExpression);
1819
1819
const containingCallResolvedSignature = containingCall && getNodeLinks(containingCall).resolvedSignature;
1820
+ if (containingCall) {
1821
+ getNodeLinks(containingCall).resolvedSignature = undefined;
1822
+ }
1823
+ const result = fn();
1824
+ if (containingCall) {
1825
+ getNodeLinks(containingCall).resolvedSignature = containingCallResolvedSignature;
1826
+ }
1827
+ return result;
1828
+ }
1829
+
1830
+ function runWithInferenceBlockedFromSourceNode<T>(node: Node | undefined, fn: () => T): T {
1831
+ const containingCall = findAncestor(node, isCallLikeExpression);
1820
1832
if (containingCall) {
1821
1833
let toMarkSkip = node!;
1822
1834
do {
1823
1835
getNodeLinks(toMarkSkip).skipDirectInference = true;
1824
1836
toMarkSkip = toMarkSkip.parent;
1825
1837
} while (toMarkSkip && toMarkSkip !== containingCall);
1826
- getNodeLinks(containingCall).resolvedSignature = undefined;
1827
1838
}
1828
- const result = fn( );
1839
+ const result = runWithoutResolvedSignatureCaching(node, fn );
1829
1840
if (containingCall) {
1830
1841
let toMarkSkip = node!;
1831
1842
do {
1832
1843
getNodeLinks(toMarkSkip).skipDirectInference = undefined;
1833
1844
toMarkSkip = toMarkSkip.parent;
1834
1845
} while (toMarkSkip && toMarkSkip !== containingCall);
1835
- getNodeLinks(containingCall).resolvedSignature = containingCallResolvedSignature;
1836
1846
}
1837
1847
return result;
1838
1848
}
1839
1849
1840
- function getResolvedSignatureWorker(nodeIn: CallLikeExpression, candidatesOutArray: Signature[] | undefined, argumentCount: number | undefined, checkMode: CheckMode, editingArgument?: Node ): Signature | undefined {
1850
+ function getResolvedSignatureWorker(nodeIn: CallLikeExpression, candidatesOutArray: Signature[] | undefined, argumentCount: number | undefined, checkMode: CheckMode): Signature | undefined {
1841
1851
const node = getParseTreeNode(nodeIn, isCallLikeExpression);
1842
1852
apparentArgumentCount = argumentCount;
1843
- const res =
1844
- !node ? undefined :
1845
- editingArgument ? runWithInferenceBlockedFromSourceNode(editingArgument, () => getResolvedSignature(node, candidatesOutArray, checkMode)) :
1846
- getResolvedSignature(node, candidatesOutArray, checkMode);
1853
+ const res = !node ? undefined : getResolvedSignature(node, candidatesOutArray, checkMode);
1847
1854
apparentArgumentCount = undefined;
1848
1855
return res;
1849
1856
}
0 commit comments