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