? Podría estar utilizando una terminología incorrecta, pero aquí hay un ejemplo de lo que me gustaría lograr. Digamos que tengo la siguiente macro:¿Es posible aplazar la expansión de macros hasta que el tipo abstracto se vincule al tipo específico
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
*/
}
tengo la intención de utilizar sólo las clases de casos como T.
Cuando utilizo esta macro con la clase de caso que funciona muy bien, pero ahora me gustaría añadir un nivel de abstracción:
trait WithGeneratedField[T] {
val _myField = generateField[T]
}
El problema que estoy teniendo es que la macro se expande cuando se declaró rasgo y en ese punto T se conoce como un tipo abstracto de 'T'. ¿Hay alguna manera de diferir la macro expansión hasta que mezcle este rasgo con algo concreto? Por ejemplo:
case class MyClass(a: String, b: Int) extends WithGeneratedField[MyClass]
Al final, mi objetivo es usar macro para agregar un campo generado a una clase de caso. Tal vez hay una mejor manera de hacer eso?