@@ -3189,7 +3189,7 @@ class TrackingTypeComparer(initctx: Context) extends TypeComparer(initctx) {
3189
3189
super .typeVarInstance(tvar)
3190
3190
}
3191
3191
3192
- def matchCases (scrut : Type , cases : List [Type ])(using Context ): Type = {
3192
+ def matchCases (scrut : Type , cases : List [MatchTypeCaseSpec ])(using Context ): Type = {
3193
3193
// a reference for the type parameters poisoned during matching
3194
3194
// for use during the reduction step
3195
3195
var poisoned : Set [TypeParamRef ] = Set .empty
@@ -3230,16 +3230,26 @@ class TrackingTypeComparer(initctx: Context) extends TypeComparer(initctx) {
3230
3230
}
3231
3231
3232
3232
/** Match a single case. */
3233
- def matchCase (cas : Type ): MatchResult = trace(i " $scrut match ${MatchTypeTrace .caseText(cas)}" , matchTypes, show = true ) {
3234
- val cas1 = cas match {
3235
- case cas : HKTypeLambda =>
3236
- caseLambda = constrained(cas, ast.tpd.EmptyTree )._1
3237
- caseLambda.resultType
3238
- case _ =>
3239
- cas
3240
- }
3233
+ def matchCase (cas : MatchTypeCaseSpec ): MatchResult = trace(i " $scrut match ${MatchTypeTrace .caseText(cas)}" , matchTypes, show = true ) {
3234
+ cas match
3235
+ case cas : MatchTypeCaseSpec .SubTypeTest => matchSubTypeTest(cas)
3236
+ case cas : MatchTypeCaseSpec .LegacyPatMat => matchLegacyPatMat(cas)
3237
+ }
3238
+
3239
+ def matchSubTypeTest (spec : MatchTypeCaseSpec .SubTypeTest ): MatchResult =
3240
+ if necessarySubType(scrut, spec.pattern) then
3241
+ MatchResult .Reduced (spec.body)
3242
+ else if provablyDisjoint(scrut, spec.pattern) then
3243
+ MatchResult .Disjoint
3244
+ else
3245
+ MatchResult .Stuck
3246
+ end matchSubTypeTest
3241
3247
3242
- val defn .MatchCase (pat, body) = cas1 : @ unchecked
3248
+ def matchLegacyPatMat (spec : MatchTypeCaseSpec .LegacyPatMat ): MatchResult =
3249
+ val caseLambda = constrained(spec.origMatchCase, ast.tpd.EmptyTree )._1.asInstanceOf [HKTypeLambda ]
3250
+ this .caseLambda = caseLambda
3251
+
3252
+ val defn .MatchCase (pat, body) = caseLambda.resultType: @ unchecked
3243
3253
3244
3254
def matches (canWidenAbstract : Boolean ): Boolean =
3245
3255
val saved = this .canWidenAbstract
@@ -3253,22 +3263,18 @@ class TrackingTypeComparer(initctx: Context) extends TypeComparer(initctx) {
3253
3263
this .canWidenAbstract = saved
3254
3264
3255
3265
def redux (canApprox : Boolean ): MatchResult =
3256
- caseLambda match
3257
- case caseLambda : HKTypeLambda =>
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)
3268
- case _ =>
3269
- MatchResult .Reduced (body)
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)
3270
3276
3271
- if caseLambda.exists && matches(canWidenAbstract = false ) then
3277
+ if matches(canWidenAbstract = false ) then
3272
3278
redux(canApprox = true )
3273
3279
else if matches(canWidenAbstract = true ) then
3274
3280
redux(canApprox = false )
@@ -3278,9 +3284,9 @@ class TrackingTypeComparer(initctx: Context) extends TypeComparer(initctx) {
3278
3284
MatchResult .Disjoint
3279
3285
else
3280
3286
MatchResult .Stuck
3281
- }
3287
+ end matchLegacyPatMat
3282
3288
3283
- def recur (remaining : List [Type ]): Type = remaining match
3289
+ def recur (remaining : List [MatchTypeCaseSpec ]): Type = remaining match
3284
3290
case cas :: remaining1 =>
3285
3291
matchCase(cas) match
3286
3292
case MatchResult .Disjoint =>
0 commit comments