Причины для устаревания:
Начиная с Scala 2.11.0, API-интерфейсы для получения деревьев, включенных в текущее приложение макроса, устарели, и причины этого двоякие. Во-первых, мы хотели бы перейти к философии локально-расширенных макросов, так как это оказалось важным для понимания кода. Во-вторых, в существующей архитектуре скалака мы не можем иметь надежно работающие API стиля c.enclosingTree
. Требуемые изменения в проверщике типов значительно превысят усилия, которые мы хотели бы потратить на эту функцию, учитывая наличие более насущных проблем на данный момент. Это в некоторой степени согласуется с общей эволюцией макросов в течение цикла разработки 2.11, где мы играли с c.introduceTopLevel
и c.introduceMember
, но в конце дня решили отклонить их.
Если выполагаясь на устаревшие API, рассмотрите возможность использования нового метода c.internal.enclosingOwner
, который можно использовать для получения имен включающих определений. В качестве альтернативы попробуйте переформулировать свои макросы в терминах полностью локального расширения ...
https://www.scala -lang.org / api / 2.13.0 / scala-рефлексия / scala / рефлексия / макросы /Enclosures.html
Что касается получения дерева из символа
, то не существует стандартного способа перехода от символа к определяющему дереву
https://stackoverflow.com/a/13768595/5249621
Зачем вам нужен макрос def, чтобы получить определение val
/ var
?
Может быть, аннотаций макросов может быть достаточно https://docs.scala -lang.org/overviews/macros/annotations.html