@@ -936,7 +936,6 @@ trait Implicits { self: Typer =>
936936 }
937937
938938 formal.member(tpnme.MirroredType ).info match {
939- case TypeAlias (mirroredType) => mirrorFor(mirroredType)
940939 case TypeBounds (mirroredType, _) => mirrorFor(mirroredType)
941940 case other => EmptyTree
942941 }
@@ -947,76 +946,72 @@ trait Implicits { self: Typer =>
947946 */
948947 lazy val synthesizedSumMirror : SpecialHandler =
949948 (formal : Type , span : Span ) => implicit (ctx : Context ) => {
950- def mirrorFor (mirroredType0 : Type ): Tree = {
951- val mirroredType = mirroredType0.stripTypeVar
952- if (mirroredType.classSymbol.isGenericSum) {
953- val cls = mirroredType.classSymbol
954- val elemLabels = cls.children.map(c => ConstantType (Constant (c.name.toString)))
955-
956- def solve (sym : Symbol ): Type = sym match {
957- case caseClass : ClassSymbol =>
958- assert(caseClass.is(Case ))
959- if (caseClass.is(Module ))
960- caseClass.sourceModule.termRef
961- else {
962- caseClass.primaryConstructor.info match {
963- case info : PolyType =>
964- // Compute the the full child type by solving the subtype constraint
965- // `C[X1, ..., Xn] <: P`, where
966- //
967- // - P is the current `mirroredType`
968- // - C is the child class, with type parameters X1, ..., Xn
969- //
970- // Contravariant type parameters are minimized, all other type parameters are maximized.
971- def instantiate (implicit ctx : Context ) = {
972- val poly = constrained(info, untpd.EmptyTree )._1
973- val resType = poly.finalResultType
974- val target = mirroredType match {
975- case tp : HKTypeLambda => tp.resultType
976- case tp => tp
949+ formal.member(tpnme.MirroredType ).info match {
950+ case TypeBounds (mirroredType0, _) =>
951+ val mirroredType = mirroredType0.stripTypeVar
952+ if (mirroredType.classSymbol.isGenericSum) {
953+ val cls = mirroredType.classSymbol
954+ val elemLabels = cls.children.map(c => ConstantType (Constant (c.name.toString)))
955+
956+ def solve (sym : Symbol ): Type = sym match {
957+ case caseClass : ClassSymbol =>
958+ assert(caseClass.is(Case ))
959+ if (caseClass.is(Module ))
960+ caseClass.sourceModule.termRef
961+ else {
962+ caseClass.primaryConstructor.info match {
963+ case info : PolyType =>
964+ // Compute the the full child type by solving the subtype constraint
965+ // `C[X1, ..., Xn] <: P`, where
966+ //
967+ // - P is the current `mirroredType`
968+ // - C is the child class, with type parameters X1, ..., Xn
969+ //
970+ // Contravariant type parameters are minimized, all other type parameters are maximized.
971+ def instantiate (implicit ctx : Context ) = {
972+ val poly = constrained(info, untpd.EmptyTree )._1
973+ val resType = poly.finalResultType
974+ val target = mirroredType match {
975+ case tp : HKTypeLambda => tp.resultType
976+ case tp => tp
977+ }
978+ resType <:< target
979+ val tparams = poly.paramRefs
980+ val variances = caseClass.typeParams.map(_.paramVariance)
981+ val instanceTypes = (tparams, variances).zipped.map((tparam, variance) =>
982+ ctx.typeComparer.instanceType(tparam, fromBelow = variance < 0 ))
983+ resType.substParams(poly, instanceTypes)
977984 }
978- resType <:< target
979- val tparams = poly.paramRefs
980- val variances = caseClass.typeParams.map(_.paramVariance)
981- val instanceTypes = (tparams, variances).zipped.map((tparam, variance) =>
982- ctx.typeComparer.instanceType(tparam, fromBelow = variance < 0 ))
983- resType.substParams(poly, instanceTypes)
984- }
985- instantiate(ctx.fresh.setExploreTyperState().setOwner(caseClass))
986- case _ =>
987- caseClass.typeRef
985+ instantiate(ctx.fresh.setExploreTyperState().setOwner(caseClass))
986+ case _ =>
987+ caseClass.typeRef
988+ }
988989 }
989- }
990- case child => child.termRef
991- }
992-
993- val (monoType, elemsType) = mirroredType match {
994- case mirroredType : HKTypeLambda =>
995- val elems = mirroredType.derivedLambdaType(
996- resType = TypeOps .nestedPairs(cls.children.map(solve))
997- )
998- val AppliedType (tycon, _) = mirroredType.resultType
999- val monoType = AppliedType (tycon, mirroredType.paramInfos)
1000- (monoType, elems)
1001- case _ =>
1002- val elems = TypeOps .nestedPairs(cls.children.map(solve))
1003- (mirroredType, elems)
1004- }
990+ case child => child.termRef
991+ }
1005992
1006- val mirrorType =
1007- mirrorCore(defn.Mirror_SumType , monoType, mirroredType, cls.name)
1008- .refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
1009- .refinedWith(tpnme.MirroredElemLabels , TypeAlias (TypeOps .nestedPairs(elemLabels)))
1010- val mirrorRef =
1011- if (cls.linkedClass.exists && ! cls.is(Scala2x )) companionPath(mirroredType, span)
1012- else anonymousMirror(monoType, ExtendsSumMirror , span)
1013- mirrorRef.cast(mirrorType)
1014- } else EmptyTree
1015- }
993+ val (monoType, elemsType) = mirroredType match {
994+ case mirroredType : HKTypeLambda =>
995+ val elems = mirroredType.derivedLambdaType(
996+ resType = TypeOps .nestedPairs(cls.children.map(solve))
997+ )
998+ val AppliedType (tycon, _) = mirroredType.resultType
999+ val monoType = AppliedType (tycon, mirroredType.paramInfos)
1000+ (monoType, elems)
1001+ case _ =>
1002+ val elems = TypeOps .nestedPairs(cls.children.map(solve))
1003+ (mirroredType, elems)
1004+ }
10161005
1017- formal.member(tpnme.MirroredType ).info match {
1018- case TypeAlias (mirroredType) => mirrorFor(mirroredType)
1019- case TypeBounds (mirroredType, _) => mirrorFor(mirroredType)
1006+ val mirrorType =
1007+ mirrorCore(defn.Mirror_SumType , monoType, mirroredType, cls.name)
1008+ .refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
1009+ .refinedWith(tpnme.MirroredElemLabels , TypeAlias (TypeOps .nestedPairs(elemLabels)))
1010+ val mirrorRef =
1011+ if (cls.linkedClass.exists && ! cls.is(Scala2x )) companionPath(mirroredType, span)
1012+ else anonymousMirror(monoType, ExtendsSumMirror , span)
1013+ mirrorRef.cast(mirrorType)
1014+ } else EmptyTree
10201015 case _ => EmptyTree
10211016 }
10221017 }
@@ -1026,15 +1021,12 @@ trait Implicits { self: Typer =>
10261021 */
10271022 lazy val synthesizedMirror : SpecialHandler =
10281023 (formal : Type , span : Span ) => implicit (ctx : Context ) => {
1029- def mirrorFor (mirroredType : Type ): Tree =
1030- if (mirroredType.termSymbol.is(CaseVal ) || mirroredType.classSymbol.isGenericProduct)
1031- synthesizedProductMirror(formal, span)(ctx)
1032- else
1033- synthesizedSumMirror(formal, span)(ctx)
1034-
10351024 formal.member(tpnme.MirroredType ).info match {
1036- case TypeAlias (mirroredType) => mirrorFor(mirroredType)
1037- case TypeBounds (mirroredType, _) => mirrorFor(mirroredType)
1025+ case TypeBounds (mirroredType, _) =>
1026+ if (mirroredType.termSymbol.is(CaseVal ) || mirroredType.classSymbol.isGenericProduct)
1027+ synthesizedProductMirror(formal, span)(ctx)
1028+ else
1029+ synthesizedSumMirror(formal, span)(ctx)
10381030 case _ => EmptyTree
10391031 }
10401032 }
0 commit comments