Spec-Zone.ru › Scala 2.13 Reflection

Трейт scala.reflect.macros.Reifiers

трейт Reifiers extends AnyRef

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

Часть контекста макросов Scala, предоставляющая функции для сохранения артефактов отражения для времени выполнения.

Тип self
blackbox.Context
Исходный код
Reifiers.scala
Линейные суперклассы
AnyRef, Any
Известные подклассы
Context, Context

Абстрактные члены-значения

abstract def reifyEnclosingRuntimeClass: blackbox.Context.Tree

Для заданного типа сгенерировать дерево, которое при компиляции и выполнении возвращает класс времени выполнения внешнего класса или модуля. Возвращает EmptyTree, если внешнего класса или модуля не существует.

abstract def reifyRuntimeClass(tpe: blackbox.Context.Type, concrete: Boolean = true): blackbox.Context.Tree

Для заданного типа сгенерировать дерево, которое при компиляции и выполнении возвращает класс времени выполнения исходного типа. Если concrete имеет значение true, эта функция завершится с ошибкой для типов, ссылающихся на абстрактные типы (как это делает ClassTag).

abstract def reifyTree(universe: blackbox.Context.Tree, mirror: blackbox.Context.Tree, tree: blackbox.Context.Tree): blackbox.Context.Tree

Для заданного дерева сгенерировать дерево, которое при компиляции и выполнении воспроизводит исходное дерево. Дополнительные сведения и примеры см. в документации к Universe.reify.

Созданное дерево будет привязано к указанным universe и mirror. Возможные значения для universe включают universe.internal.gen.mkRuntimeUniverseRef. Возможные значения для mirror включают EmptyTree (в этом случае реификатор автоматически выберет подходящее зеркало).

Эта функция тесно связана с Universe.reify — макросом, который реифицирует произвольные выражения в деревья времени выполнения. Они выполняют очень похожие действия (Universe.reify вызывает Context.reifyTree для собственной реализации), но работают на разных метауровнях (см. ниже).

Рассмотрим различия между Context.reifyTree и Universe.reify на примере их использования внутри макроса fooMacro:

* Поскольку reify сам является макросом, он будет выполнен во время компиляции fooMacro (метауровень -1) и создаст дерево, которое при вычислении во время раскрытия макроса fooMacro (метауровень 0) восстановит входное дерево.

Это предоставляет возможность, аналогичную квазицитированию. Запись "reify{ expr }" создаст AST, представляющее expr. Затем этот AST (или его части) можно использовать для построения возвращаемого значения fooMacro.

* reifyTree вычисляется во время раскрытия макроса (метауровень 0) и создаст дерево, которое при вычислении во время выполнения программы (метауровень 1) восстановит входное дерево.

Это позволяет сохранить определённые деревья, созданные во время раскрытия макроса, чтобы позже исследовать их во время выполнения. Например, авторам DSL может быть полезно сохранять фрагменты DSL в виде AST, которые затем обрабатываются во время выполнения специфичным для предметной области способом.

Также обратите внимание на различие между вселенными деревьев времени выполнения, создаваемых двумя вызовами reify:

* Результат компиляции и выполнения результата reify будет привязан к Universe, вызвавшей reify. Это возможно, поскольку reify — макрос и может генерировать любой необходимый код.

* Результат компиляции и выполнения результата reifyTree будет prefix, который нужно передать явно. Это происходит потому, что Universe вычисленного результата находится на другом метауровне, чем Context вызванного reify.

Обычно эта функция используется для сохранения некоторых деревьев, полученных или созданных макросом, в форме, которую можно исследовать (с помощью сопоставления с образцом) либо компилировать и выполнять (с помощью рефлексивного ToolBox) во время выполнения.

abstract def reifyType(universe: blackbox.Context.Tree, mirror: blackbox.Context.Tree, tpe: blackbox.Context.Type, concrete: Boolean = false): blackbox.Context.Tree

Для заданного типа сгенерировать дерево, которое при компиляции и выполнении возвращает исходный тип. Созданное дерево будет привязано к указанным universe и mirror. Дополнительные сведения и примеры см. в документации к Context.reifyTree и Universe.reify.

abstract def unreifyTree(tree: blackbox.Context.Tree): blackbox.Context.Tree

Отменяет реификацию дерева.

Эта операция не просто восстанавливает исходное дерево (это привело бы к потере контекста реификации), а выполняет более сложное преобразование, которое соответствует следующим законам:

