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