aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Pretty <jon.pretty@propensive.com>2018-06-05 23:53:26 +0200
committerGitHub <noreply@github.com>2018-06-05 23:53:26 +0200
commita59b1e72c9ad076034bde13be1e0f90452b45f20 (patch)
tree0d36e0ec8844485dfa520b5e8c147439bea7aaee
parentdfb9ece2dcd0352c7953fe372d6772776d18e3e5 (diff)
parentbe5fef3cc9be37a351d24ba2c42cf1d2b801ae44 (diff)
downloadmagnolia-a59b1e72c9ad076034bde13be1e0f90452b45f20.tar.gz
magnolia-a59b1e72c9ad076034bde13be1e0f90452b45f20.tar.bz2
magnolia-a59b1e72c9ad076034bde13be1e0f90452b45f20.zip
Merge pull request #98 from propensive/known-direct-and-indirect-subclasses
Calculate all leaf nodes for knownDirectSubclasses
-rw-r--r--core/shared/src/main/scala/magnolia.scala9
1 files changed, 8 insertions, 1 deletions
diff --git a/core/shared/src/main/scala/magnolia.scala b/core/shared/src/main/scala/magnolia.scala
index 90d872f..6001977 100644
--- a/core/shared/src/main/scala/magnolia.scala
+++ b/core/shared/src/main/scala/magnolia.scala
@@ -99,6 +99,13 @@ object Magnolia {
def error(msg: String) = c.abort(c.enclosingPosition, msg)
+ def knownSubclasses(sym: ClassSymbol): List[Symbol] = {
+ val children = sym.knownDirectSubclasses.toList
+ val (abstractTypes, concreteTypes) = children.partition(_.isAbstract)
+
+ abstractTypes.map(_.asClass).flatMap(knownSubclasses(_)) ::: concreteTypes
+ }
+
val typeDefs = prefixType.baseClasses.flatMap { cls =>
cls.asType.toType.decls.filter(_.isType).find(_.name.toString == "Typeclass").map { tpe =>
tpe.asType.toType.asSeenFrom(prefixType, cls)
@@ -326,7 +333,7 @@ object Magnolia {
}})}))
}""")
} else if (isSealedTrait) {
- val genericSubtypes = classType.get.knownDirectSubclasses.toList
+ val genericSubtypes = knownSubclasses(classType.get)
val subtypes = genericSubtypes.map { sub =>
val subType = sub.asType.toType // FIXME: Broken for path dependent types
val typeParams = sub.asType.typeParams