Трейт scala.reflect.api.Internals.Importer
тракт Importer extends AnyRef
Абстрактные члены-значения
абстрактный 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
Этот тракт предоставляет поддержку импортеров, инструмент для миграции артефактов рефлексии между вселенными. Примечание: этот тракт обычно следует использовать только в редких случаях.
Артефакты рефлексии, такие как Символы и Типы, содержатся во вселенных 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] ... }