@@ -884,14 +884,38 @@ trait Implicits { self: Typer =>
884
884
*
885
885
* <parent> {
886
886
* MirroredMonoType = <monoType>
887
- * MirroredTypeConstrictor = <tycon>
888
- * MirroredLabel = <label> }
887
+ * MirroredType = <mirroredType>
888
+ * MirroredLabel = <label>
889
+ * Scope = <scope> // if scope ne NoType
890
+ * }
889
891
*/
890
- private def mirrorCore (parentClass : ClassSymbol , monoType : Type , mirroredType : Type , label : Name )(implicit ctx : Context ) = {
891
- parentClass.typeRef
892
+ private def mirrorCore (parentClass : ClassSymbol , monoType : Type , mirroredType : Type , label : Name , extras : List [( Name , Type )] )(implicit ctx : Context ) = {
893
+ val m = parentClass.typeRef
892
894
.refinedWith(tpnme.MirroredMonoType , TypeAlias (monoType))
893
895
.refinedWith(tpnme.MirroredType , TypeAlias (mirroredType))
894
896
.refinedWith(tpnme.MirroredLabel , TypeAlias (ConstantType (Constant (label.toString))))
897
+
898
+ extras.foldLeft(m) { case (m, (tpnme, tpe)) => m.refinedWith(tpnme, tpe) }
899
+ }
900
+
901
+ private def extraRefinements (formal : Type )(implicit ctx : Context ): List [(Name , Type )] = {
902
+ def isMirrorMember (nme : Name ): Boolean =
903
+ nme == tpnme.MirroredType ||
904
+ nme == tpnme.MirroredMonoType ||
905
+ nme == tpnme.MirroredLabel ||
906
+ nme == tpnme.MirroredElemTypes ||
907
+ nme == tpnme.MirroredElemLabels
908
+
909
+ @ tailrec
910
+ def loop (tp : Type , acc : List [(Name , Type )]): List [(Name , Type )] = tp match {
911
+ case RefinedType (parent, nme, rhs) if ! isMirrorMember(nme) =>
912
+ loop(parent, (nme, rhs) :: acc)
913
+ case RefinedType (parent, nme, rhs) =>
914
+ loop(parent, acc)
915
+ case other =>
916
+ acc
917
+ }
918
+ loop(formal, Nil )
895
919
}
896
920
897
921
/** A path referencing the companion of class type `clsType` */
@@ -916,12 +940,12 @@ trait Implicits { self: Typer =>
916
940
val module = mirroredType.termSymbol
917
941
val modulePath = pathFor(mirroredType).withSpan(span)
918
942
if (module.info.classSymbol.is(Scala2x )) {
919
- val mirrorType = mirrorCore(defn.Mirror_SingletonProxyClass , mirroredType, mirroredType, module.name)
943
+ val mirrorType = mirrorCore(defn.Mirror_SingletonProxyClass , mirroredType, mirroredType, module.name, extraRefinements(formal) )
920
944
val mirrorRef = New (defn.Mirror_SingletonProxyClass .typeRef, modulePath :: Nil )
921
945
mirrorRef.cast(mirrorType)
922
946
}
923
947
else {
924
- val mirrorType = mirrorCore(defn.Mirror_SingletonClass , mirroredType, mirroredType, module.name)
948
+ val mirrorType = mirrorCore(defn.Mirror_SingletonClass , mirroredType, mirroredType, module.name, extraRefinements(formal) )
925
949
modulePath.cast(mirrorType)
926
950
}
927
951
}
@@ -943,7 +967,7 @@ trait Implicits { self: Typer =>
943
967
(mirroredType, elems)
944
968
}
945
969
val mirrorType =
946
- mirrorCore(defn.Mirror_ProductClass , monoType, mirroredType, cls.name)
970
+ mirrorCore(defn.Mirror_ProductClass , monoType, mirroredType, cls.name, extraRefinements(formal) )
947
971
.refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
948
972
.refinedWith(tpnme.MirroredElemLabels , TypeAlias (TypeOps .nestedPairs(elemLabels)))
949
973
val mirrorRef =
@@ -1024,7 +1048,7 @@ trait Implicits { self: Typer =>
1024
1048
}
1025
1049
1026
1050
val mirrorType =
1027
- mirrorCore(defn.Mirror_SumClass , monoType, mirroredType, cls.name)
1051
+ mirrorCore(defn.Mirror_SumClass , monoType, mirroredType, cls.name, extraRefinements(formal) )
1028
1052
.refinedWith(tpnme.MirroredElemTypes , TypeAlias (elemsType))
1029
1053
.refinedWith(tpnme.MirroredElemLabels , TypeAlias (TypeOps .nestedPairs(elemLabels)))
1030
1054
val mirrorRef =
0 commit comments