間違った用語を使用している可能性がありますが、ここに私が達成したい例を示します。次のマクロがあるとします。
def generateField[T]: AnyRef =
macro generateFieldImpl[T]
def generateFieldImpl[T: c.AbsTypeTag](c: Context): c.Expr[AnyRef] = {
/**
* here I'm looking at the type T by reflection to see now many members it has
* and based on that I'm generating TupleN[Array[Byte], ...](null, ...)
* where N is number of members in class represented by type T
*/
}
ケースクラスのみを T として使用する予定です。
このマクロをケース クラスで使用するとうまく機能しますが、抽象化のレベルを追加したいと思います。
trait WithGeneratedField[T] {
val _myField = generateField[T]
}
私が抱えている問題は、特性が宣言されているときにマクロが展開され、その時点で T が抽象型 'T' として知られていることです。この特性を具体的なものと混ぜるまで、マクロ展開を延期する方法はありますか? 例えば:
case class MyClass(a: String, b: Int) extends WithGeneratedField[MyClass]
最後の私の目標は、マクロを使用して、生成されたフィールドをケース クラスに追加することです。多分それを行うより良い方法がありますか?