Spec-Zone.ru › Scala 2.13 Reflection

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

trait 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 дополнительными функциями, специфичными для вселенной и контекста.

Тип «Self»
Universe.InternalApi
Источник
Internals.scala
Линейные надтипы
AnyRef, Any
Известные подклассы
ContextInternalApi, MacroInternalApi

Члены типа

trait DecoratorApi extends AnyRef

См. также

Decorators

abstract type Decorators <: DecoratorApi

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

абстрактный def annotatedType(annotations: Список[Universe.Annotation], underlying: Universe.Type): Universe.AnnotatedType

абстрактный def asFreeTerm(symbol: Universe.Symbol): Universe.FreeTermSymbol

Это символ, преобразованный в символ свободного термина.

Исключения

ScalaReflectionException, если isFreeTerm ложно.

абстрактный def asFreeType(symbol: Universe.Symbol): Universe.FreeTypeSymbol

Этот символ преобразуется в символ свободного типа.

Исключения

ScalaReflectionException, если isFreeType ложно.

абстрактный def boundedWildcardType(bounds: Universe.TypeBounds): Universe.BoundedWildcardType

абстрактный def classDef(sym: Universe.Symbol, impl: Universe.Template): Universe.ClassDef

абстрактный def classInfoType(parents: Список[Universe.Type], decls: Universe.Scope, typeSymbol: Universe.Symbol): Universe.ClassInfoType

абстрактный def constantType(value: Universe.Constant): Universe.ConstantType

абстрактный def createImporter(from0: Universe): Universe.Importer { val from: from0.type }

Создает импортер, который перемещает рефлексивные артефакты между вселенными.

См. также

Importer

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

Если этот символ является сколемом, его соответствующий параметр типа, в противном случае сам символ.

Цитата Мартина Одерски: сколемы — это синтетические типы «констант», которые являются копиями существовавших или универсальных связанных переменных типа. Например, если вы находитесь внутри правой части метода:

def foo[T](x: T) = ... foo[List[T]]....

имя сколема T относится к неизвестному экземпляру типа T при вызове foo. Он должен отличаться от параметра типа, потому что при рекурсивном вызове, как в foo[List[T]] выше, параметр типа подставляется List[T], но сколем типа остается тем же.

Другой вид сколема — существоващий сколем. Предположим, что у вас есть функция

def bar(xs: List[T] forSome { type T }) = xs.head

