Merge pull request #32362 from microsoft/fix32230

Fix type parameter inference cache invalidation logic
This commit is contained in:
Anders Hejlsberg
2019-07-12 16:57:34 -07:00
committed by GitHub
5 changed files with 199 additions and 4 deletions

View File

@@ -15266,8 +15266,8 @@ namespace ts {
const inference = inferences[i];
if (t === inference.typeParameter) {
if (fix && !inference.isFixed) {
clearCachedInferences(inferences);
inference.isFixed = true;
inference.inferredType = undefined;
}
return getInferredType(context, i);
}
@@ -15275,6 +15275,14 @@ namespace ts {
return t;
}
function clearCachedInferences(inferences: InferenceInfo[]) {
for (const inference of inferences) {
if (!inference.isFixed) {
inference.inferredType = undefined;
}
}
}
function createInferenceInfo(typeParameter: TypeParameter): InferenceInfo {
return {
typeParameter,
@@ -15554,17 +15562,17 @@ namespace ts {
if (contravariant && !bivariant) {
if (!contains(inference.contraCandidates, candidate)) {
inference.contraCandidates = append(inference.contraCandidates, candidate);
inference.inferredType = undefined;
clearCachedInferences(inferences);
}
}
else if (!contains(inference.candidates, candidate)) {
inference.candidates = append(inference.candidates, candidate);
inference.inferredType = undefined;
clearCachedInferences(inferences);
}
}
if (!(priority & InferencePriority.ReturnType) && target.flags & TypeFlags.TypeParameter && inference.topLevel && !isTypeParameterAtTopLevel(originalTarget, <TypeParameter>target)) {
inference.topLevel = false;
inference.inferredType = undefined;
clearCachedInferences(inferences);
}
}
return;