@@ -19,6 +19,7 @@ import config.Printers.{constr, typr}
1919 * Constraint handlers update the current constraint as a side effect.
2020 */
2121trait ConstraintHandling {
22+ import Constraint ._
2223
2324 def constr_println (msg : => String ): Unit = constr.println(msg)
2425 def typr_println (msg : => String ): Unit = typr.println(msg)
@@ -60,13 +61,13 @@ trait ConstraintHandling {
6061 */
6162 def instType (tvar : TypeVar ): Type = constraint.entry(tvar.origin) match {
6263 case _ : TypeBounds => NoType
63- case tp : TypeParamRef =>
64+ case tp : VarRef =>
6465 var tvar1 = constraint.typeVarOfParam(tp)
6566 if (tvar1.exists) tvar1 else tp
6667 case tp => tp
6768 }
6869
69- protected def addOneBound (param : TypeParamRef , bound : Type , isUpper : Boolean ): Boolean =
70+ protected def addOneBound (param : VarRef , bound : Type , isUpper : Boolean ): Boolean =
7071 ! constraint.contains(param) || {
7172 def occursIn (bound : Type ): Boolean = {
7273 val b = bound.dealias
@@ -84,7 +85,7 @@ trait ConstraintHandling {
8485 assert(! occursIn(bound), s " $param occurs in $bound" )
8586
8687 val oldBounds @ TypeBounds (lo, hi) = constraint.nonParamBounds(param)
87- val equalBounds = isUpper && (lo eq bound ) || ! isUpper && (bound eq hi)
88+ val equalBounds = isUpper && (bound eq lo ) || ! isUpper && (bound eq hi)
8889 if (equalBounds && ! bound.existsPart(_.isInstanceOf [WildcardType ])) {
8990 // The narrowed bounds are equal and do not contain wildcards,
9091 // so we can remove `param` from the constraint.
@@ -116,7 +117,7 @@ trait ConstraintHandling {
116117
117118 private def location (implicit ctx : Context ) = " " // i"in ${ctx.typerState.stateChainStr}" // use for debugging
118119
119- protected def addUpperBound (param : TypeParamRef , bound : Type ): Boolean = {
120+ protected def addUpperBound (param : VarRef , bound : Type ): Boolean = {
120121 def description = i " constraint $param <: $bound to \n $constraint"
121122 if (bound.isRef(defn.NothingClass ) && ctx.typerState.isGlobalCommittable) {
122123 def msg = s " !!! instantiated to Nothing: $param, constraint = ${constraint.show}"
@@ -132,7 +133,7 @@ trait ConstraintHandling {
132133 res
133134 }
134135
135- protected def addLowerBound (param : TypeParamRef , bound : Type ): Boolean = {
136+ protected def addLowerBound (param : VarRef , bound : Type ): Boolean = {
136137 def description = i " constraint $param >: $bound to \n $constraint"
137138 constr_println(i " adding $description" )
138139 val upper = constraint.upper(param)
@@ -143,7 +144,7 @@ trait ConstraintHandling {
143144 res
144145 }
145146
146- protected def addLess (p1 : TypeParamRef , p2 : TypeParamRef ): Boolean = {
147+ protected def addLess (p1 : VarRef , p2 : VarRef ): Boolean = {
147148 def description = i " ordering $p1 <: $p2 to \n $constraint"
148149 val res =
149150 if (constraint.isLess(p2, p1)) unify(p2, p1)
@@ -165,7 +166,7 @@ trait ConstraintHandling {
165166 /** Make p2 = p1, transfer all bounds of p2 to p1
166167 * @pre less(p1)(p2)
167168 */
168- private def unify (p1 : TypeParamRef , p2 : TypeParamRef ): Boolean = {
169+ private def unify (p1 : VarRef , p2 : VarRef ): Boolean = {
169170 constr_println(s " unifying $p1 $p2" )
170171 assert(constraint.isLess(p1, p2))
171172 val down = constraint.exclusiveLower(p2, p1)
@@ -224,7 +225,7 @@ trait ConstraintHandling {
224225 * @return the instantiating type
225226 * @pre `param` is in the constraint's domain.
226227 */
227- final def approximation (param : TypeParamRef , fromBelow : Boolean ): Type = {
228+ final def approximation (param : VarRef , fromBelow : Boolean ): Type = {
228229 val avoidParam = new TypeMap {
229230 override def stopAtStatic = true
230231 def avoidInArg (arg : Type ): Type =
@@ -283,9 +284,9 @@ trait ConstraintHandling {
283284 case tp : SingletonType => true
284285 case AndType (tp1, tp2) => isMultiSingleton(tp1) | isMultiSingleton(tp2)
285286 case OrType (tp1, tp2) => isMultiSingleton(tp1) & isMultiSingleton(tp2)
286- case tp : TypeRef => isMultiSingleton(tp.info.hiBound)
287+ case tp : TypeRef if ! constraint.contains( tp : VarRef ) => isMultiSingleton(tp.info.hiBound)
287288 case tp : TypeVar => isMultiSingleton(tp.underlying)
288- case tp : TypeParamRef => isMultiSingleton(bounds(tp).hi)
289+ case tp : VarRef => isMultiSingleton(bounds(tp).hi)
289290 case _ => false
290291 }
291292 def isOrType (tp : Type ): Boolean = tp.dealias match {
@@ -311,7 +312,7 @@ trait ConstraintHandling {
311312 * a lower bound instantiation can be a singleton type only if the upper bound
312313 * is also a singleton type.
313314 */
314- def instanceType (param : TypeParamRef , fromBelow : Boolean ): Type = {
315+ def instanceType (param : VarRef , fromBelow : Boolean ): Type = {
315316 val inst = approximation(param, fromBelow).simplified
316317 if (fromBelow) widenInferred(inst, constraint.fullUpperBound(param)) else inst
317318 }
@@ -340,12 +341,12 @@ trait ConstraintHandling {
340341 }
341342
342343 /** The current bounds of type parameter `param` */
343- def bounds (param : TypeParamRef ): TypeBounds = {
344+ def bounds (param : VarRef ): TypeBounds = {
344345 val e = constraint.entry(param)
345346 if (e.exists) e.bounds
346347 else {
347- val pinfos = param.binder.paramInfos
348- if (pinfos != null ) pinfos(param.paramNum ) // pinfos == null happens in pos/i536.scala
348+ val pinfos = param.binder.refInfos
349+ if (pinfos != null ) pinfos(param.refNum ) // pinfos == null happens in pos/i536.scala
349350 else TypeBounds .empty
350351 }
351352 }
@@ -354,10 +355,10 @@ trait ConstraintHandling {
354355 * and propagate all bounds.
355356 * @param tvars See Constraint#add
356357 */
357- def addToConstraint (tl : TypeLambda , tvars : List [TypeVar ]): Boolean =
358+ def addToConstraint (tl : Binder , tvars : List [TypeVar ]): Boolean =
358359 checkPropagated(i " initialized $tl" ) {
359360 constraint = constraint.add(tl, tvars)
360- tl.paramRefs .forall { param =>
361+ tl.boundRefs .forall { param =>
361362 constraint.entry(param) match {
362363 case bounds : TypeBounds =>
363364 val lower = constraint.lower(param)
@@ -375,14 +376,14 @@ trait ConstraintHandling {
375376 }
376377
377378 /** Can `param` be constrained with new bounds? */
378- final def canConstrain (param : TypeParamRef ): Boolean =
379+ final def canConstrain (param : VarRef ): Boolean =
379380 (! frozenConstraint || (caseLambda `eq` param.binder)) && constraint.contains(param)
380381
381382 /** Is `param` assumed to be a sub- and super-type of any other type?
382383 * This holds if `TypeVarsMissContext` is set unless `param` is a part
383384 * of a MatchType that is currently normalized.
384385 */
385- final def assumedTrue (param : TypeParamRef ): Boolean =
386+ final def assumedTrue (param : VarRef ): Boolean =
386387 ctx.mode.is(Mode .TypevarsMissContext ) && (caseLambda `ne` param.binder)
387388
388389 /** Add constraint `param <: bound` if `fromBelow` is false, `param >: bound` otherwise.
@@ -392,7 +393,7 @@ trait ConstraintHandling {
392393 * not be AndTypes and lower bounds may not be OrTypes. This is assured by the
393394 * way isSubType is organized.
394395 */
395- protected def addConstraint (param : TypeParamRef , bound : Type , fromBelow : Boolean ): Boolean = {
396+ protected def addConstraint (param : VarRef , bound : Type , fromBelow : Boolean ): Boolean = {
396397 def description = i " constr $param ${if (fromBelow) " >:" else " <:" } $bound: \n $constraint"
397398 // checkPropagated(s"adding $description")(true) // DEBUG in case following fails
398399 checkPropagated(s " added $description" ) {
@@ -522,7 +523,7 @@ trait ConstraintHandling {
522523 if (Config .checkConstraintsPropagated && result && addConstraintInvocations == 0 ) {
523524 inFrozenConstraint {
524525 for (p <- constraint.domainParams) {
525- def check (cond : => Boolean , q : TypeParamRef , ordering : String , explanation : String ): Unit =
526+ def check (cond : => Boolean , q : VarRef , ordering : String , explanation : String ): Unit =
526527 assert(cond, i " propagation failure for $p $ordering $q: $explanation\n $msg" )
527528 for (u <- constraint.upper(p))
528529 check(bounds(p).hi <:< bounds(u).hi, u, " <:" , " upper bound not propagated" )
0 commit comments