私は封印された特性の直接のサブタイプを列挙するマクロを持っています:
import scala.reflect.macros.Context
import language.experimental.macros
object Checker {
def apply[A]: Unit = macro applyImpl[A]
def applyImpl[A: c.WeakTypeTag](c: Context): c.Expr[Unit] = {
val tpe = c.weakTypeOf[A].typeSymbol.asClass
require (tpe.isSealed)
tpe.typeSignature // SI-7046
require (tpe.knownDirectSubclasses.nonEmpty)
import c.universe._
c.Expr[Unit](reify {} .tree)
}
}
次に、これは機能します:
sealed trait A
case class A1(i: Int) extends A
object NotNested {
val nada = Checker[A]
}
しかし、これは失敗します:
object Nested {
sealed trait A
case class A1(i: Int) extends A
val nada = Checker[A]
}
[error] java.lang.IllegalArgumentException: requirement failed:
Did not find sub classes
SI-7046に遭遇したと思ったので、 への呼び出しを追加しましたtpe.typeSignature
が、明らかに役に立ちません。
Scala 2.10.2 を使用してこれを回避する必要があります。どういうわけか、いくつかの追加の型ツリーを強制的に初期化する必要があると思いますか?