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