@@ -24,11 +24,13 @@ object OrderingConstraint {
2424 type ParamOrdering = ArrayValuedMap [List [TypeParamRef ]]
2525
2626 /** A new constraint with given maps */
27- private def newConstraint (boundsMap : ParamBounds , lowerMap : ParamOrdering , upperMap : ParamOrdering )(using Context ) : OrderingConstraint = {
28- val result = new OrderingConstraint (boundsMap, lowerMap, upperMap)
29- ctx.run.recordConstraintSize(result, result.boundsMap.size)
30- result
31- }
27+ private def newConstraint (boundsMap : ParamBounds , lowerMap : ParamOrdering , upperMap : ParamOrdering )(using Context ) : OrderingConstraint =
28+ if boundsMap.isEmpty && lowerMap.isEmpty && upperMap.isEmpty then
29+ empty
30+ else
31+ val result = new OrderingConstraint (boundsMap, lowerMap, upperMap)
32+ ctx.run.recordConstraintSize(result, result.boundsMap.size)
33+ result
3234
3335 /** A lens for updating a single entry array in one of the three constraint maps */
3436 abstract class ConstraintLens [T <: AnyRef : ClassTag ] {
@@ -457,48 +459,6 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
457459
458460// ----------- Joins -----------------------------------------------------
459461
460- def & (other : Constraint , otherHasErrors : Boolean )(using Context ): OrderingConstraint = {
461-
462- def merge [T ](m1 : ArrayValuedMap [T ], m2 : ArrayValuedMap [T ], join : (T , T ) => T ): ArrayValuedMap [T ] = {
463- var merged = m1
464- def mergeArrays (xs1 : Array [T ], xs2 : Array [T ]) = {
465- val xs = xs1.clone
466- for (i <- xs.indices) xs(i) = join(xs1(i), xs2(i))
467- xs
468- }
469- m2.foreachBinding { (poly, xs2) =>
470- merged = merged.updated(poly,
471- if (m1.contains(poly)) mergeArrays(m1(poly), xs2) else xs2)
472- }
473- merged
474- }
475-
476- def mergeParams (ps1 : List [TypeParamRef ], ps2 : List [TypeParamRef ]) =
477- ps2.foldLeft(ps1)((ps1, p2) => if (ps1.contains(p2)) ps1 else p2 :: ps1)
478-
479- // Must be symmetric
480- def mergeEntries (e1 : Type , e2 : Type ): Type =
481- (e1, e2) match {
482- case _ if e1 eq e2 => e1
483- case (e1 : TypeBounds , e2 : TypeBounds ) => e1 & e2
484- case (e1 : TypeBounds , _) if e1 contains e2 => e2
485- case (_, e2 : TypeBounds ) if e2 contains e1 => e1
486- case (tv1 : TypeVar , tv2 : TypeVar ) if tv1 eq tv2 => e1
487- case _ =>
488- if (otherHasErrors)
489- e1
490- else
491- throw new AssertionError (i " cannot merge $this with $other, mergeEntries( $e1, $e2) failed " )
492- }
493-
494- val that = other.asInstanceOf [OrderingConstraint ]
495-
496- new OrderingConstraint (
497- merge(this .boundsMap, that.boundsMap, mergeEntries),
498- merge(this .lowerMap, that.lowerMap, mergeParams),
499- merge(this .upperMap, that.upperMap, mergeParams))
500- }.showing(i " constraint merge $this with $other = $result" , constr)
501-
502462 def hasConflictingTypeVarsFor (tl : TypeLambda , that : Constraint ): Boolean =
503463 contains(tl) && that.contains(tl) &&
504464 // Since TypeVars are allocated in bulk for each type lambda, we only have
@@ -641,49 +601,10 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
641601 upperMap.foreachBinding((_, paramss) => paramss.foreach(_.foreach(checkClosedType(_, " upper" ))))
642602 end checkClosed
643603
644- // ---------- toText -----------------------------------------------------
645-
646- private def contentsToText (printer : Printer ): Text =
647- // Printer.debugPrintUnique = true
648- def entryText (tp : Type ) = tp match {
649- case tp : TypeBounds =>
650- tp.toText(printer)
651- case _ =>
652- " := " ~ tp.toText(printer)
653- }
654- val indent = 3
655- val uninstVarsText = " uninstantiated variables: " ~
656- Text (uninstVars.map(_.toText(printer)), " , " )
657- val constrainedText =
658- " constrained types: " ~ Text (domainLambdas map (_.toText(printer)), " , " )
659- val boundsText =
660- " bounds: " ~ {
661- val assocs =
662- for (param <- domainParams)
663- yield (" " * indent) ~ param.toText(printer) ~ entryText(entry(param))
664- Text (assocs, " \n " )
665- }
666- val orderingText =
667- " ordering: " ~ {
668- val deps =
669- for {
670- param <- domainParams
671- ups = minUpper(param)
672- if ups.nonEmpty
673- }
674- yield
675- (" " * indent) ~ param.toText(printer) ~ " <: " ~
676- Text (ups.map(_.toText(printer)), " , " )
677- Text (deps, " \n " )
678- }
679- // Printer.debugPrintUnique = false
680- Text .lines(List (uninstVarsText, constrainedText, boundsText, orderingText))
604+ // ---------- Printing -----------------------------------------------------
681605
682606 override def toText (printer : Printer ): Text =
683- Text .lines(List (" Constraint(" , contentsToText(printer), " )" ))
684-
685- def contentsToString (using Context ): String =
686- contentsToText(ctx.printer).show
607+ printer.toText(this )
687608
688609 override def toString : String = {
689610 def entryText (tp : Type ): String = tp match {
@@ -692,7 +613,7 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
692613 }
693614 val constrainedText =
694615 " constrained types = " + domainLambdas.mkString(" \n " )
695- val boundsText = domainLambdas
616+ val boundsText =
696617 " bounds = " + {
697618 val assocs =
698619 for (param <- domainParams)
0 commit comments