@@ -28,6 +28,7 @@ object SyntheticMembers {
28
28
val ExtendsSumMirror : Property .StickyKey [Unit ] = new Property .StickyKey
29
29
30
30
val SubstPrefix : Property .StickyKey [Type ] = new Property .StickyKey
31
+ val OriginalMirroredType : Property .StickyKey [Type ] = new Property .StickyKey
31
32
}
32
33
33
34
/** Synthetic method implementations for case classes, case objects,
@@ -473,8 +474,8 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
473
474
* type MirroredMonoType = C[?]
474
475
* ```
475
476
*/
476
- def fromProductBody (caseClass : Symbol , param : Tree , pre : Type )(using Context ): Tree = {
477
- val (classRef0 , methTpe) =
477
+ def fromProductBody (caseClass : Symbol , param : Tree , pre : Type , mirroredType : Option [ Type ] )(using Context ): Tree = {
478
+ val (classRef , methTpe) =
478
479
caseClass.primaryConstructor.info match {
479
480
case tl : PolyType =>
480
481
val (tl1, tpts) = constrained(tl, untpd.EmptyTree , alwaysAddTypeVars = true )
@@ -487,7 +488,6 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
487
488
case methTpe =>
488
489
(caseClass.typeRef, methTpe)
489
490
}
490
- val classRef = TypeOps .healPrefix(classRef0, pre).getOrElse(classRef0)
491
491
methTpe match {
492
492
case methTpe : MethodType =>
493
493
val elems =
@@ -517,13 +517,18 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
517
517
* a wildcard for each type parameter. The normalized type of an object
518
518
* O is O.type.
519
519
*/
520
- def ordinalBody (cls : Symbol , param : Tree , pre : Type )(using Context ): Tree =
520
+ def ordinalBody (cls : Symbol , param : Tree , pre : Type , mirroredType : Option [ Type ] )(using Context ): Tree =
521
521
if (cls.is(Enum )) param.select(nme.ordinal).ensureApplied
522
522
else {
523
523
val cases =
524
524
for ((child, idx) <- cls.children.zipWithIndex) yield {
525
525
val patType0 = if child.isTerm then child.termRef else child.rawTypeRef
526
526
val patType = TypeOps .healPrefix(patType0, pre).getOrElse(patType0)
527
+ // val patType = mirroredType.map { tpe =>
528
+ // TypeOps.refineUsingParent(tpe, child)
529
+ // }.getOrElse {
530
+ // if child.isTerm then child.reachableTermRef else child.reachableRawTypeRef
531
+ // }
527
532
val pat = Typed (untpd.Ident (nme.WILDCARD ).withType(patType), TypeTree (patType))
528
533
CaseDef (pat, EmptyTree , Literal (Constant (idx)))
529
534
}
@@ -572,32 +577,33 @@ class SyntheticMembers(thisPhase: DenotTransformer) {
572
577
}
573
578
def makeSingletonMirror () =
574
579
addParent(defn.Mirror_SingletonClass .typeRef)
575
- def makeProductMirror (cls : Symbol , pre : Type ) = {
580
+ def makeProductMirror (cls : Symbol , pre : Type , mirroredType : Option [ Type ] ) = {
576
581
addParent(defn.Mirror_ProductClass .typeRef)
577
582
addMethod(nme.fromProduct, MethodType (defn.ProductClass .typeRef :: Nil , monoType.typeRef), cls,
578
- fromProductBody(_, _, pre).ensureConforms(monoType.typeRef)) // t4758.scala or i3381.scala are examples where a cast is needed
583
+ fromProductBody(_, _, pre, mirroredType ).ensureConforms(monoType.typeRef)) // t4758.scala or i3381.scala are examples where a cast is needed
579
584
}
580
- def makeSumMirror (cls : Symbol , pre : Type ) = {
585
+ def makeSumMirror (cls : Symbol , pre : Type , mirroredType : Option [ Type ] ) = {
581
586
addParent(defn.Mirror_SumClass .typeRef)
582
587
addMethod(nme.ordinal, MethodType (monoType.typeRef :: Nil , defn.IntType ), cls,
583
- ordinalBody(_, _, pre))
588
+ ordinalBody(_, _, pre, mirroredType ))
584
589
}
585
590
586
591
val pre = impl.removeAttachment(SubstPrefix ).getOrElse(NoPrefix )
592
+ val mirroredType = impl.removeAttachment(OriginalMirroredType )
587
593
588
594
if (clazz.is(Module )) {
589
595
if (clazz.is(Case )) makeSingletonMirror()
590
- else if (linked.isGenericProduct) makeProductMirror(linked, pre)
591
- else if (linked.isGenericSum(clazz)) makeSumMirror(linked, pre)
596
+ else if (linked.isGenericProduct) makeProductMirror(linked, pre, mirroredType )
597
+ else if (linked.isGenericSum(clazz)) makeSumMirror(linked, pre, mirroredType )
592
598
else if (linked.is(Sealed ))
593
599
derive.println(i " $linked is not a sum because ${linked.whyNotGenericSum(clazz)}" )
594
600
}
595
601
else if (impl.removeAttachment(ExtendsSingletonMirror ).isDefined)
596
602
makeSingletonMirror()
597
603
else if (impl.removeAttachment(ExtendsProductMirror ).isDefined)
598
- makeProductMirror(monoType.typeRef.dealias.classSymbol, pre)
604
+ makeProductMirror(monoType.typeRef.dealias.classSymbol, pre, mirroredType )
599
605
else if (impl.removeAttachment(ExtendsSumMirror ).isDefined)
600
- makeSumMirror(monoType.typeRef.dealias.classSymbol, pre)
606
+ makeSumMirror(monoType.typeRef.dealias.classSymbol, pre, mirroredType )
601
607
602
608
cpy.Template (impl)(parents = newParents, body = newBody)
603
609
}
0 commit comments