Как проверить тип 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Вы можете получить доступ к символу и делать все обычные вещи.

Другие вопросы по тегам