As has been discussed many times on SO, a Scala match will warn you if you don\'t exhaustively list all of the types deriving from a sealed class.
What I want is a
Update. Since 2.10.0-M7 we're exposing the methods mentioned in this answer as a part of public API. isSealed
is ClassSymbol.isSealed
and sealedDescendants
is ClassSymbol.knownDirectSubclasses
.
This is not going to be an answer to your question.
But, if you're willing to settle for something more like Enumeration.values()
, and you're using a recent milestone of 2.10, and you're willing to muck about with some ugly casting-to-internal-APIs business, you can write the following:
import scala.reflect.runtime.universe._
def sealedDescendants[Root: TypeTag]: Option[Set[Symbol]] = {
val symbol = typeOf[Root].typeSymbol
val internal = symbol.asInstanceOf[scala.reflect.internal.Symbols#Symbol]
if (internal.isSealed)
Some(internal.sealedDescendants.map(_.asInstanceOf[Symbol]) - symbol)
else None
}
Now if you've got a hierarchy like this:
object Test {
sealed trait Parent
case object A extends Parent
case object B extends Parent
case object C extends Parent
}
You can get the type symbols for the members of the sealed type hierarchy like this:
scala> sealedDescendants[Test.Parent] getOrElse Set.empty
res1: Set[reflect.runtime.universe.Symbol] = Set(object A, object B, object C)
It's hideous, but I don't think you're going to get what you actually want without writing a compiler plugin.