Skip to content

Commit f21903b

Browse files
committed
Propegate variance a bit more selectively
1 parent 20c928e commit f21903b

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

src/compiler/checker.ts

+12-9
Original file line numberDiff line numberDiff line change
@@ -12981,13 +12981,16 @@ namespace ts {
1298112981
return result;
1298212982
}
1298312983

12984-
function propegateSidebandVarianceFlags(variances: VarianceFlags[]) {
12984+
function propegateSidebandVarianceFlags(typeArguments: readonly Type[], variances: VarianceFlags[]) {
1298512985
if (outofbandVarianceMarkerHandler) {
12986-
if (some(variances, v => !!(v & VarianceFlags.Unmeasurable))) {
12987-
outofbandVarianceMarkerHandler(/*onlyUnreliable*/ false);
12988-
}
12989-
if (some(variances, v => !!(v & VarianceFlags.Unreliable))) {
12990-
outofbandVarianceMarkerHandler(/*onlyUnreliable*/ true);
12986+
for (let i = 0; i < variances.length; i++) {
12987+
const v = variances[i];
12988+
if (v & VarianceFlags.Unmeasurable) {
12989+
instantiateType(typeArguments[i], reportUnmeasurableMarkers);
12990+
}
12991+
if (v & VarianceFlags.Unreliable) {
12992+
instantiateType(typeArguments[i], reportUnreliableMarkers);
12993+
}
1299112994
}
1299212995
}
1299312996
}
@@ -13013,10 +13016,10 @@ namespace ts {
1301313016
// We're in the middle of variance checking - integrate any unmeasurable/unreliable flags from this cached component
1301413017
if (source.flags & (TypeFlags.Object | TypeFlags.Conditional) && source.aliasSymbol &&
1301513018
source.aliasTypeArguments && source.aliasSymbol === target.aliasSymbol) {
13016-
propegateSidebandVarianceFlags(getAliasVariances(source.aliasSymbol));
13019+
propegateSidebandVarianceFlags(source.aliasTypeArguments, getAliasVariances(source.aliasSymbol));
1301713020
}
13018-
if (getObjectFlags(source) & ObjectFlags.Reference && getObjectFlags(target) & ObjectFlags.Reference && (<TypeReference>source).target === (<TypeReference>target).target) {
13019-
propegateSidebandVarianceFlags(getVariances((<TypeReference>source).target));
13021+
if (getObjectFlags(source) & ObjectFlags.Reference && getObjectFlags(target) & ObjectFlags.Reference && (<TypeReference>source).target === (<TypeReference>target).target && length((<TypeReference>source).typeArguments)) {
13022+
propegateSidebandVarianceFlags((<TypeReference>source).typeArguments!, getVariances((<TypeReference>source).target));
1302013023
}
1302113024
}
1302213025
return related === RelationComparisonResult.Succeeded ? Ternary.True : Ternary.False;

0 commit comments

Comments
 (0)