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