Możliwe, że używam niewłaściwej terminologii, ale oto przykład, który chciałbym osiągnąć. Powiedzmy mam następujące makro:Czy można odroczyć makro, dopóki typ abstrakcyjny nie zostanie przypisany do określonego typu?
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
*/
}
mam zamiar używać tylko zajęcia przypadków jak T.
Kiedy używam tego makra z klasą przypadku działa świetnie, ale teraz chciałbym dodać poziom abstrakcji:
trait WithGeneratedField[T] {
val _myField = generateField[T]
}
problem mam jest to, że makro zostanie rozszerzony gdy cecha jest zadeklarowane i w tym punkcie T jest znany jako abstrakcyjne typu „T”. Czy istnieje sposób na odroczenie ekspansji makr, dopóki nie połączę tej cechy z czymś konkretnym? Na przykład:
case class MyClass(a: String, b: Int) extends WithGeneratedField[MyClass]
Na koniec moim celem jest użycie makra do dodania wygenerowanego pola do klasy sprawy. Może jest lepszy sposób na zrobienie tego?