Доступ к методу недоступен в классе Macro

У меня есть следующий макрос, определяющий класс и возвращающий экземпляр этого класса (с Scala 2.10.2 и плагин макроса):

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
  """}
}

Когда я вызываю макрос:

case class Cat(name: String)

val t = test[Cat].method

Я получаю следующую ошибку:

method method in class Test cannot be accessed in Test
val t = test[Cat].method
                   ^

Моя общая цель - использовать методы вампиров и использовать квазициты для описания сгенерированного класса. Как я могу решить эту ошибку?

Ответ 1

В моем посте о методах вампиров я упоминаю этот обходной путь для эту ошибку, По какой-то причине вы в настоящее время не можете увидеть методы анонимного класса в экземпляре, возвращенном из макроса, если вы не создаете класс-оболочку, который расширяет класс с помощью методов и вместо этого возвращает экземпляр этого.

Вы видите ту же ошибку с немного другого угла. Вы назвали класс с методами, которые вы хотите увидеть на возвращаемом экземпляре типа структуры, но вам все равно нужна оболочка. Будет работать следующее:

  c.Expr { q"""
    class $className  {
      def method = 1
    }
    new $className {}
  """}

Обратите внимание, что все, что я сделал, это добавить пару скобок к строке, создающей экземпляр, так что я получаю экземпляр анонимного класса, расширяющий $className, а не только $className.

Я понятия не имею, что за этой ошибкой, и я не уверен, знает ли Евгений больше. Недавно я подтвердил, что он все еще находится в последней версии 2.11.