Spec-Zone.ru › Scala 2.13 Reflection

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

trait Internals extends AnyRef

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

Данный трейт собирает API, иногда необходимый для выполнения низкоуровневых операций над артефактами рефлексии. См. Internals#InternalApi для получения дополнительной информации о природе, полезности и гарантиях совместимости этих API.

Self Type
Universe
Source
Internals.scala
Линейные супертипы
AnyRef, Any
Известные подклассы
JavaUniverse, Universe, Universe

Члены типов

абстрактный тип FreeTermSymbol >: Null <: Universe.FreeTermSymbolApi с Universe.TermSymbol

тракт FreeTermSymbolApi extends Universe.TermSymbolApi

API свободных символов терминов. Основным источником информации о символах является страница Symbols.

$SYMACCESSORS

абстрактный тип FreeTypeSymbol >: Null <: Universe.FreeTypeSymbolApi с Universe.TypeSymbol

тракт FreeTypeSymbolApi extends Universe.TypeSymbolApi

API свободных символов типов. Основным источником информации о символах является страница Symbols.

$SYMACCESSORS

тракт Importer extends AnyRef

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

Артефакты рефлексии, такие как Symbols и Types, содержатся во вселенных 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]
  ...
}

абстрактный тип Internal <: Universe.InternalApi

См. также

InternalApi

тракт InternalApi extends AnyRef

API рефлексии демонстрирует противоречие, свойственное экспериментальным вещам: с одной стороны, мы хотим, чтобы он вырос в красивую и надёжную API, а с другой стороны, мы должны справляться с незрелостью лежащих в основе механизмов, предоставляя не очень привлекательные решения для включения важных вариантов использования.

В Scala 2.10, что было нашей первой попыткой API рефлексии, у нас не было систематического подхода к решению этого противоречия, иногда делая слишком много видимым из внутренних механизмов (например, Symbol.deSkolemize) и иногда слишком мало (например, до сих пор нет механизма изменения владельцев, выполнения преобразований типизации и т. д.). Это привело к определённой путанице с некоторыми внутренними API, живущими среди публичных, пугая новичков, и некоторыми внутренними API, доступными только через приведение типов, что требует глубокого знания компилятора и нарушает гарантии совместимости.

Это привело к созданию модуля API internal для API рефлексии, который предоставляет расширенные API, необходимые для макросов, которые продвигают границы современного состояния, чётко отделяя их от более или менее прямолинейного остатка и предоставляя гарантии совместимости наравне с остальной частью API рефлексии (полная совместимость в рамках мелких релизов, лучшие усилия по обратной совместимости в рамках основных релизов, ясный путь замены в случае редких несовместимых изменений в основных релизах).

Сам модуль internal (значение, реализующее InternalApi) не определён здесь, в scala.reflect.api.Universe, а предоставляется на основе реализации. Точка входа API во время выполнения (scala.reflect.runtime.universe) предоставляет universe.compat: InternalApi, в то время как точки входа API во время компиляции (экземпляры scala.reflect.macros.Context) предоставляют c.compat: ContextInternalApi, который расширяет InternalApi дополнительной функциональностью, специфичной для вселенной и контекста.

абстрактный тип ReferenceToBoxed >: Null <: Universe.ReferenceToBoxedApi с Universe.TermTree

Помечает лежащий в основе reference к id как упакованный.

Предварительное условие: id должен ссылаться на захваченную переменную. Reference, помеченная таким образом, будет ссылаться на упакованный объект, никакое разыменование с `.elem` не выполняется на нём. Этот узел дерева может быть выпущен макросами, такими как reify, которые вызывают referenceCapturedVariable. Он удаляется в LambdaLift, где происходит преобразование упаковывания.

тракт ReferenceToBoxedApi extends Universe.TermTreeApi

abstract class ReferenceToBoxedExtractor extends AnyRef

Класс-экстрактор для создания и сопоставления с образцом с синтаксисом ReferenceToBoxed(ident). Этот узел AST не имеет прямого соответствия коду Scala и генерируется макросами для прямого обращения к переменным захвата, минуя elem.

Например:

var x = ... fun { x }

Сгенерирует:

Ident(x)

Что преобразуется в:

Select(Ident(x), "elem")

Если вместо Ident использовался бы ReferenceToBoxed, преобразование не производилось бы.

trait ReificationSupportApi extends AnyRef

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

implicit abstract val FreeTermSymbolTag: ClassTag[Universe.FreeTermSymbol]

Тег, сохраняющий идентичность FreeTermSymbol при стирании. Может использоваться для сопоставления с образцом, проверки экземпляров, сериализации и т. п.

implicit abstract val FreeTypeSymbolTag: ClassTag[Universe.FreeTypeSymbol]

Тег, сохраняющий идентичность FreeTermSymbol при стирании. Может использоваться для сопоставления с образцом, проверки экземпляров, сериализации и т. п.

abstract val ReferenceToBoxed: Universe.ReferenceToBoxedExtractor

implicit abstract val ReferenceToBoxedTag: ClassTag[Universe.ReferenceToBoxed]

Тег, сохраняющий идентичность ReferenceToBoxed при стирании. Может использоваться для сопоставления с образцом, проверки экземпляров, сериализации и т. п.

abstract val internal: Universe.Internal

См. также

InternalApi

abstract val compat: Universe.Compat

Обеспечивает обогащения для обеспечения совместимости исходного кода между Scala 2.10 и Scala 2.11. Если в вашем рефлексивном программе для Scala 2.10 использовалось что-то, что сейчас стало внутренней API, одного импорта compat._ будет достаточно, чтобы исправить ситуацию.

Аннотации
@deprecated
Устарело

(с версии 2.13.0) Совместимость со Scala 2.10

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

final def !=(arg0: Any): Boolean

Определение классов
AnyRef → Any

final def ##(): Int

Определение классов
AnyRef → Any

def +(other: String): String

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

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

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

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

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

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

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

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

def ensuring(cond: Boolean): Internals

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

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

Spec-Zone.ru

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