@@ -3882,19 +3882,19 @@ object Types {
3882
3882
else if (variance < 0 ) lo
3883
3883
else Range (lower(lo), upper(hi))
3884
3884
3885
- private def isRange (tp : Type ) = tp.isInstanceOf [Range ]
3885
+ protected def isRange (tp : Type ) = tp.isInstanceOf [Range ]
3886
3886
3887
- private def lower (tp : Type ) = tp match {
3887
+ protected def lower (tp : Type ) = tp match {
3888
3888
case tp : Range => tp.lo
3889
3889
case _ => tp
3890
3890
}
3891
3891
3892
- private def upper (tp : Type ) = tp match {
3892
+ protected def upper (tp : Type ) = tp match {
3893
3893
case tp : Range => tp.hi
3894
3894
case _ => tp
3895
3895
}
3896
3896
3897
- private def rangeToBounds (tp : Type ) = tp match {
3897
+ protected def rangeToBounds (tp : Type ) = tp match {
3898
3898
case Range (lo, hi) => TypeBounds (lo, hi)
3899
3899
case _ => tp
3900
3900
}
@@ -3905,11 +3905,14 @@ object Types {
3905
3905
try op finally variance = saved
3906
3906
}
3907
3907
3908
+ /** Derived selection.
3909
+ * @pre the (upper bound of) prefix `pre` has a member named `tp.name`.
3910
+ */
3908
3911
override protected def derivedSelect (tp : NamedType , pre : Type ) =
3909
3912
if (pre eq tp.prefix) tp
3910
3913
else pre match {
3911
3914
case Range (preLo, preHi) =>
3912
- preHi.member(tp.name).info match {
3915
+ preHi.member(tp.name).info.widenExpr match {
3913
3916
case TypeAlias (alias) =>
3914
3917
// if H#T = U, then for any x in L..H, x.T =:= U,
3915
3918
// hence we can replace with U under all variances
@@ -3935,12 +3938,22 @@ object Types {
3935
3938
case _ =>
3936
3939
if (parent.isBottomType) parent
3937
3940
else info match {
3938
- case Range (infoLo, infoHi) if tp.refinedName.isTermName || variance <= 0 =>
3939
- range(derivedRefinedType(tp, parent, infoLo), derivedRefinedType(tp, parent, infoHi))
3941
+ case Range (infoLo, infoHi) =>
3942
+ def propagate (lo : Type , hi : Type ) =
3943
+ range(derivedRefinedType(tp, parent, lo), derivedRefinedType(tp, parent, hi))
3944
+ tp.refinedInfo match {
3945
+ case rinfo : TypeBounds =>
3946
+ val v = if (rinfo.isAlias) rinfo.variance * variance else variance
3947
+ if (v > 0 ) tp.derivedRefinedType(parent, tp.refinedName, rangeToBounds(info))
3948
+ else if (v < 0 ) propagate(infoHi, infoLo)
3949
+ else range(tp.bottomType, tp.topType)
3950
+ case _ =>
3951
+ propagate(infoLo, infoHi)
3952
+ }
3940
3953
case _ =>
3941
- tp.derivedRefinedType(parent, tp.refinedName, rangeToBounds( info) )
3954
+ tp.derivedRefinedType(parent, tp.refinedName, info)
3942
3955
}
3943
- }
3956
+ }
3944
3957
3945
3958
override protected def derivedRecType (tp : RecType , parent : Type ) =
3946
3959
parent match {
@@ -3971,7 +3984,7 @@ object Types {
3971
3984
case Range (tyconLo, tyconHi) =>
3972
3985
range(derivedAppliedType(tp, tyconLo, args), derivedAppliedType(tp, tyconHi, args))
3973
3986
case _ =>
3974
- if (args.exists(isRange))
3987
+ if (args.exists(isRange)) {
3975
3988
if (variance > 0 ) tp.derivedAppliedType(tycon, args.map(rangeToBounds))
3976
3989
else {
3977
3990
val loBuf, hiBuf = new mutable.ListBuffer [Type ]
@@ -3993,6 +4006,7 @@ object Types {
3993
4006
tp.derivedAppliedType(tycon, hiBuf.toList))
3994
4007
else range(tp.bottomType, tp.topType)
3995
4008
}
4009
+ }
3996
4010
else tp.derivedAppliedType(tycon, args)
3997
4011
}
3998
4012
0 commit comments