マクロを使用して、特定のタイプのすべてのサブクラスに一致する一致ステートメントを作成しようとしています。しかし、ケース クラスのフィールド値の抽出に問題があります。例えば:
sealed abstract class Foobar
case class Foo(x:Int,f:Foobar) extends Foobar
case class Bar(s:String, f:Foobar) extends Foobar
Foobar が指定された場合、次のようなコードを作成したいと思います。
e1 match {
case Foo(args) => args.toString
case Bar(args) => args.toString
}
それは私がこれまでに得たものです:
def eqImpl[A: c.WeakTypeTag](c: Context)(e1: c.Expr[A], e2: c.Expr[A]): c.Expr[Boolean] = {
import c.universe._
val tpe = c.weakTypeOf[A].typeSymbol.asClass
tpe.typeSignature // SI-7046
val subclasses = tpe.knownDirectSubclasses
val cases =
subclasses.map{ clazz =>
cq"x: $clazz => x "
}
println(cases)
reify(true)
}
このコードは Foo と Bar に一致しますが、右側に必要なフィールドを抽出できません。