@@ -31,7 +31,8 @@ sealed abstract class GadtConstraint extends Showable {
31
31
*
32
32
* @see [[ConstraintHandling.addToConstraint ]]
33
33
*/
34
- def addToConstraint (syms : List [Symbol ])(using Context ): Boolean
34
+ def addToConstraint (syms : List [Symbol ], nestingLevel : Int )(using Context ): Boolean
35
+ def addToConstraint (syms : List [Symbol ])(using Context ): Boolean = addToConstraint(syms, ctx.nestingLevel)
35
36
def addToConstraint (sym : Symbol )(using Context ): Boolean = addToConstraint(sym :: Nil )
36
37
37
38
/** Further constrain a symbol already present in the constraint. */
@@ -49,14 +50,17 @@ sealed abstract class GadtConstraint extends Showable {
49
50
/** See [[ConstraintHandling.approximation ]] */
50
51
def approximation (sym : Symbol , fromBelow : Boolean , maxLevel : Int = Int .MaxValue )(using Context ): Type
51
52
53
+ def remove (sym : Symbol )(using Context ): Unit
54
+
52
55
def symbols : List [Symbol ]
56
+ def inputs : List [(List [Symbol ], Int )]
53
57
54
58
def fresh : GadtConstraint
55
59
56
60
/** Restore the state from other [[GadtConstraint ]], probably copied using [[fresh ]] */
57
61
def restore (other : GadtConstraint ): Unit
58
62
59
- def debugBoundsDescription ( using Context ): String
63
+ def eql ( that : GadtConstraint ): Boolean
60
64
}
61
65
62
66
final class ProperGadtConstraint private (
@@ -88,7 +92,7 @@ final class ProperGadtConstraint private(
88
92
// the case where they're valid, so no approximating is needed.
89
93
rawBound
90
94
91
- override def addToConstraint (params : List [Symbol ])(using Context ): Boolean = {
95
+ override def addToConstraint (params : List [Symbol ], nestingLevel : Int )(using Context ): Boolean = {
92
96
import NameKinds .DepParamName
93
97
94
98
val poly1 = PolyType (params.map { sym => DepParamName .fresh(sym.name.toTypeName) })(
@@ -126,15 +130,15 @@ final class ProperGadtConstraint private(
126
130
)
127
131
128
132
val tvars = params.lazyZip(poly1.paramRefs).map { (sym, paramRef) =>
129
- val tv = TypeVar (paramRef, creatorState = null )
133
+ val tv = TypeVar (paramRef, creatorState = null , nestingLevel )
130
134
mapping = mapping.updated(sym, tv)
131
135
reverseMapping = reverseMapping.updated(tv.origin, sym)
132
136
tv
133
137
}
134
138
135
139
// The replaced symbols are picked up here.
136
140
addToConstraint(poly1, tvars)
137
- .showing(i " added to constraint: [ $poly1] $params%, % \n $debugBoundsDescription " , gadts)
141
+ .showing(i " added to constraint: [ $poly1] $params%, % gadt = $this " , gadts)
138
142
}
139
143
140
144
override def addBound (sym : Symbol , bound : Type , isUpper : Boolean )(using Context ): Boolean = {
@@ -219,8 +223,22 @@ final class ProperGadtConstraint private(
219
223
res
220
224
}
221
225
226
+ override def remove (sym : Symbol )(using Context ): Unit =
227
+ mapping(sym) match
228
+ case tv : TypeVar =>
229
+ mapping = mapping.remove(sym)
230
+ reverseMapping = reverseMapping.remove(tv.origin)
231
+ constraint = constraint.replace(tv.origin, sym.typeRef)
232
+ case null =>
233
+
222
234
override def symbols : List [Symbol ] = mapping.keys
223
235
236
+ override def inputs : List [(List [Symbol ], Int )] =
237
+ constraint.domainLambdas.flatMap { tl =>
238
+ val syms = tl.paramRefs.flatMap(reverseMapping(_).toOption)
239
+ syms.headOption.map(sym1 => (syms, mapping(sym1).nn.initNestingLevel))
240
+ }
241
+
224
242
override def fresh : GadtConstraint = new ProperGadtConstraint (
225
243
myConstraint,
226
244
mapping,
@@ -291,17 +309,15 @@ final class ProperGadtConstraint private(
291
309
292
310
override def constr = gadtsConstr
293
311
294
- override def toText (printer : Printer ): Texts .Text = constraint.toText(printer)
312
+ override def eql (that : GadtConstraint ): Boolean = (this eq that) || that.match
313
+ case that : ProperGadtConstraint =>
314
+ myConstraint == that.myConstraint
315
+ && mapping == that.mapping
316
+ && reverseMapping == that.reverseMapping
317
+ && wasConstrained == that.wasConstrained
318
+ case _ => false
295
319
296
- override def debugBoundsDescription (using Context ): String = {
297
- val sb = new mutable.StringBuilder
298
- sb ++= constraint.show
299
- sb += '\n '
300
- mapping.foreachBinding { case (sym, _) =>
301
- sb ++= i " $sym: ${fullBounds(sym)}\n "
302
- }
303
- sb.result
304
- }
320
+ override def toText (printer : Printer ): Texts .Text = printer.toText(this )
305
321
}
306
322
307
323
@ sharable object EmptyGadtConstraint extends GadtConstraint {
@@ -314,18 +330,21 @@ final class ProperGadtConstraint private(
314
330
315
331
override def contains (sym : Symbol )(using Context ) = false
316
332
317
- override def addToConstraint (params : List [Symbol ])(using Context ): Boolean = unsupported(" EmptyGadtConstraint.addToConstraint" )
333
+ override def addToConstraint (params : List [Symbol ], nestingLevel : Int )(using Context ): Boolean = unsupported(" EmptyGadtConstraint.addToConstraint" )
318
334
override def addBound (sym : Symbol , bound : Type , isUpper : Boolean )(using Context ): Boolean = unsupported(" EmptyGadtConstraint.addBound" )
319
335
320
336
override def approximation (sym : Symbol , fromBelow : Boolean , maxLevel : Int )(using Context ): Type = unsupported(" EmptyGadtConstraint.approximation" )
321
337
338
+ override def remove (sym : Symbol )(using Context ): Unit = ()
339
+
322
340
override def symbols : List [Symbol ] = Nil
341
+ override def inputs : List [(List [Symbol ], Int )] = Nil
323
342
324
343
override def fresh = new ProperGadtConstraint
325
344
override def restore (other : GadtConstraint ): Unit =
326
345
assert(! other.isNarrowing, " cannot restore a non-empty GADTMap" )
327
346
328
- override def debugBoundsDescription ( using Context ): String = " EmptyGadtConstraint"
347
+ override def eql ( that : GadtConstraint ): Boolean = ( this eq that) || that == EmptyGadtConstraint
329
348
330
- override def toText (printer : Printer ): Texts .Text = " EmptyGadtConstraint "
349
+ override def toText (printer : Printer ): Texts .Text = printer.toText( this )
331
350
}
0 commit comments