diff options
author | Jon Pretty <jon.pretty@propensive.com> | 2017-11-10 15:23:38 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-10 15:23:38 +0000 |
commit | 9c90d3f393d18ef0f8f27751a8328913dad7ad25 (patch) | |
tree | 345f7f8a497f5fc12e2aaad9cf9e8119e0059d62 /core/src/main/scala/magnolia.scala | |
parent | 657d2fb2c16b75c790bf3c3a63d1f830a42893db (diff) | |
parent | 2ae9a65ed0b773f77b5cd8d8c134a125bbaccf5d (diff) | |
download | magnolia-9c90d3f393d18ef0f8f27751a8328913dad7ad25.tar.gz magnolia-9c90d3f393d18ef0f8f27751a8328913dad7ad25.tar.bz2 magnolia-9c90d3f393d18ef0f8f27751a8328913dad7ad25.zip |
Merge pull request #27 from propensive/allow-type-constructor-in-supertrait
Allow type constructor in supertrait
Diffstat (limited to 'core/src/main/scala/magnolia.scala')
-rw-r--r-- | core/src/main/scala/magnolia.scala | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/core/src/main/scala/magnolia.scala b/core/src/main/scala/magnolia.scala index 293d0f1..9aa5d5f 100644 --- a/core/src/main/scala/magnolia.scala +++ b/core/src/main/scala/magnolia.scala @@ -71,8 +71,21 @@ object Magnolia { val magnoliaObj = q"$magnoliaPkg.Magnolia" val arrayCls = tq"_root_.scala.Array" - val typeConstructor: c.Type = - c.prefix.tree.tpe.member(TypeName("Typeclass")).asType.toType.typeConstructor + val prefixType = c.prefix.tree.tpe + + val typeDefs = prefixType.baseClasses.flatMap { cls => + cls.asType.toType.decls.filter(_.isType).find(_.name.toString == "Typeclass").map { tpe => + tpe.asType.toType.asSeenFrom(prefixType, cls) + } + } + + val typeConstructorOpt = + typeDefs.headOption.map(_.typeConstructor) + + val typeConstructor = typeConstructorOpt.getOrElse { + c.abort(c.enclosingPosition, + "magnolia: the derivation object does not define the Typeclass type constructor") + } def findType(key: Type): Option[TermName] = recursionStack(c.enclosingPosition).frames.find(_.genericType == key).map(_.termName(c)) @@ -258,9 +271,9 @@ object Magnolia { $paramsVal, ($fnVal: Param[$typeConstructor, $genericType] => Any) => new $genericType(..${caseParams.zipWithIndex.map { - case (typeclass, idx) => - q"$fnVal($paramsVal($idx)).asInstanceOf[${typeclass.paramType}]" - } }) + case (typeclass, idx) => + q"$fnVal($paramsVal($idx)).asInstanceOf[${typeclass.paramType}]" + }}) )) }""" ) |