Spec-Zone.ru › Scala 2.13 Reflection

Трейт scala.reflect.api.Internals.Importer

тракт Importer extends AnyRef

Этот тракт предоставляет поддержку импортеров, инструмент для миграции артефактов рефлексии между вселенными. Примечание: этот тракт обычно следует использовать только в редких случаях.

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

Артефакты рефлексии тесно связаны с их Universe , что отражается в том, что типы артефактов из разных вселенных несовместимы. Однако, используя Importer , их можно импортировать из одной вселенной в другую. Например, для импорта foo.bar.Baz из исходной Universe во вселенную назначения Universe, импортер сначала проверит, существует ли вся цепочка владельцев в целевой Universe. Если да, то ничего больше не делается. В противном случае импортер воссоздаст всю цепочку владельцев и импортирует соответствующие сигнатуры типов в целевую Universe.

Поскольку импортеры сопоставляют таблицы Symbol исходной и целевой Universe , используя простые имена строк, программист несёт ответственность за обеспечение того, что импорты не искажают семантику, например, что foo.bar.Baz в исходной Universe означает то же самое, что и foo.bar.Baz в целевой Universe.

Пример

Вот как можно реализовать макрос, который выполняет вычисление аргумента во время компиляции, используя компилятор во время выполнения для компиляции и вычисления дерева, принадлежащего компилятору во время компиляции:

def staticEval[T](x: T) = macro staticEval[T]

def staticEval[T](c: scala.reflect.macros.blackbox.Context)(x: c.Expr[T]) = {
  // creates a runtime reflection universe to host runtime compilation
  import scala.reflect.runtime.{universe => ru}
  val mirror = ru.runtimeMirror(c.libraryClassLoader)
  import scala.tools.reflect.ToolBox
  val toolBox = mirror.mkToolBox()

  // runtime reflection universe and compile-time macro universe are different
  // therefore an importer is needed to bridge them
  // currently mkImporter requires a cast to correctly assign the path-dependent types
  val importer0 = ru.internal.mkImporter(c.universe)
  val importer = importer0.asInstanceOf[ru.internal.Importer { val from: c.universe.type }]

  // the created importer is used to turn a compiler tree into a runtime compiler tree
  // both compilers use the same classpath, so semantics remains intact
  val imported = importer.importTree(tree)

  // after the tree is imported, it can be evaluated as usual
  val tree = toolBox.untypecheck(imported.duplicate)
  val valueOfX = toolBox.eval(imported).asInstanceOf[T]
  ...
}
Источник
Internals.scala
Линейные супертипы
AnyRef, Any

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

абстрактный val from: Universe

Исходная вселенная артефактов рефлексии, которые будут обработаны. Вселенная назначения — это вселенная, которая создала этот импортер с помощью mkImporter.

абстрактный def importPosition(pos: Universe.Position): Universe.Position

абстрактный def importSymbol(sym: Universe.Symbol): Universe.Symbol

В текущей вселенной ищет или создаёт символ, соответствующий предоставленному символу в исходной вселенной. При необходимости импортирует цепочку владельцев, компаньоны, сигнатуры типов, аннотации и прикреплённые данные.

абстрактный def importTree(tree: Universe.Tree): Universe.Tree

В текущей вселенной создаёт дерево, соответствующее предоставленному дереву в исходной вселенной. При необходимости импортирует лежащие в основе символы, типы и прикреплённые данные.

абстрактный def importType(tpe: Universe.Type): Universe.Type

В текущей вселенной ищет или создаёт тип, соответствующий предоставленному типу в исходной вселенной. При необходимости импортирует лежащие в основе символы, аннотации, области видимости и деревья.

абстрактный val reverse: Universe.Importer { val from: Internals.this.type }

Члены-значения конкретного типа

final def !=(arg0: Any): Boolean

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

final def ##(): Int

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

def +(other: String): String

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

def ->[B](y: B): (Universe.Importer, B)

Неявный
Этот член добавлен неявным преобразованием из Universe.Importer вArrowAssoc[Universe.Importer] выполняется методом 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: (Universe.Importer) => Boolean, msg: => Any): Universe.Importer

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

def ensuring(cond: (Universe.Importer) => Boolean): Universe.Importer

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

def ensuring(cond: Boolean, msg: => Any): Universe.Importer

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

def ensuring(cond: Boolean): Universe.Importer

Неявный
Этот член добавлен неявным преобразованием из Universe.Importer вEnsuring[Universe.Importer] выполняется методом 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

Неявный
Этот член добавлен с помощью неявного преобразования из Universe.Importer вStringFormat[Universe.Importer] с помощью метода 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/api/Internals$Importer.html

Spec-Zone.ru

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