@@ -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