aboutsummaryrefslogtreecommitdiff
path: root/core/shared/src/main
diff options
context:
space:
mode:
authorJon Pretty <jon.pretty@propensive.com>2017-11-30 18:51:35 +0000
committerJon Pretty <jon.pretty@propensive.com>2017-11-30 18:51:35 +0000
commite1bb3f9c514a2b473076e5fd98b87c26885cd223 (patch)
tree6b9ce78c34d9f0f1c33d6596688ffc8d5d6459c4 /core/shared/src/main
parentd88b15e99e2727558bb901fcc08398862f633c11 (diff)
parent6cdb7d145f2784712bc5b56824cbc7f04f9a32e4 (diff)
downloadmagnolia-e1bb3f9c514a2b473076e5fd98b87c26885cd223.tar.gz
magnolia-e1bb3f9c514a2b473076e5fd98b87c26885cd223.tar.bz2
magnolia-e1bb3f9c514a2b473076e5fd98b87c26885cd223.zip
Merge branch 'joroKr21-existentials'
Diffstat (limited to 'core/shared/src/main')
-rw-r--r--core/shared/src/main/scala/magnolia.scala16
1 files changed, 9 insertions, 7 deletions
diff --git a/core/shared/src/main/scala/magnolia.scala b/core/shared/src/main/scala/magnolia.scala
index 6528db0..a748561 100644
--- a/core/shared/src/main/scala/magnolia.scala
+++ b/core/shared/src/main/scala/magnolia.scala
@@ -65,6 +65,7 @@ object Magnolia {
* */
def gen[T: c.WeakTypeTag](c: whitebox.Context): c.Tree = {
import c.universe._
+ import internal._
val magnoliaPkg = q"_root_.magnolia"
val scalaPkg = q"_root_.scala"
@@ -250,9 +251,7 @@ object Magnolia {
val caseParamsReversed = caseClassParameters.foldLeft[List[CaseParam]](Nil) {
(acc, param) =>
val paramName = param.name.decodedName.toString
- val paramTypeSubstituted = param.returnType.substituteTypes(
- genericType.etaExpand.typeParams,
- genericType.typeArgs)
+ val paramTypeSubstituted = param.typeSignatureIn(genericType).resultType
val (repeated, paramType) = paramTypeSubstituted match {
case TypeRef(_, `repeatedParamClass`, typeArgs) =>
@@ -345,10 +344,13 @@ object Magnolia {
} else if (isSealedTrait) {
val genericSubtypes = classType.get.knownDirectSubclasses.to[List]
val subtypes = genericSubtypes.map { sub =>
- val typeArgs = sub.asType.typeSignature.baseType(genericType.typeSymbol).typeArgs
- val mapping = typeArgs.zip(genericType.typeArgs).toMap
- val newTypeParams = sub.asType.toType.typeArgs.map(mapping(_))
- appliedType(sub.asType.toType.typeConstructor, newTypeParams)
+ val subType = sub.asType.toType // FIXME: Broken for path dependent types
+ val typeParams = sub.asType.typeParams
+ val typeArgs = thisType(sub).baseType(genericType.typeSymbol).typeArgs
+ val mapping = (typeArgs.map(_.typeSymbol), genericType.typeArgs).zipped.toMap
+ val newTypeArgs = typeParams.map(mapping.withDefault(_.asType.toType))
+ val applied = appliedType(subType.typeConstructor, newTypeArgs)
+ existentialAbstraction(typeParams, applied)
}
if (subtypes.isEmpty) {