mam następujące makro definiując klasę i powrocie instancję tej klasy (z Scala 2.10.2 i wtyczki makro):Metoda nie mogą być dostępne w Makro generowanej klasy
def test[T] = macro testImpl[T]
def testImpl[T : c.WeakTypeTag](c: Context): c.Expr[Any] = {
import c.universe._
val className = newTypeName("Test")
c.Expr { q"""
class $className {
def method = 1
}
new $className
"""}
}
Kiedy wywołać makro :
case class Cat(name: String)
val t = test[Cat].method
pojawia się następujący błąd:
method method in class Test cannot be accessed in Test
val t = test[Cat].method
^
Moim nadrzędnym celem jest wykorzystanie vampire methods i użyć quasi-cudzysłowu do opisania wygenerowanej klasy. Jak mogę rozwiązać ten błąd?
Czy twoja zsyntetyzowana klasa nie może rozszerzyć cechy, która abstrakcyjnie definiuje "metodę"? –
Nie, ponieważ muszę generować te metody o określonych nazwach. Próbując to zrobić, zdałem sobie sprawę, że nie mam dostępu do nie generowanych metod. Podejrzewam, że nie używam tu poprawnie quasi-cytatów. – Eric
Nie miałem pojęcia, że istnieje teraz wtyczka kompilatora dla makrowego raju (w przeciwieństwie do bycia zmuszonym do używania rozwidlonego kompilatora). Jeśli chcesz się tego nauczyć, bardzo dziękuję za twoje pytanie. –