Трейт scala.reflect.macros.Reifiers
трейт Reifiers extends AnyRef
Абстрактные члены-значения
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
def ->[B](y: B): (Reifiers, B)
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
def ensuring(cond: (Reifiers) => Boolean): Reifiers
def ensuring(cond: Boolean, msg: => Any): Reifiers
def ensuring(cond: Boolean): Reifiers
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
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
ЭКСПЕРИМЕНТАЛЬНЫЙ
Часть контекста макросов Scala, предоставляющая функции для сохранения артефактов отражения для времени выполнения.