diff options
author | Jon Pretty <jon.pretty@propensive.com> | 2018-06-05 17:39:28 +0100 |
---|---|---|
committer | Jon Pretty <jon.pretty@propensive.com> | 2018-06-05 17:39:28 +0100 |
commit | be5fef3cc9be37a351d24ba2c42cf1d2b801ae44 (patch) | |
tree | 0d36e0ec8844485dfa520b5e8c147439bea7aaee /core/shared | |
parent | dfb9ece2dcd0352c7953fe372d6772776d18e3e5 (diff) | |
download | magnolia-be5fef3cc9be37a351d24ba2c42cf1d2b801ae44.tar.gz magnolia-be5fef3cc9be37a351d24ba2c42cf1d2b801ae44.tar.bz2 magnolia-be5fef3cc9be37a351d24ba2c42cf1d2b801ae44.zip |
Calculate all leaf nodes for knownDirectSubclasses
Should fix #88
Diffstat (limited to 'core/shared')
-rw-r--r-- | core/shared/src/main/scala/magnolia.scala | 9 |
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 |