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