1) unreifyTree(reifyTree(tree)) != tree // реифицированное обратно дерево — это дерево + сохранённый контекст // в текущей реализации результат unreify непрозрачен // то есть невозможно исследовать лежащее в его основе дерево/контекст

2) reifyTree(unreifyTree(reifyTree(tree))) == reifyTree(tree) // результат реификации дерева в исходном контексте равен // результату реификации дерева вместе с сохранённым контекстом

3) compileAndEval(unreifyTree(reifyTree(tree))) ~ compileAndEval(tree) // во время выполнения исходное и реифицированное обратно деревья эквивалентны по поведению

Члены конкретных значений

final def !=(arg0: Any): Boolean

Определяющие классы
AnyRef → Any

final def ##(): Int

Определяющие классы
AnyRef → Any

def +(other: String): String

Неявный
Этот член добавлен неявным преобразованием из Reifiers в any2stringadd[Reifiers] с помощью метода any2stringadd в scala.Predef.
Определяющие классы
any2stringadd

def ->[B](y: B): (Reifiers, B)

Неявный
Этот член добавлен неявным преобразованием из Reifiers в ArrowAssoc[Reifiers] с помощью метода ArrowAssoc в scala.Predef.
Определяющие классы
ArrowAssoc
Аннотации
@inline()

final def ==(arg0: Any): Boolean

Определяющие классы
AnyRef → Any

final def asInstanceOf[T0]: T0

Определяющие классы
Any

def clone(): AnyRef

Атрибуты
protected[java.lang]
Определяющие классы
AnyRef
Аннотации
@throws(classOf[java.lang.CloneNotSupportedException]) @native()

def ensuring(cond: (Reifiers) => Boolean, msg: => Any): Reifiers

Неявный
Этот член добавлен неявным преобразованием из Reifiers в Ensuring[Reifiers] с помощью метода Ensuring в scala.Predef.
Определяющие классы
Ensuring

def ensuring(cond: (Reifiers) => Boolean): Reifiers

Неявный
Этот член добавлен неявным преобразованием из Reifiers в Ensuring[Reifiers] с помощью метода Ensuring в scala.Predef.
Определяющие классы
Ensuring

def ensuring(cond: Boolean, msg: => Any): Reifiers

Неявный
Этот член добавлен неявным преобразованием из Reifiers в Ensuring[Reifiers] с помощью метода Ensuring в scala.Predef.
Определяющие классы
Ensuring

def ensuring(cond: Boolean): Reifiers

Неявный
Этот член добавлен неявным преобразованием из Reifiers в Ensuring[Reifiers] с помощью метода Ensuring в scala.Predef.
Определяющие классы
Ensuring

final def eq(arg0: AnyRef): Boolean

Определяющие классы
AnyRef

def equals(arg0: AnyRef): Boolean

Определяющие классы
AnyRef → Any

def finalize(): Unit

Атрибуты
protected[java.lang]
Определяющие классы
AnyRef
Аннотации
@throws(classOf[java.lang.Throwable])

def formatted(fmtstr: String): String

Неявный
Этот член добавляется неявным преобразованием из Reifiers вStringFormat[Reifiers] при помощи метода StringFormat в scala.Predef.
Классы-определения
StringFormat
Аннотации
@inline()

final def getClass(): Class[_ <: AnyRef]

Классы-определения
AnyRef → Any
Аннотации
@native()

def hashCode(): Int

Классы-определения
AnyRef → Any
Аннотации
@native()

final def isInstanceOf[T0]: Boolean

Классы-определения
Any

final def ne(arg0: AnyRef): Boolean

Классы-определения
AnyRef

final def notify(): Unit

Классы-определения
AnyRef
Аннотации
@native()

final def notifyAll(): Unit

Классы-определения
AnyRef
Аннотации
@native()

final def synchronized[T0](arg0: => T0): T0

Классы-определения
AnyRef

def toString(): String

Классы-определения
AnyRef → Any

final def wait(): Unit

Классы-определения
AnyRef
Аннотации
@throws(classOf[java.lang.InterruptedException])

final def wait(arg0: Long, arg1: Int): Unit

Классы-определения
AnyRef
Аннотации
@throws(classOf[java.lang.InterruptedException])

final def wait(arg0: Long): Unit

Классы-определения
AnyRef
Аннотации
@throws(classOf[java.lang.InterruptedException]) @native()

© 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/Reifiers.html

Spec-Zone.ru

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