2

私は封印された特性の直接のサブタイプを列挙するマクロを持っています:

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 を使用してこれを回避する必要があります。どういうわけか、いくつかの追加の型ツリーを強制的に初期化する必要があると思いますか?

4

1 に答える 1

0

考えられる回避策は次のとおりです(@EugeneBurmakoはどう思いますか)。

val cls: ClassSymbol = sub.asClass

println(s"knownDirectSubclasses = ${cls.knownDirectSubclasses}")
// print "knownDirectSubclasses = Set()"

val subsub = cls.owner.typeSignature.decls.filter {
  case c: ClassSymbol =>
    cls != c && c.selfType.baseClasses.contains(cls)

  case _ => false
}

println(s"subsub = $subsub")
// print the actual sub classes
于 2016-08-11T18:22:44.183 に答える