Отражение вложенного списка во время компиляции: typecheck List[List[Int]] возвращает List[List[]]?

Я использую аннотации макросов для проверки полей класса и добавления члена на основе этих полей.

e.g.

@AddVal
class A(x: Int)

расширяется до

class A(x: Int){
  val get: Int = x
}

После извлечения ValDef поле tpe по-прежнему null, поэтому, чтобы получить тип, у меня есть два варианта:

1) Если я вызову .toString в дереве типов, я увижу тип, но теперь я потерял некоторую безопасность типов

2) Если я использую c.typecheck для дерева типов, я могу получить тип, но только если он имеет глубину 1 уровень. List[List[Int]] возвращается как List[List[...]]

        val fieldType = c.typecheck(q"type T = ${f.tpt}") match {
          case x @ TypeDef(mods, name, tparams, rhs)  => rhs.tpe
        }

Итак, есть ли способ рекурсивно проверять политипы?

Я снова попытался проверить тип rhs, но получил The argument types of an anonymous function must be fully known и не знаю, как это решить.

Спасибо, что заглянули,

Джулиан


person Julian Peeters    schedule 14.08.2015    source источник


Ответы (1)


Я ошибочно приписал эту ошибку макросу, хотя на самом деле был другой базовый макрос (макрос поставщика типов), который не мог обеспечить правильный вложенный тип (в данном случае Int).

person Julian Peeters    schedule 20.09.2015