@@ -18,15 +18,15 @@ import config.Printers.{constr, typr}
1818 * By comparison: Constraint handlers are parts of type comparers and can use their functionality.
1919 * Constraint handlers update the current constraint as a side effect.
2020 */
21- trait ConstraintHandling {
21+ trait ConstraintHandling [ AbstractContext ] {
2222
2323 def constr_println (msg : => String ): Unit = constr.println(msg)
2424 def typr_println (msg : => String ): Unit = typr.println(msg)
2525
26- implicit def ctx : Context
26+ implicit def ctx ( implicit ac : AbstractContext ) : Context
2727
28- protected def isSubType (tp1 : Type , tp2 : Type ): Boolean
29- protected def isSameType (tp1 : Type , tp2 : Type ): Boolean
28+ protected def isSubType (tp1 : Type , tp2 : Type )( implicit actx : AbstractContext ) : Boolean
29+ protected def isSameType (tp1 : Type , tp2 : Type )( implicit actx : AbstractContext ) : Boolean
3030
3131 protected def constraint : Constraint
3232 protected def constraint_= (c : Constraint ): Unit
@@ -66,7 +66,7 @@ trait ConstraintHandling {
6666 case tp => tp
6767 }
6868
69- protected def addOneBound (param : TypeParamRef , bound : Type , isUpper : Boolean ): Boolean =
69+ protected def addOneBound (param : TypeParamRef , bound : Type , isUpper : Boolean )( implicit actx : AbstractContext ) : Boolean =
7070 ! constraint.contains(param) || {
7171 def occursIn (bound : Type ): Boolean = {
7272 val b = bound.dealias
@@ -116,7 +116,7 @@ trait ConstraintHandling {
116116
117117 private def location (implicit ctx : Context ) = " " // i"in ${ctx.typerState.stateChainStr}" // use for debugging
118118
119- protected def addUpperBound (param : TypeParamRef , bound : Type ): Boolean = {
119+ protected def addUpperBound (param : TypeParamRef , bound : Type )( implicit actx : AbstractContext ) : Boolean = {
120120 def description = i " constraint $param <: $bound to \n $constraint"
121121 if (bound.isRef(defn.NothingClass ) && ctx.typerState.isGlobalCommittable) {
122122 def msg = s " !!! instantiated to Nothing: $param, constraint = ${constraint.show}"
@@ -132,7 +132,7 @@ trait ConstraintHandling {
132132 res
133133 }
134134
135- protected def addLowerBound (param : TypeParamRef , bound : Type ): Boolean = {
135+ protected def addLowerBound (param : TypeParamRef , bound : Type )( implicit actx : AbstractContext ) : Boolean = {
136136 def description = i " constraint $param >: $bound to \n $constraint"
137137 constr_println(i " adding $description" )
138138 val upper = constraint.upper(param)
@@ -143,7 +143,7 @@ trait ConstraintHandling {
143143 res
144144 }
145145
146- protected def addLess (p1 : TypeParamRef , p2 : TypeParamRef ): Boolean = {
146+ protected def addLess (p1 : TypeParamRef , p2 : TypeParamRef )( implicit actx : AbstractContext ) : Boolean = {
147147 def description = i " ordering $p1 <: $p2 to \n $constraint"
148148 val res =
149149 if (constraint.isLess(p2, p1)) unify(p2, p1)
@@ -164,7 +164,7 @@ trait ConstraintHandling {
164164 /** Make p2 = p1, transfer all bounds of p2 to p1
165165 * @pre less(p1)(p2)
166166 */
167- private def unify (p1 : TypeParamRef , p2 : TypeParamRef ): Boolean = {
167+ private def unify (p1 : TypeParamRef , p2 : TypeParamRef )( implicit actx : AbstractContext ) : Boolean = {
168168 constr_println(s " unifying $p1 $p2" )
169169 assert(constraint.isLess(p1, p2))
170170 val down = constraint.exclusiveLower(p2, p1)
@@ -179,7 +179,7 @@ trait ConstraintHandling {
179179 }
180180
181181
182- protected def isSubType (tp1 : Type , tp2 : Type , whenFrozen : Boolean ): Boolean = {
182+ protected def isSubType (tp1 : Type , tp2 : Type , whenFrozen : Boolean )( implicit actx : AbstractContext ) : Boolean = {
183183 if (whenFrozen)
184184 isSubTypeWhenFrozen(tp1, tp2)
185185 else
@@ -198,13 +198,13 @@ trait ConstraintHandling {
198198 }
199199 }
200200
201- final def isSubTypeWhenFrozen (tp1 : Type , tp2 : Type ): Boolean = inFrozenConstraint(isSubType(tp1, tp2))
202- final def isSameTypeWhenFrozen (tp1 : Type , tp2 : Type ): Boolean = inFrozenConstraint(isSameType(tp1, tp2))
201+ final def isSubTypeWhenFrozen (tp1 : Type , tp2 : Type )( implicit actx : AbstractContext ) : Boolean = inFrozenConstraint(isSubType(tp1, tp2))
202+ final def isSameTypeWhenFrozen (tp1 : Type , tp2 : Type )( implicit actx : AbstractContext ) : Boolean = inFrozenConstraint(isSameType(tp1, tp2))
203203
204204 /** Test whether the lower bounds of all parameters in this
205205 * constraint are a solution to the constraint.
206206 */
207- protected final def isSatisfiable : Boolean =
207+ protected final def isSatisfiable ( implicit actx : AbstractContext ) : Boolean =
208208 constraint.forallParams { param =>
209209 val TypeBounds (lo, hi) = constraint.entry(param)
210210 isSubType(lo, hi) || {
@@ -223,7 +223,7 @@ trait ConstraintHandling {
223223 * @return the instantiating type
224224 * @pre `param` is in the constraint's domain.
225225 */
226- final def approximation (param : TypeParamRef , fromBelow : Boolean ): Type = {
226+ final def approximation (param : TypeParamRef , fromBelow : Boolean )( implicit actx : AbstractContext ) : Type = {
227227 val avoidParam = new TypeMap {
228228 override def stopAtStatic = true
229229 def avoidInArg (arg : Type ): Type =
@@ -277,7 +277,7 @@ trait ConstraintHandling {
277277 * 2. If `tp` is a union type, yet upper bound is not a union type,
278278 * approximate the union type from above by an intersection of all common base types.
279279 */
280- def widenInferred (tp : Type , bound : Type ): Type = {
280+ def widenInferred (tp : Type , bound : Type )( implicit actx : AbstractContext ) : Type = {
281281 def isMultiSingleton (tp : Type ): Boolean = tp.stripAnnots match {
282282 case tp : SingletonType => true
283283 case AndType (tp1, tp2) => isMultiSingleton(tp1) | isMultiSingleton(tp2)
@@ -310,7 +310,7 @@ trait ConstraintHandling {
310310 * a lower bound instantiation can be a singleton type only if the upper bound
311311 * is also a singleton type.
312312 */
313- def instanceType (param : TypeParamRef , fromBelow : Boolean ): Type = {
313+ def instanceType (param : TypeParamRef , fromBelow : Boolean )( implicit actx : AbstractContext ) : Type = {
314314 val inst = approximation(param, fromBelow).simplified
315315 if (fromBelow) widenInferred(inst, constraint.fullUpperBound(param)) else inst
316316 }
@@ -325,7 +325,7 @@ trait ConstraintHandling {
325325 * Both `c1` and `c2` are required to derive from constraint `pre`, possibly
326326 * narrowing it with further bounds.
327327 */
328- protected final def subsumes (c1 : Constraint , c2 : Constraint , pre : Constraint ): Boolean =
328+ protected final def subsumes (c1 : Constraint , c2 : Constraint , pre : Constraint )( implicit actx : AbstractContext ) : Boolean =
329329 if (c2 eq pre) true
330330 else if (c1 eq pre) false
331331 else {
@@ -339,7 +339,7 @@ trait ConstraintHandling {
339339 }
340340
341341 /** The current bounds of type parameter `param` */
342- def bounds (param : TypeParamRef ): TypeBounds = {
342+ def bounds (param : TypeParamRef )( implicit actx : AbstractContext ) : TypeBounds = {
343343 val e = constraint.entry(param)
344344 if (e.exists) e.bounds
345345 else {
@@ -353,7 +353,7 @@ trait ConstraintHandling {
353353 * and propagate all bounds.
354354 * @param tvars See Constraint#add
355355 */
356- def addToConstraint (tl : TypeLambda , tvars : List [TypeVar ]): Boolean =
356+ def addToConstraint (tl : TypeLambda , tvars : List [TypeVar ])( implicit actx : AbstractContext ) : Boolean =
357357 checkPropagated(i " initialized $tl" ) {
358358 constraint = constraint.add(tl, tvars)
359359 tl.paramRefs.forall { param =>
@@ -381,7 +381,7 @@ trait ConstraintHandling {
381381 * This holds if `TypeVarsMissContext` is set unless `param` is a part
382382 * of a MatchType that is currently normalized.
383383 */
384- final def assumedTrue (param : TypeParamRef ): Boolean =
384+ final def assumedTrue (param : TypeParamRef )( implicit actx : AbstractContext ) : Boolean =
385385 ctx.mode.is(Mode .TypevarsMissContext ) && (caseLambda `ne` param.binder)
386386
387387 /** Add constraint `param <: bound` if `fromBelow` is false, `param >: bound` otherwise.
@@ -391,7 +391,7 @@ trait ConstraintHandling {
391391 * not be AndTypes and lower bounds may not be OrTypes. This is assured by the
392392 * way isSubType is organized.
393393 */
394- protected def addConstraint (param : TypeParamRef , bound : Type , fromBelow : Boolean ): Boolean = {
394+ protected def addConstraint (param : TypeParamRef , bound : Type , fromBelow : Boolean )( implicit actx : AbstractContext ) : Boolean = {
395395 def description = i " constr $param ${if (fromBelow) " >:" else " <:" } $bound: \n $constraint"
396396 // checkPropagated(s"adding $description")(true) // DEBUG in case following fails
397397 checkPropagated(s " added $description" ) {
@@ -507,7 +507,7 @@ trait ConstraintHandling {
507507 }
508508
509509 /** Instantiate `param` to `tp` if the constraint stays satisfiable */
510- protected def tryInstantiate (param : TypeParamRef , tp : Type ): Boolean = {
510+ protected def tryInstantiate (param : TypeParamRef , tp : Type )( implicit actx : AbstractContext ) : Boolean = {
511511 val saved = constraint
512512 constraint =
513513 if (addConstraint(param, tp, fromBelow = true ) &&
@@ -517,7 +517,7 @@ trait ConstraintHandling {
517517 }
518518
519519 /** Check that constraint is fully propagated. See comment in Config.checkConstraintsPropagated */
520- def checkPropagated (msg : => String )(result : Boolean ): Boolean = {
520+ def checkPropagated (msg : => String )(result : Boolean )( implicit actx : AbstractContext ) : Boolean = {
521521 if (Config .checkConstraintsPropagated && result && addConstraintInvocations == 0 ) {
522522 inFrozenConstraint {
523523 for (p <- constraint.domainParams) {
0 commit comments