@@ -524,27 +524,16 @@ object SpaceEngine {
524
524
val mt : MethodType = unapp.widen match {
525
525
case mt : MethodType => mt
526
526
case pt : PolyType =>
527
- if unappSym.is(Synthetic ) then
528
- val mt = pt.resultType.asInstanceOf [MethodType ]
529
- val unapplyArgType = mt.paramInfos.head
530
- val targs = scrutineeTp.baseType(unapplyArgType.classSymbol) match
531
- case AppliedType (_, targs) => targs
532
- case _ =>
533
- // Typically when the scrutinee is Null or Nothing (see i5067 and i5067b)
534
- // For performance, do `variances(unapplyArgType)` but without using TypeVars
535
- // so just find the variance, so we know if to min/max to the LB/UB or use a wildcard.
536
- object accu extends TypeAccumulator [VarianceMap [TypeParamRef ]]:
537
- def apply (vmap : VarianceMap [TypeParamRef ], tp : Type ) = tp match
538
- case tp : TypeParamRef if tp.binder eq pt => vmap.recordLocalVariance(tp, variance)
539
- case _ => foldOver(vmap, tp)
540
- val vs = accu(VarianceMap .empty[TypeParamRef ], unapplyArgType)
541
- pt.paramRefs.map: p =>
542
- vs.computedVariance(p).uncheckedNN match
543
- case - 1 => p.paramInfo.lo
544
- case 1 => p.paramInfo.hi
545
- case _ => WildcardType (p.paramInfo)
527
+ scrutineeTp match
528
+ case AppliedType (tycon, targs)
529
+ if unappSym.is(Synthetic )
530
+ && (pt.resultType.asInstanceOf [MethodType ].paramInfos.head.typeConstructor eq tycon) =>
531
+ // Special case synthetic unapply/unapplySeq's
532
+ // Provided the shapes of the types match:
533
+ // the scrutinee type being unapplied and
534
+ // the unapply parameter type
546
535
pt.instantiate(targs).asInstanceOf [MethodType ]
547
- else
536
+ case _ =>
548
537
val locked = ctx.typerState.ownedVars
549
538
val tvars = constrained(pt)
550
539
val mt = pt.instantiate(tvars).asInstanceOf [MethodType ]
0 commit comments