@@ -3185,7 +3185,7 @@ class TrackingTypeComparer(initctx: Context) extends TypeComparer(initctx) {
3185
3185
super .typeVarInstance(tvar)
3186
3186
}
3187
3187
3188
- def matchCases (scrut : Type , cases : List [Type ])(using Context ): Type = {
3188
+ def matchCases (scrut : Type , cases : List [MatchTypeCaseSpec ])(using Context ): Type = {
3189
3189
// a reference for the type parameters poisoned during matching
3190
3190
// for use during the reduction step
3191
3191
var poisoned : Set [TypeParamRef ] = Set .empty
@@ -3226,16 +3226,26 @@ class TrackingTypeComparer(initctx: Context) extends TypeComparer(initctx) {
3226
3226
}
3227
3227
3228
3228
/** Match a single case. */
3229
- def matchCase (cas : Type ): MatchResult = trace(i " $scrut match ${MatchTypeTrace .caseText(cas)}" , matchTypes, show = true ) {
3230
- val cas1 = cas match {
3231
- case cas : HKTypeLambda =>
3232
- caseLambda = constrained(cas)
3233
- caseLambda.resultType
3234
- case _ =>
3235
- cas
3236
- }
3229
+ def matchCase (cas : MatchTypeCaseSpec ): MatchResult = trace(i " $scrut match ${MatchTypeTrace .caseText(cas)}" , matchTypes, show = true ) {
3230
+ cas match
3231
+ case cas : MatchTypeCaseSpec .SubTypeTest => matchSubTypeTest(cas)
3232
+ case cas : MatchTypeCaseSpec .LegacyPatMat => matchLegacyPatMat(cas)
3233
+ }
3234
+
3235
+ def matchSubTypeTest (spec : MatchTypeCaseSpec .SubTypeTest ): MatchResult =
3236
+ if necessarySubType(scrut, spec.pattern) then
3237
+ MatchResult .Reduced (spec.body)
3238
+ else if provablyDisjoint(scrut, spec.pattern) then
3239
+ MatchResult .Disjoint
3240
+ else
3241
+ MatchResult .Stuck
3242
+ end matchSubTypeTest
3237
3243
3238
- val defn .MatchCase (pat, body) = cas1 : @ unchecked
3244
+ def matchLegacyPatMat (spec : MatchTypeCaseSpec .LegacyPatMat ): MatchResult =
3245
+ val caseLambda = constrained(spec.origMatchCase).asInstanceOf [HKTypeLambda ]
3246
+ this .caseLambda = caseLambda
3247
+
3248
+ val defn .MatchCase (pat, body) = caseLambda.resultType: @ unchecked
3239
3249
3240
3250
def matches (canWidenAbstract : Boolean ): Boolean =
3241
3251
val saved = this .canWidenAbstract
@@ -3249,22 +3259,18 @@ class TrackingTypeComparer(initctx: Context) extends TypeComparer(initctx) {
3249
3259
this .canWidenAbstract = saved
3250
3260
3251
3261
def redux (canApprox : Boolean ): MatchResult =
3252
- caseLambda match
3253
- case caseLambda : HKTypeLambda =>
3254
- val instances = paramInstances(canApprox)(Array .fill(caseLambda.paramNames.length)(NoType ), pat)
3255
- instantiateParams(instances)(body) match
3256
- case Range (lo, hi) =>
3257
- MatchResult .NoInstance {
3258
- caseLambda.paramNames.zip(instances).collect {
3259
- case (name, Range (lo, hi)) => (name, TypeBounds (lo, hi))
3260
- }
3261
- }
3262
- case redux =>
3263
- MatchResult .Reduced (redux)
3264
- case _ =>
3265
- MatchResult .Reduced (body)
3262
+ val instances = paramInstances(canApprox)(Array .fill(caseLambda.paramNames.length)(NoType ), pat)
3263
+ instantiateParams(instances)(body) match
3264
+ case Range (lo, hi) =>
3265
+ MatchResult .NoInstance {
3266
+ caseLambda.paramNames.zip(instances).collect {
3267
+ case (name, Range (lo, hi)) => (name, TypeBounds (lo, hi))
3268
+ }
3269
+ }
3270
+ case redux =>
3271
+ MatchResult .Reduced (redux)
3266
3272
3267
- if caseLambda.exists && matches(canWidenAbstract = false ) then
3273
+ if matches(canWidenAbstract = false ) then
3268
3274
redux(canApprox = true )
3269
3275
else if matches(canWidenAbstract = true ) then
3270
3276
redux(canApprox = false )
@@ -3274,9 +3280,9 @@ class TrackingTypeComparer(initctx: Context) extends TypeComparer(initctx) {
3274
3280
MatchResult .Disjoint
3275
3281
else
3276
3282
MatchResult .Stuck
3277
- }
3283
+ end matchLegacyPatMat
3278
3284
3279
- def recur (remaining : List [Type ]): Type = remaining match
3285
+ def recur (remaining : List [MatchTypeCaseSpec ]): Type = remaining match
3280
3286
case cas :: remaining1 =>
3281
3287
matchCase(cas) match
3282
3288
case MatchResult .Disjoint =>
0 commit comments