mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-06-10 18:04:18 -05:00
Avoid caching resolved signatures for language service requests like signature help (#52679)
This commit is contained in:
committed by
GitHub
parent
f23dd7a7b2
commit
ab40f5e5d0
@@ -1637,9 +1637,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
||||
getResolvedSignature: (node, candidatesOutArray, argumentCount) =>
|
||||
getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.Normal),
|
||||
getResolvedSignatureForStringLiteralCompletions: (call, editingArgument, candidatesOutArray) =>
|
||||
getResolvedSignatureWorker(call, candidatesOutArray, /*argumentCount*/ undefined, CheckMode.IsForStringLiteralArgumentCompletions, editingArgument),
|
||||
runWithInferenceBlockedFromSourceNode(editingArgument, () => getResolvedSignatureWorker(call, candidatesOutArray, /*argumentCount*/ undefined, CheckMode.IsForStringLiteralArgumentCompletions)),
|
||||
getResolvedSignatureForSignatureHelp: (node, candidatesOutArray, argumentCount) =>
|
||||
getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.IsForSignatureHelp),
|
||||
runWithoutResolvedSignatureCaching(node, () => getResolvedSignatureWorker(node, candidatesOutArray, argumentCount, CheckMode.IsForSignatureHelp)),
|
||||
getExpandedParameters,
|
||||
hasEffectiveRestParameter,
|
||||
containsArgumentsReference,
|
||||
@@ -1814,36 +1814,43 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
||||
isTypeParameterPossiblyReferenced,
|
||||
};
|
||||
|
||||
function runWithInferenceBlockedFromSourceNode<T>(node: Node | undefined, fn: () => T): T {
|
||||
function runWithoutResolvedSignatureCaching<T>(node: Node | undefined, fn: () => T): T {
|
||||
const containingCall = findAncestor(node, isCallLikeExpression);
|
||||
const containingCallResolvedSignature = containingCall && getNodeLinks(containingCall).resolvedSignature;
|
||||
if (containingCall) {
|
||||
getNodeLinks(containingCall).resolvedSignature = undefined;
|
||||
}
|
||||
const result = fn();
|
||||
if (containingCall) {
|
||||
getNodeLinks(containingCall).resolvedSignature = containingCallResolvedSignature;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function runWithInferenceBlockedFromSourceNode<T>(node: Node | undefined, fn: () => T): T {
|
||||
const containingCall = findAncestor(node, isCallLikeExpression);
|
||||
if (containingCall) {
|
||||
let toMarkSkip = node!;
|
||||
do {
|
||||
getNodeLinks(toMarkSkip).skipDirectInference = true;
|
||||
toMarkSkip = toMarkSkip.parent;
|
||||
} while (toMarkSkip && toMarkSkip !== containingCall);
|
||||
getNodeLinks(containingCall).resolvedSignature = undefined;
|
||||
}
|
||||
const result = fn();
|
||||
const result = runWithoutResolvedSignatureCaching(node, fn);
|
||||
if (containingCall) {
|
||||
let toMarkSkip = node!;
|
||||
do {
|
||||
getNodeLinks(toMarkSkip).skipDirectInference = undefined;
|
||||
toMarkSkip = toMarkSkip.parent;
|
||||
} while (toMarkSkip && toMarkSkip !== containingCall);
|
||||
getNodeLinks(containingCall).resolvedSignature = containingCallResolvedSignature;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function getResolvedSignatureWorker(nodeIn: CallLikeExpression, candidatesOutArray: Signature[] | undefined, argumentCount: number | undefined, checkMode: CheckMode, editingArgument?: Node): Signature | undefined {
|
||||
function getResolvedSignatureWorker(nodeIn: CallLikeExpression, candidatesOutArray: Signature[] | undefined, argumentCount: number | undefined, checkMode: CheckMode): Signature | undefined {
|
||||
const node = getParseTreeNode(nodeIn, isCallLikeExpression);
|
||||
apparentArgumentCount = argumentCount;
|
||||
const res =
|
||||
!node ? undefined :
|
||||
editingArgument ? runWithInferenceBlockedFromSourceNode(editingArgument, () => getResolvedSignature(node, candidatesOutArray, checkMode)) :
|
||||
getResolvedSignature(node, candidatesOutArray, checkMode);
|
||||
const res = !node ? undefined : getResolvedSignature(node, candidatesOutArray, checkMode);
|
||||
apparentArgumentCount = undefined;
|
||||
return res;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user