Пакет scala.reflect.macros
пакет macros
Члены типов
тракт Aliases extends AnyRef
ЭКСПЕРИМЕНТАЛЬНО
Часть контекста макросов Scala, которая определяет сокращения для наиболее часто используемых типов и функций базового компиляторного универсума.
абстрактный класс Attachments extends AnyRef
ЭКСПЕРИМЕНТАЛЬНО
Приложения обеспечивают способ ассоциировать пользовательские метаданные с символами и деревьями.
Наряду с symbol и tpe, которые представляют собой основные метаданные деревьев, каждое дерево несет поле attachments, которое может хранить другие метаданные: определённые компилятором (например, позиции) или определённые пользователем. То же самое верно и для символов, которые также имеют расширяемые метаданные благодаря полю attachments.
Обычно приложения просто хранят scala.reflect.api.Position, но их можно расширить, чтобы охватить произвольные полезные данные. Полезные данные хранятся в индексированных по типу слотах, которые можно читать с помощью get[T] и записывать с помощью update[T] и remove[T].
Этот API не имеет большого применения в API времени выполнения рефлексии (пакет scala.reflect.api), но он может быть полезен для авторов макросов, предоставляя способ координации нескольких макросов, работающих над одним кодом. Поэтому поле attachments объявляется только в деревьях и символах, принадлежащих scala.reflect.macros.Universe.
тракт Enclosures extends AnyRef
ЭКСПЕРИМЕНТАЛЬНО
Часть контекста макросов Scala, которая раскрывает окружающие деревья (метод, класс, единица компиляции и текущее приложение макроса), окружающую позицию макроразвертывания, а также макросы и имплициты, которые сейчас выполняются.
Начиная с Scala 2.11.0, API для получения деревьев, окружающих текущее приложение макроса, устарели, и причины для этого двояки. Во-первых, мы хотим перейти к философии локально развертываемых макросов, так как это оказалось важным для понимания кода. Во-вторых, в текущей архитектуре scalac мы не можем иметь работающие API в стиле c.enclosingTree. Требуемые изменения в типецере намного превышают усилия, которые мы хотели бы затратить на эту функцию, учитывая наличие более актуальных проблем в данный момент. Это в некоторой степени согласуется с общей эволюцией макросов в течение цикла разработки 2.11, где мы экспериментировали с c.introduceTopLevel и c.introduceMember, но в конечном итоге решили их отвергнуть.
Если вы полагаетесь на устаревшие API, рассмотрите использование нового метода c.internal.enclosingOwner, который может быть использован для получения имен окружающих определений. В качестве альтернативы попробуйте переформулировать свои макросы с точки зрения полностью локального развертывания и/или присоединиться к обсуждению потенциальной связанной языковой особенности на https://groups.google.com/forum/#!topic/scala-debate/f4CLmYShX6Q. Мы также приветствуем вопросы и предложения на наших списках рассылки, где мы с удовольствием продолжим обсуждать этот вопрос.
тракт Evals extends AnyRef
ЭКСПЕРИМЕНТАЛЬНО
Часть контекста макросов Scala, которая предоставляет возможность оценивать деревья.
тракт ExprUtils extends AnyRef
ЭКСПЕРИМЕНТАЛЬНО
Часть контекста макросов Scala, которая определяет сокращения для наиболее распространённых Expr-создающих функций.
тракт FrontEnds extends AnyRef
ЭКСПЕРИМЕНТАЛЬНО
Часть контекста макросов Scala, которая предоставляет средства для связи с передним концом компилятора (вывод предупреждений, ошибок и других сообщений).
тракт Infrastructure extends AnyRef
ЭКСПЕРИМЕНТАЛЬНО
Часть контекста макросов Scala, которая предоставляет средства для связи с инфраструктурой компилятора.
тракт Internals extends AnyRef
ЭКСПЕРИМЕНТАЛЬНО
- См. также
тракт Names extends AnyRef
ЭКСПЕРИМЕНТАЛЬНО
Часть контекста макросов Scala, которая предоставляет функции для генерации новых имён.
В текущей реализации новые имена более или менее уникальны в том смысле, что в пределах одной сессии компиляции они гарантированно не конфликтуют с: 1) Результатами предыдущих и будущих вызовов функций семейства freshName 2) Определёнными пользователем или сгенерированными макросами именами, которые не содержат символов доллара 3) Именами, сгенерированными макросами, которые создаются путём конкатенации имён из первой, второй и третьей категорий.
Уникальность новых имён в разных сессиях компиляции не гарантируется, но это то, что мы хотели бы улучшить в будущих версиях. Подробнее см. https://github.com/scala/bug/issues/6879.
случайный класс ParseException(pos: Position, msg: String) extends Exception with Product with Serializable
тракт Parsers extends AnyRef
ЭКСПЕРИМЕНТАЛЬНО
Срезок контекста макросов Scala, предоставляющий функции для разбора строк со скала-кодом в деревья.
класс-объект ReificationException(pos: Position, msg: String) extends Исключение with Product with Serializable
Указывает ожидаемую ошибку во время одного из методов reifyXXX в scala.reflect.macros.Reifiers. Такие ошибки представляют один из стандартных способов, которыми может пойти не так реификация, например, попытка создать TypeTag из слабого типа.
Тракт Reifiers extends Object
ЭКСПЕРИМЕНТАЛЬНО
Срезок контекста макросов Scala, который предоставляет функции для сохранения артефактов рефлексии для выполнения.
класс-объект TypecheckException(pos: Position, msg: String) extends Исключение with Product with Serializable
Тракт Typers extends Object
ЭКСПЕРИМЕНТАЛЬНО
Срезок контекста макросов Scala, частично предоставляющий доступ к типовой проверке для авторов макросов.
класс-объект UnexpectedReificationException(pos: Position, msg: String, cause: Throwable = null) extends Исключение with Product with Serializable
Указывает непредвиденную ожидаемую ошибку во время одного из методов reifyXXX в scala.reflect.macros.Reifiers. Такие ошибки обертывают случайные сбои в логике реификации и отличаются от ожидаемых scala.reflect.macros.ReificationException, чтобы последние можно было сообщать как ошибки компиляции, тогда как первые проявляются как сбои компилятора.
абстрактный класс Universe extends api.Universe
ЭКСПЕРИМЕНТАЛЬНО
Уточнение scala.reflect.api.Universe для использования авторами макросов.
Этот универсум обеспечивает изменяемость для артефактов рефлексии (например, макросы могут изменять типы деревьев компилятора, добавлять аннотации к символам, представляющим определения и т. д.) и предоставляет некоторые внутренние функции компилятора, такие как Symbol.deSkolemize или Tree.attachments.
© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.13.0/scala-reflect/scala/reflect/macros/index.html
ЭКСПЕРИМЕНТАЛЬНЫЙ
Базовый пакет для макросов Scala.
Макросы — это функции, которые вызываются компилятором во время компиляции. В этих функциях программист имеет доступ к API компилятора. Например, можно генерировать, анализировать и проверять типы кода.
См. Руководство по макросам для начала работы с макросами Scala.