каждый экземпляр xs справа будет иметь тип List[T'], где T' — свежая копия T.

абстрактный val decorators: Decorators

См. также

Decorators

абстрактный def defDef(sym: Universe.Symbol, rhs: (Список[Список[Universe.Symbol]]) => Universe.Tree): Universe.DefDef

абстрактный def defDef(sym: Universe.Symbol, rhs: Universe.Tree): Universe.DefDef

абстрактный def defDef(sym: Universe.Symbol, mods: Universe.Modifiers, rhs: Universe.Tree): Universe.DefDef

абстрактный метод defDef(симв: Universe.Symbol, vparamss: Список[Список[Universe.ValDef]], rhs: Universe.Tree): Universe.DefDef

абстрактный метод defDef(симв: Universe.Symbol, моды: Universe.Modifiers, vparamss: Список[Список[Universe.ValDef]], rhs: Universe.Tree): Universe.DefDef

абстрактный метод existentialAbstraction(tparams: Список[Universe.Symbol], tpe0: Universe.Type): Universe.Type

Создатель для экзистенциальных типов. Это генерирует:

tpe1 where { tparams }

где tpe1 является результатом экстраполяции tpe по отношению к tparams. Экстраполяция означает, что переменные типов в tparams, встречающиеся в ковариантных позициях, заменяются на верхние границы, (минус любые маркеры SingletonClass), переменные типов в tparams, встречающиеся в контравариантных позициях, заменяются на верхние границы, при условии, что полученный тип является допустимым с точки зрения стабильности и не содержит никаких переменных типов в tparams.

Абстракция отбрасывает все параметры типа, которые не ссылаются непосредственно или косвенно на тип tpe1. Если не осталось параметров типа, просто возвращается тип результата tpe.

абстрактный метод existentialType(quantified: Список[Universe.Symbol], underlying: Universe.Type): Universe.ExistentialType

абстрактный метод flags(символ: Universe.Symbol): Universe.FlagSet

абстрактный метод freeTerms(дерево: Universe.Tree): Список[Universe.FreeTermSymbol]

абстрактный метод freeTypes(дерево: Universe.Tree): Список[Universe.FreeTypeSymbol]

абстрактный метод fullyInitialize(объект: Universe.Scope): scope.type

абстрактный метод fullyInitialize(тип: Universe.Type): тип.type

абстрактный метод fullyInitialize(символ: Universe.Symbol): символ.type

абстрактный метод initialize(символ: Universe.Symbol): символ.type

Принудительно выполняет все ожидающие завершители, связанные с этим символом. После возврата этого вызова символ становится неизменяемым и потокобезопасным.

абстрактный метод intersectionType(tps: Список[Universe.Type], владелец: Universe.Symbol): Universe.Type

Создатель для типа пересечения, где пересечения одного типа заменяются самим типом, и повторяющиеся родительские классы объединяются.

!!! Повторяющиеся родительские классы не объединяются - это ошибка в комментарии или в коде?

абстрактный метод intersectionType(tps: Список[Universe.Type]): Universe.Type

абстрактный метод isErroneous(символ: Universe.Symbol): Boolean

абстрактный метод isFreeTerm(символ: Universe.Symbol): Boolean

абстрактный метод isFreeType(символ: Universe.Symbol): Boolean

абстрактный метод isSkolem(символ: Universe.Symbol): Boolean

абстрактный метод labelDef(символ: Universe.Symbol, параметры: List[Universe.Symbol], правая часть: Universe.Tree): Universe.LabelDef

абстрактный метод methodType(параметры: List[Universe.Symbol], тип_результата: Universe.Type): Universe.MethodType

абстрактный метод moduleDef(символ: Universe.Symbol, реализация: Universe.Template): Universe.ModuleDef

абстрактный метод newClassSymbol(владелец: Universe.Symbol, имя: Universe.TypeName, позиция: Universe.Position = NoPosition, флаги: Universe.FlagSet = NoFlags): Universe.ClassSymbol

абстрактный метод newFreeTerm(имя: String, значение: => Any, флаги: Universe.FlagSet = NoFlags, происхождение: String = null): Universe.FreeTermSymbol

абстрактный метод newFreeType(имя: String, флаги: Universe.FlagSet = NoFlags, происхождение: String = null): Universe.FreeTypeSymbol

абстрактный метод newMethodSymbol(владелец: Universe.Symbol, имя: Universe.TermName, позиция: Universe.Position = NoPosition, флаги: Universe.FlagSet = NoFlags): Universe.MethodSymbol

абстрактный метод newModuleAndClassSymbol(владелец: Universe.Symbol, имя: Universe.Name, позиция: Universe.Position = NoPosition, флаги: Universe.FlagSet = NoFlags): (Universe.ModuleSymbol, Universe.ClassSymbol)

абстрактный метод newScopeWith(элементы: Universe.Symbol*): Universe.Scope

абстрактный метод newTermSymbol(владелец: Universe.Symbol, имя: Universe.TermName, позиция: Universe.Position = NoPosition, флаги: Universe.FlagSet = NoFlags): Universe.TermSymbol

абстрактный def newTypeSymbol(owner: Universe.Symbol, name: Universe.TypeName, pos: Universe.Position = NoPosition, flags: Universe.FlagSet = NoFlags): Universe.TypeSymbol

абстрактный def nullaryMethodType(resultType: Universe.Type): Universe.NullaryMethodType

абстрактный def polyType(tparams: List[Universe.Symbol], tpe: Universe.Type): Universe.PolyType

Создатель для параметризации типов, удаляющий пустые списки параметров типа. Используйте этот фабричный метод, чтобы указать, что тип имеет вид * (это полиморфное значение) до тех пор, пока мы не начнём отслеживать явные виды, эквивалентные типу typeFun (за исключением того, что для последнего требуется nonEmpty tparams).

абстрактный def refinedType(parents: List[Universe.Type], owner: Universe.Symbol, decls: Universe.Scope, pos: Universe.Position): Universe.Type

абстрактный def refinedType(parents: List[Universe.Type], owner: Universe.Symbol, decls: Universe.Scope): Universe.Type

абстрактный def refinedType(parents: List[Universe.Type], owner: Universe.Symbol): Universe.Type

абстрактный def refinedType(parents: List[Universe.Type], decls: Universe.Scope, clazz: Universe.Symbol): Universe.RefinedType

абстрактный def refinedType(parents: List[Universe.Type], decls: Universe.Scope): Universe.RefinedType

абстрактный val reificationSupport: Universe.ReificationSupportApi

абстрактный def singleType(pre: Universe.Type, sym: Universe.Symbol): Universe.Type

абстрактный def substituteSymbols(tree: Universe.Tree, from: List[Universe.Symbol], to: List[Universe.Symbol]): Universe.Tree

абстрактный def substituteThis(tree: Universe.Tree, clazz: Universe.Symbol, to: => Universe.Tree): Universe.Tree

абстрактный def substituteTypes(tree: Universe.Tree, from: List[Universe.Symbol], to: List[Universe.Type]): Universe.Tree

абстрактный метод superType(thistpe: Universe.Type, supertpe: Universe.Type): Universe.Type

абстрактный метод thisType(sym: Universe.Symbol): Universe.Type

абстрактный метод typeBounds(lo: Universe.Type, hi: Universe.Type): Universe.TypeBounds

абстрактный метод typeDef(sym: Universe.Symbol): Universe.TypeDef

абстрактный метод typeDef(sym: Universe.Symbol, rhs: Universe.Tree): Universe.TypeDef

абстрактный метод typeRef(pre: Universe.Type, sym: Universe.Symbol, args: List[Universe.Type]): Universe.Type

абстрактный метод valDef(sym: Universe.Symbol): Universe.ValDef

абстрактный метод valDef(sym: Universe.Symbol, rhs: Universe.Tree): Universe.ValDef

Члены-значения

final def !=(arg0: Any): Boolean

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

final def ##(): Int

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

def +(other: String): String

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

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

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

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

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

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

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

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

def ensuring(cond: Boolean): Universe.InternalApi

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

def manifestToTypeTag[T](mirror: Any, manifest: Manifest[T]): Universe.TypeTag[T]

Преобразование scala.reflect.Manifest в scala.reflect.api.TypeTags#TypeTag.

Компилятор обычно автоматически генерирует эти преобразования, когда массив типов T находится в области видимости, и запрашивается неявный тип TypeTag[T], но этот метод также можно вызвать вручную. Например:

manifestToTypeTag(scala.reflect.runtime.currentMirror, implicitly[Manifest[String]])

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

def typeTagToManifest[T](mirror: Any, tag: Universe.TypeTag[T])(implicit arg0: ClassTag[T]): Manifest[T]

Преобразование scala.reflect.api.TypeTags#TypeTag в scala.reflect.Manifest.

Компилятор обычно автоматически генерирует эти преобразования, когда тег типа T находится в области видимости, и запрашивается неявный тип Manifest[T], но этот метод также можно вызвать вручную. Например:

typeTagToManifest(scala.reflect.runtime.currentMirror, implicitly[TypeTag[String]])

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$InternalApi.html

Spec-Zone.ru

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