Как проверить тип DefDef
В аннотации Macro я перечисляю членов класса и хочу типы методов, которые я нахожу.
Так что я с удовольствием перебираю body
класса и собрать все DefDef
члены.
... который я не могу проверить
Для каждого DefDef
Я пытался обернуть его в Expr
и используя actualType
, Я попытался продублировать эту вещь и перенести ее в специальный класс (через квазицитаты). Я пробовал все остальное, что я могу придумать:)
Лучшее, что я могу получить, это либо NoType
или же Any
в зависимости от используемой техники. Худшее, что я могу получить - это получить исключение.
Это простые методы вида def foo(i: String) = i
, поэтому тип вывода должен быть выведен, но никакой внешней информации не требуется. Здесь нет ни абстрактных типов, ни параметров типов, ни других членов класса. Я хотел бы разобраться с более сложными случаями позже, но хочу, чтобы эти тривиальные примеры работали первыми.
В плагине это было бы просто. Я бы просто проверил весь блок с подавленными ошибками и получил желаемое с помощью символов, а затем сбросил атрибуты дерева для последующей обработки. Как макрос... я в тупике.
Что мне не хватает?
1 ответ
В макросе то же самое. Вместо typed
как в плагинах, вы звоните c.typeCheck
, но должны быть осторожны, чтобы не попасть в ловушку ( https://github.com/scalamacros/paradise/issues/1), которая должна быть исправлена в 2.10.5 и 2.11.0. После успешного возвращения из c.typeCheck
Вы можете получить доступ к символу и делать все обычные вещи.