Есть ли альтернатива устаревшему методу enclosingClass в библиотеке ссылок Scala? - PullRequest
1 голос
/ 08 октября 2019

Я пишу макрос, чтобы получить определение val/var. Я могу получить вмещающий символ val/var, но не могу получить определяющее дерево. Одно из предложенных здесь решений предполагает использование enclosingClass: https://stackoverflow.com/a/18451114/11989864 Но все API в стиле дерева вложений устарели: https://www.scala -lang.org / api / 2.13.0 / scala-рефлект / scala / рефлекс/macros/blackbox/Context.html Есть ли способ реализовать функциональность enclosingClass? Или получить дерево из символа?

1 Ответ

1 голос
/ 08 октября 2019

Причины для устаревания:

Начиная с 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

...