Add quick path for computing array variance as it is already known

This commit is contained in:
Anders Hejlsberg
2017-09-18 13:56:59 -07:00
parent f8ff7f7365
commit 670d7113da

View File

@@ -9832,19 +9832,26 @@ namespace ts {
const typeParameters = type.typeParameters || emptyArray;
let variances = type.variances;
if (!variances) {
variances = type.variances = [];
for (const tp of typeParameters) {
const superType = getVarianceType(type, tp, markerSuperType);
const subType = getVarianceType(type, tp, markerSubType);
let variance = (isTypeAssignableTo(subType, superType) ? Variance.Covariant : 0) |
(isTypeAssignableTo(superType, subType) ? Variance.Contravariant : 0);
if (variance === Variance.Bivariant && isTypeAssignableTo(getVarianceType(type, tp, markerOtherType), superType)) {
variance = Variance.Omnivariant;
}
variances.push(variance);
if (type === globalArrayType || type === globalReadonlyArrayType) {
variances = [Variance.Covariant];
}
else {
type.variances = emptyArray;
variances = [];
for (const tp of typeParameters) {
const superType = getVarianceType(type, tp, markerSuperType);
const subType = getVarianceType(type, tp, markerSubType);
let variance = (isTypeAssignableTo(subType, superType) ? Variance.Covariant : 0) |
(isTypeAssignableTo(superType, subType) ? Variance.Contravariant : 0);
if (variance === Variance.Bivariant && isTypeAssignableTo(getVarianceType(type, tp, markerOtherType), superType)) {
variance = Variance.Omnivariant;
}
variances.push(variance);
}
}
type.variances = variances;
}
return variances.length === typeParameters.length ? variances : emptyArray;
return variances;
}
function isUnconstrainedTypeParameter(type: Type) {