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