diff options
author | Jon Pretty <jon.pretty@propensive.com> | 2017-11-30 18:51:35 +0000 |
---|---|---|
committer | Jon Pretty <jon.pretty@propensive.com> | 2017-11-30 18:51:35 +0000 |
commit | e1bb3f9c514a2b473076e5fd98b87c26885cd223 (patch) | |
tree | 6b9ce78c34d9f0f1c33d6596688ffc8d5d6459c4 /core/shared/src/main | |
parent | d88b15e99e2727558bb901fcc08398862f633c11 (diff) | |
parent | 6cdb7d145f2784712bc5b56824cbc7f04f9a32e4 (diff) | |
download | magnolia-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.scala | 16 |
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) { |