@@ -936,7 +936,6 @@ trait Implicits { self: Typer =>
936
936
}
937
937
938
938
formal.member(tpnme.MirroredType ).info match {
939
- case TypeAlias (mirroredType) => mirrorFor(mirroredType)
940
939
case TypeBounds (mirroredType, _) => mirrorFor(mirroredType)
941
940
case other => EmptyTree
942
941
}
@@ -947,76 +946,72 @@ trait Implicits { self: Typer =>
947
946
*/
948
947
lazy val synthesizedSumMirror : SpecialHandler =
949
948
(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)
977
984
}
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
+ }
988
989
}
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
+ }
1005
992
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
+ }
1016
1005
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
1020
1015
case _ => EmptyTree
1021
1016
}
1022
1017
}
@@ -1026,15 +1021,12 @@ trait Implicits { self: Typer =>
1026
1021
*/
1027
1022
lazy val synthesizedMirror : SpecialHandler =
1028
1023
(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
-
1035
1024
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)
1038
1030
case _ => EmptyTree
1039
1031
}
1040
1032
}
0 commit comments