Spec-Zone.ru › Scala 2.13 Reflection

Пакет scala.reflect.macros

пакет macros

ЭКСПЕРИМЕНТАЛЬНЫЙ

Базовый пакет для макросов Scala.

Макросы — это функции, которые вызываются компилятором во время компиляции. В этих функциях программист имеет доступ к API компилятора. Например, можно генерировать, анализировать и проверять типы кода.

См. Руководство по макросам для начала работы с макросами Scala.

Источник
package.scala
Линейные надтипы
AnyRef, Any

Члены пакета

пакетblackbox

пакетwhitebox

Члены типов

тракт 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

ЭКСПЕРИМЕНТАЛЬНО

См. также

scala.reflect.api.Internals

тракт 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API