Spec-Zone.ru › Scala 2.13 Reflection

Трейт scala.reflect.macros.whitebox.Context

трейт Context extends blackbox.Context

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

Контекст для макросов Scala с полным доступом.

См. страницу обзора для описания принципов работы макросов. Данный раздел содержит информацию об API, доступном разработчикам макросов.

Контекст макроса оборачивает всеобъемлющую вселенную компилятора, представленную в universe и имеющую тип scala.reflect.macros.Universe. Этот тип является усовершенствованием общего API рефлексии, представленного в scala.reflect.api.Universe. Расширенная вселенная предоставляет возможность изменения артефактов рефлексии (например, макросы могут изменять типы деревьев компилятора, добавлять аннотации к символам, представляющим определения и т.д.) и раскрывает некоторые внутренние возможности компилятора, такие как Symbol.deSkolemize или Tree.attachments.

Еще одной фундаментальной частью контекста макроса является macroApplication, предоставляющая доступ к дереву, над которым выполняется расширение макроса. Части этого дерева можно найти в аргументах соответствующих реализаций макроса и в prefix, но macroApplication дает полную картину.

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

Если макрос def ссылается на реализацию макроса impl, которая использует whitebox.Context, то этот макрос def становится макросом с полным доступом, получая возможность уточнить тип его расширения за пределами его официального возвращаемого типа, что позволяет использовать ряд важных случаев. Макросы с ограниченным доступом, т.е. те, которые определены с помощью blackbox.Context, этого сделать не могут, поэтому они менее мощные. Однако макросы с ограниченным доступом также получат лучшую поддержку, чем макросы с полным доступом, поэтому выбирайте с умом. См. Руководство по макросам для получения дополнительной информации.

Исходный код
Context.scala
См. также

scala.reflect.macros.blackbox.Context

Линейные супертипы
blackbox.Context, Internals, ExprUtils, Evals, Parsers, Typers, Infrastructure, FrontEnds, Reifiers, Names, Enclosures, Aliases, AnyRef, Any

Типы элементов

trait ContextInternalApi extends MacroInternalApi

Определяющие классы
Internals
См. также

scala.reflect.api.Internals

type Expr[+T] = Universe.Expr[T]

Expr оборачивает абстрактное синтаксическое дерево и помечает его своим типом.

Определяющие классы
Aliases

case class ImplicitCandidate(pre: Context.Type, sym: Context.Symbol, pt: Context.Type, tree: Context.Tree) extends Product with Serializable

Информация об одном из кандидатов на неявное преобразование, которые рассматриваются в данный момент. Кандидаты используются во множественном числе, поскольку неявные параметры могут сами иметь неявные параметры, следовательно, поиск неявных параметров может рекурсивно запускать другие поиски неявных параметров.

pre и sym предоставляют информацию о самом кандидате. pt и tree хранят параметры поиска неявных параметров, в котором участвует кандидат.

type Modifiers = Universe.Modifiers

Тип модификаторов дерева.

Определяющие классы
Aliases

type Name = Universe.Name

Абстрактный тип имен.

Определяющие классы
Aliases

type Position = Universe.Position

Определяет специфическое для вселенной понятие позиций.

Определяющие классы
Aliases

abstract type PrefixType

Тип префиксного дерева, из которого выбран макрос. См. запись в документации для prefix для примера.

Определяющие классы
Context

type Scope = Universe.Scope

Базовый тип всех областей видимости.

Определяющие классы
Aliases

type Symbol = Universe.Symbol

Тип символов, представляющих объявления.

Определяющие классы
Aliases

type TermName = Universe.TermName

Абстрактный тип имен, представляющих термы.

Определяющие классы
Aliases

type Tree = Universe.Tree

Тип абстрактных синтаксических деревьев Scala.

Определяющие классы
Aliases

type Type = Universe.Type

Тип типов Scala, а также сигнатур типов Scala. (Внутренне между ними не делается различий).

Определяющие классы
Aliases

type TypeName = Universe.TypeName

Абстрактный тип имен, представляющих типы.

Определяющие классы
Aliases

type TypeTag[T] = Universe.TypeTag[T]

Тип тегов типов.

Определяющие классы
Aliases

type TypecheckException = macros.TypecheckException

Определяющие классы
Typers
См. также

scala.reflect.macros.TypecheckException

abstract type TypecheckMode

Представляет режим работы типового проверятеля, который лежит в основе вызовов c.typecheck. Необходим, так как форма проверенного дерева не является достаточной, чтобы угадать, как его следует проверять. Может быть TERMmode (проверка как терм), TYPEmode (проверка как тип) или PATTERNmode (проверка как шаблон).

Definition Classes
Typers

type WeakTypeTag[T] = Universe.WeakTypeTag[T]

Тип слабых тегов типов.

Definition Classes
Aliases

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

абстрактный def Expr[T](tree: Tree)(неявный arg0: WeakTypeTag[T]): Expr[T]

Укороченная запись для создания выражения.

В отличие от стандартного фабричного метода выражений, который требует scala.reflect.api.TreeCreator, этот принимает обычное дерево, но полученные выражения не могут быть перенесены в другие вселенные/зеркала (функциональность, обычно не требуемая для макросов, поскольку существует только одна вселенная во время компиляции и только одно зеркало во время компиляции).

Определяющие классы
Aliases

абстрактный val PATTERNmode: TypecheckMode

Указывает, что аргумент для c.typecheck должен быть проверен как шаблон.

Определяющие классы
Typers

абстрактный val TERMmode: TypecheckMode

Указывает, что аргумент для c.typecheck должен быть проверен как терм. Это режим проверки по умолчанию в Scala 2.11 и единственный поддерживаемый режим в Scala 2.10.

Определяющие классы
Typers

абстрактный val TYPEmode: TypecheckMode

Указывает, что аргумент для c.typecheck должен быть проверен как тип.

Определяющие классы
Typers

абстрактный def TypeTag[T](tpe: Type): TypeTag[T]

Укороченная запись для создания тега типа.

В отличие от стандартного фабричного метода тегов типа, который требует scala.reflect.api.TypeCreator, этот принимает обычный тип, но полученные теги типа не могут быть перенесены в другие вселенные/зеркала (функциональность, обычно не требуемая для макросов, поскольку существует только одна вселенная во время компиляции и только одно зеркало во время компиляции).

Определяющие классы
Aliases

абстрактный def WeakTypeTag[T](tpe: Type): WeakTypeTag[T]

Укороченная запись для создания слабого тега типа.

В отличие от стандартного фабричного метода тегов типа, который требует scala.reflect.api.TypeCreator, этот принимает обычный тип, но полученные теги типа не могут быть перенесены в другие вселенные/зеркала (функциональность, обычно не требуемая для макросов, поскольку существует только одна вселенная во время компиляции и только одно зеркало во время компиляции).

Определяющие классы
Aliases

абстрактный def abort(pos: Position, msg: String): Nothing

Прерывает текущее расширение макроса, оставляя заметку о произошедшем. Используйте enclosingPosition, если вы не уверены, какую позицию передать в pos.

Определяющие классы
FrontEnds

абстрактный def classPath: List[URL]

Предоставляет текущую классовую дорожку.

Определяющие классы
Infrastructure

абстрактный def compilerSettings: List[String]

Предоставляет текущие настройки компилятора в виде списка параметров. Используйте scalac -help, scalac -X и scalac -Y, чтобы узнать о поддерживаемых параметрах.

Определяющие классы
Infrastructure

абстрактный def echo(pos: Position, msg: String): Unit

Для отправки сообщения, которое не должно быть помечено как предупреждение/ошибка, но также не должно требовать -verbose, чтобы быть видимым. Используйте enclosingPosition, если вы не уверены, какую позицию передать в pos.

Определяющие классы
FrontEnds

абстрактный def enclosingImplicits: List[ImplicitCandidate]

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

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

В отличие от openImplicits, это значение, что означает, что оно инициализируется при создании контекста и всегда остается неизменным независимо от того, что происходит во время макрорасшивки.

abstract def enclosingMacros: List[Context]

Контексты, представляющие макросы в процессе выполнения, включая текущий. Очень похоже на стек вызовов, но только для макросов. Может быть полезно для взаимодействия с другими макросами и для наложения компилятору дружественных ограничений на макрорасшивку.

Также бесценно для выдачи осмысленных сообщений об ошибках для макросов, которые вызываются другими макросами на синтетических (т.е. не имеющих позиции) деревьях. В таком случае просмотрите стек enclosingMacros, и он, скорее всего, будет содержать по крайней мере один макрос с позиционно-полным применением макроса. См. enclosingPosition для реализации по умолчанию этой логики.

В отличие от openMacros, это значение, что означает, что оно инициализируется при создании контекста и всегда остается неизменным независимо от того, что происходит во время макрорасшивки.

Definition Classes
Context → Enclosures

abstract def enclosingPosition: Position

Попытка угадать позицию для окружающего применения. Но это просто, не так ли? Просто разыменовать pos от macroApplication? Не совсем. Если мы находимся в синтетической макрорасшивки (нет позиций), мы должны сделать все возможное, чтобы вывести положение того, что спровоцировало это расширение. Удивительно, но часто мы можем сделать это, просматривая стек enclosingMacros.

Definition Classes
Enclosures

abstract def error(pos: Position, msg: String): Unit

Выводит ошибку компиляции. Используйте enclosingPosition, если вы сомневаетесь, какую позицию передать в pos.

Definition Classes
FrontEnds

abstract def eval[T](expr: Expr[T]): T

Принимает типизированную оболочку для дерева типа T и вычисляет его в значение типа T.

Может использоваться для выполнения вычислений во время компиляции над аргументами макроса в той степени, в которой это разрешено формой аргументов.

Известные проблемы: из-за https://github.com/scala/bug/issues/5748 деревья, которые сначала вычисляются, должны пройти untypecheck. Перезагрузка символов и типов изменяет дерево на месте, поэтому общепринятым подходом является duplicate дерева сначала.

scala> def impl(c: Context)(x: c.Expr[String]) = {
     | val x1 = c.Expr[String](c.untypecheck(x.tree.duplicate))
     | println(s"compile-time value is: ${c.eval(x1)}")
     | x
     | }
impl: (c: Context)(x: c.Expr[String])c.Expr[String]

scala> def test(x: String) = macro impl
test: (x: String)String

scala> test("x")
compile-time value is: x
res0: String = x

scala> test("x" + "y")
compile-time value is: xy
res1: String = xy

scala> val x = "x"
x: String = x

scala> test(x + "y")
compile-time value is: xy
res2: String = xy

scala> { val x = "x"; test(x + "y") }
error: exception during macro expansion:
scala.tools.reflect.ToolBoxError: reflective compilation failed

Обратите внимание, что в последнем случае вычисление не удалось, потому что аргумент макроса ссылается на значение времени выполнения x, которое неизвестно во время компиляции.

Definition Classes
Evals

abstract def freshName[NameType <: Name](name: NameType): NameType

Создаёт имя, которое более или менее уникально, имеющее заданное имя в качестве префикса и имеющее тот же тип (имя термина или имя типа) что и заданное имя. Обратитесь к scala.reflect.macros.Names для получения дополнительной информации об уникальности таких имён.

Definition Classes
Names

abstract def freshName(name: String): String

Создаёт строку, представляющую более или менее уникальное имя, имеющее заданный префикс. Обратитесь к scala.reflect.macros.Names для получения дополнительной информации об уникальности таких имён.

Definition Classes
Names

abstract def freshName(): String

Создаёт строку, представляющую более или менее уникальное имя. Обратитесь к scala.reflect.macros.Names для получения дополнительной информации об уникальности таких имён.

Definition Classes
Names

abstract def hasErrors: Boolean

Есть ли ошибки в сеансе компиляции?

Definition Classes
FrontEnds

abstract def hasWarnings: Boolean

Есть ли предупреждения в сеансе компиляции?

Definition Classes
FrontEnds

abstract def inferImplicitValue(pt: Type, silent: Boolean = true, withMacrosDisabled: Boolean = false, pos: Position = enclosingPosition): Tree

Выводит неявное значение ожидаемого типа pt в контексте вызова макроса. Необязательный параметр pos предоставляет позицию, которая будет связана с неявным поиском.

Если silent ложно, TypecheckException будет брошено в случае ошибки вывода. Если silent истинно, проверка типов выполняется молча и возвращает EmptyTree в случае ошибки. Такие ошибки не исчезают и могут быть проверены путем включения -Xlog-implicits. В отличие от typecheck, silent по умолчанию истинно.

Definition Classes
Typers
Exceptions thrown

abstract def inferImplicitView(tree: Tree, from: Type, to: Type, silent: Boolean = true, withMacrosDisabled: Boolean = false, pos: Position = enclosingPosition): Tree

Выводит неявный вид из предоставленного дерева tree типа from к типу to в контексте вызова макроса. Необязательный параметр pos предоставляет позицию, которая будет связана с неявным поиском.

Если silent ложно, TypecheckException будет брошено в случае ошибки вывода. Если silent истинно, проверка типов выполняется молча и возвращает EmptyTree в случае ошибки. Такие ошибки не исчезают и могут быть проверены путем включения -Xlog-implicits. В отличие от typecheck, silent по умолчанию истинно.

Definition Classes
Typers
Exceptions thrown

abstract def info(pos: Position, msg: String, force: Boolean): Unit

Выводит информационное сообщение, подавляемое, если -verbose или force=true. Используйте enclosingPosition, если вы не уверены, какую позицию передать в pos.

Definition Classes
FrontEnds

abstract val internal: ContextInternalApi

Definition Classes
Internals
See also

scala.reflect.api.Internals

abstract def macroApplication: Tree

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

Definition Classes
Enclosures

abstract val mirror: Universe.Mirror

Зеркало времени компиляции.

Definition Classes
Context

abstract def openImplicits: List[ImplicitCandidate]

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

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

В отличие от enclosingImplicits, это def, что означает, что он пересчитывается при каждом вызове, поэтому он может меняться в зависимости от того, что происходит во время макрорасширения.

abstract def openMacros: List[Context]

Контексты, которые представляют макросы в процессе выполнения, включая текущий. Очень похоже на стек вызовов, но только для макросов. Может быть полезно для взаимодействия с другими макросами и для наложения дружественных компилятору ограничений на расширение макросов.

Также бесценно для выдачи осмысленных сообщений об ошибках для макросов, которые вызываются другими макросами по синтетическим (т. е. без позиционных) деревьям. В этом случае просматривайте стек openMacros, и он, скорее всего, будет содержать по крайней мере один макрос с макроприменением с позицией. См. enclosingPosition для реализации по умолчанию этой логики.

В отличие от enclosingMacros, это def, что означает, что он пересчитывается при каждом вызове, поэтому он может меняться в зависимости от того, что происходит во время макрорасширения.

Definition Classes
Context → Typers

abstract def parse(code: String): Tree

Парсит строку с выражением Scala в абстрактное синтаксическое дерево. Работает только для выражений, т. е. парсинг объявления пакета завершится ошибкой.

Definition Classes
Parsers
Exceptions thrown

abstract val prefix: Expr[PrefixType]

Префиксное дерево, из которого выбирается макрос.

Например, для макроса filter, определённого как метод экземпляра коллекции Coll, prefix представляет эквивалент this для обычных методов экземпляров:

scala> class Coll[T] {
     | def filter(p: T => Boolean): Coll[T] = macro M.filter[T]
     | }; object M {
     | def filter[T](c: Context { type PrefixType = Coll[T] })
     |              (p: c.Expr[T => Boolean]): c.Expr[Coll[T]] =
     |   {
     |     println(c.prefix.tree)
     |     c.prefix
     |   }
     | }
defined class Coll
defined module Macros

scala> new Coll[Int]().filter(_ % 2 == 0)
new Coll[Int]()
res0: Coll[Int] = ...

scala> val x = new Coll[String]()
x: Coll[String] = ...

scala> x.filter(_ != "")
$line11.$read.$iw.$iw.$iw.$iw.$iw.$iw.$iw.$iw.$iw.$iw.$iw.$iw.x
res1 @ 35563b4b: x.type = ...

Обратите внимание, как значение prefix меняется в зависимости от квалификатора вызова макроса (т.е. выражения, которое находится слева от точки).

Ещё одним примечательным аспектом фрагмента кода выше является тип Context { type PrefixType = Coll[T] }, используемый для акцентирования того, что реализация макроса работает с префиксами типа Coll[T].

Классы определения
Context

абстрактный def reifyEnclosingRuntimeClass: Tree

Для заданного типа сгенерировать дерево, которое при компиляции и выполнении производит класс времени выполнения внешнего класса или модуля. Возвращает EmptyTree , если внешний класс или модуль не существуют.

Классы определения
Reifiers

абстрактный def reifyRuntimeClass(tpe: Type, concrete: Boolean = true): Tree

Для заданного типа сгенерировать дерево, которое при компиляции и выполнении производит класс времени выполнения исходного типа. Если concrete равно true, то эта функция будет игнорировать типы, которые ссылаются на абстрактные типы (например, как ClassTag).

Классы определения
Reifiers

абстрактный def reifyTree(universe: Tree, mirror: Tree, tree: Tree): Tree

Для данного дерева создать дерево, которое при компиляции и выполнении воспроизводит исходное дерево. Для получения дополнительной информации и примеров обратитесь к документации для Universe.reify.

Созданное дерево будет связано с указанным universe и mirror. Возможные значения для universe включают universe.internal.gen.mkRuntimeUniverseRef . Возможные значения для mirror включают EmptyTree (в этом случае реифёр автоматически выберет подходящее зеркало).

Эта функция тесно связана с Universe.reify, макросом, который делает реификацию произвольных выражений в деревья времени выполнения. Они выполняют очень похожие действия (Universe.reify вызывает Context.reifyTree для своей реализации), но работают на разных метауровнях (см. ниже).

Рассмотрим различия между Context.reifyTree и Universe.reify на примере использования их внутри макроса fooMacro.

* Поскольку сам reify является макросом, он будет выполняться во время компиляции fooMacro (метауровень -1) и создаст дерево, которое при оценке во время расширения макроса fooMacro (метауровень 0) восстановит входное дерево.

Это обеспечивает возможность, аналогичную квази-цитированию. Написание "reify{ expr }" сгенерирует AST, представляющий expr. После этого AST (или его части) можно использовать для построения возвращаемого значения fooMacro.

* reifyTree оценивается во время расширения макроса (метауровень 0) и создаст дерево, которое при оценке во время выполнения программы (метауровень 1) восстановит входное дерево.

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

Также обратите внимание на разницу между вселенными деревьев времени выполнения, созданных двумя функциями reify:

* Результат компиляции и выполнения результата reify будет связан с Вселенной, которая вызвала reify. Это возможно, потому что это макрос, поэтому он может генерировать любой код, который пожелает.

* Результат компиляции и выполнения результата reifyTree будет prefix , который необходимо явно передать. Это происходит потому, что Вселенная оцениваемого результата находится на другом метауровне, чем Контекст, который вызвал reify.

Типичное использование этой функции - сохранение некоторых деревьев, полученных/созданных макросом, в форме, которую можно проанализировать (с помощью сопоставления с образцом) или скомпилировать/выполнить (с помощью рефлективного инструментария Toolbox) во время выполнения.

Классы определения
Reifiers

абстрактный def reifyType(universe: Tree, mirror: Tree, tpe: Type, concrete: Boolean = false): Tree

Для заданного типа сгенерировать дерево, которое при компиляции и выполнении создаст исходный тип. Созданное дерево будет связано с указанными universe и mirror. Для получения дополнительной информации и примеров обратитесь к документации для Context.reifyTree и Universe.reify.

Классы определения
Reifiers

абстрактный def settings: List[String]

Возвращает список строк, содержащих макро-специфические параметры. Эти параметры передаются компилятору через командную строку в формате "-Xmacro-settings:setting1,setting2...,settingN".

Классы определения
Infrastructure

абстрактный def typecheck(tree: Tree, mode: TypecheckMode = TERMmode, pt: Type = universe.WildcardType, silent: Boolean = false, withImplicitViewsDisabled: Boolean = false, withMacrosDisabled: Boolean = false): Tree

Проверяет предоставленное дерево на соответствие ожидаемому типу pt в контексте вызова макроса в режиме проверки типа, указанном в mode с TERMmode по умолчанию. Это заполняет символы и типы дерева и, возможно, преобразует его для отражения определенных десахарификаций.

Если silent ложно, TypecheckException будет брошено в случае ошибки проверки типа. Если silent истинно, проверка типа выполняется молча и вернет EmptyTree в случае ошибки. Такие ошибки не исчезают и могут быть проверены путем включения -Ymacro-debug-verbose. В отличие от inferImplicitValue и inferImplicitView, silent по умолчанию ложно.

Проверку типа можно настроить с помощью следующих необязательных параметров: withImplicitViewsDisabled рекурсивно запрещает неявные представления (хотя неявные значения все равно будут просматриваться и заполняться), значение по умолчанию — ложь withMacrosDisabled рекурсивно запрещает расширение макросов и неявные параметры на основе макросов, значение по умолчанию — ложь

Definition Classes
Typers
Exceptions thrown

abstract val universe: Universe

Временная вселенная.

Definition Classes
Context

abstract def unreifyTree(tree: Tree): Tree

Отменяет реификацию дерева.

Эта реверсия не просто восстанавливает исходное дерево (при этом теряется контекст реификации), а выполняет более сложную операцию, которая соответствует следующим законам:

1) unreifyTree(reifyTree(tree)) != tree // деревыо после unreify - дерево + сохраненный контекст // в текущей реализации результат unreify является непрозрачным // то есть нет возможности проверить лежащее в основе дерево/контекст

2) reifyTree(unreifyTree(reifyTree(tree))) == reifyTree(tree) // результат реификации дерева в исходном контексте равен // результату реификации дерева вместе с сохраненным контекстом

3) compileAndEval(unreifyTree(reifyTree(tree))) ~ compileAndEval(tree) // во время выполнения исходные и деревы после unreify поведению эквивалентны

Definition Classes
Reifiers

abstract def untypecheck(tree: Tree): Tree

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

Обычно, если какой-либо API компилятора принимает дерево, то подойдут как нетипизированные, так и типизированные деревья. Однако в некоторых случаях подходят только нетипизированные или только типизированные деревья. Например, eval принимает только нетипизированные деревья, а вставлять типизированные деревья можно только в типизированные деревья. Поэтому в текущем API рефлексии необходимы функции для перехода между нетипизированными и типизированными деревьями. Для этого у нас есть typecheck и untypecheck.

Обратите внимание, что untypecheck в настоящее время страдает от https://github.com/scala/bug/issues/5464, что иногда приводит к повреждению деревьев, из-за чего они становятся бессмысленными. К сожалению, для этого нет решения. Мы планируем исправить эту проблему в ближайшее время, но пока имейте это в виду.

Definition Classes
Typers
See also

http://stackoverflow.com/questions/20936509/scala-macros-what-is-the-difference-between-typed-aka-typechecked-an-untyped

abstract def warning(pos: Position, msg: String): Unit

Выводит предупреждение. Используйте enclosingPosition если вы сомневаетесь в позиции, которую нужно передать в pos.

Definition Classes
FrontEnds

abstract def enclosingClass: Tree

Дерево, соответствующее окружающему классу, или EmptyTree, если это неприменимо.

Definition Classes
Enclosures
Annotations
@deprecated
Deprecated

(Since version 2.11.0) c.enclosingTree-style APIs are now deprecated; consult the scaladoc for more information

See also

scala.reflect.macros.Enclosures

abstract def enclosingDef: Universe.DefDef

Дерево, соответствующее окружающему дереву DefDef. Бросает EnclosureException если такого окружающего дерева нет.

Definition Classes
Enclosures
Annotations
@deprecated
Deprecated

(Since version 2.11.0) c.enclosingTree-style APIs are now deprecated; consult the scaladoc for more information

See also

scala.reflect.macros.Enclosures

abstract def enclosingImpl: Universe.ImplDef

Дерево, соответствующее окружающему дереву ImplDef (т. е. либо ClassDef, либо ModuleDef). Бросает EnclosureException если такого окружающего дерева нет.

Definition Classes
Enclosures
Annotations
@deprecated
Deprecated

(Since version 2.11.0) c.enclosingTree-style APIs are now deprecated; consult the scaladoc for more information

See also

scala.reflect.macros.Enclosures

abstract def enclosingMethod: Tree

Узел дерева, соответствующий окружающему методу, или EmptyTree, если это неприменимо.

Definition Classes
Enclosures
Annotations
@deprecated
Deprecated

(Since version 2.11.0) c.enclosingTree-style APIs are now deprecated; consult the scaladoc for more information

See also

scala.reflect.macros.Enclosures

abstract def enclosingPackage: Universe.PackageDef

Узел дерева, соответствующий окружающему узлу PackageDef. Выбрасывает EnclosureException если нет такого окружающего узла.

Definition Classes
Enclosures
Annotations
@deprecated
Deprecated

(Since version 2.11.0) c.enclosingTree-style APIs are now deprecated; consult the scaladoc for more information

See also

scala.reflect.macros.Enclosures

abstract def enclosingRun: Run

Сеанс компиляции, содержащий это макроприложение.

Definition Classes
Enclosures
Annotations
@deprecated
Deprecated

(Since version 2.11.0) c.enclosingTree-style APIs are now deprecated; consult the scaladoc for more information

See also

scala.reflect.macros.Enclosures

abstract def enclosingTemplate: Universe.Template

Узел дерева, соответствующий окружающему узлу Template. Выбрасывает EnclosureException если нет такого окружающего узла.

Definition Classes
Enclosures
Annotations
@deprecated
Deprecated

(Since version 2.11.0) c.enclosingTree-style APIs are now deprecated; consult the scaladoc for more information

See also

scala.reflect.macros.Enclosures

abstract def enclosingUnit: CompilationUnit

Единица компиляции, содержащая это макроприложение.

Definition Classes
Enclosures
Annotations
@deprecated
Deprecated

(Since version 2.11.0) c.enclosingTree-style APIs are now deprecated; consult the scaladoc for more information

See also

scala.reflect.macros.Enclosures

abstract def fresh[NameType <: Name](name: NameType): NameType

Создает более или менее уникальное имя, имеющее заданное имя в качестве префикса и имеющее тот же тип (имя терма или имя типа), что и заданное имя. Обратитесь к scala.reflect.macros.Names для получения дополнительной информации об уникальности таких имен.

Definition Classes
Names
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use freshName instead

abstract def fresh(name: String): String

Создает строку, представляющую более или менее уникальное имя, имеющее заданный префикс. Обратитесь к scala.reflect.macros.Names для получения дополнительной информации об уникальности таких имен.

Definition Classes
Names
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use freshName instead

abstract def fresh(): String

Создает строку, представляющую более или менее уникальное имя. Обратитесь к scala.reflect.macros.Names для получения дополнительной информации об уникальности таких имен.

Definition Classes
Names
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use freshName instead

abstract def literal(x: Char): Expr[Char]

Сокращение для Literal(Constant(x: Char)) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use quasiquotes instead

abstract def literal(x: String): Expr[String]

Сокращенная запись для Literal(Constant(x: String)) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use quasiquotes instead

abstract def literal(x: Double): Expr[Double]

Сокращенная запись для Literal(Constant(x: Double)) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use quasiquotes instead

abstract def literal(x: Float): Expr[Float]

Сокращенная запись для Literal(Constant(x: Float)) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use quasiquotes instead

abstract def literal(x: Long): Expr[Long]

Сокращенная запись для Literal(Constant(x: Long)) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use quasiquotes instead

abstract def literal(x: Int): Expr[Int]

Сокращенная запись для Literal(Constant(x: Int)) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use quasiquotes instead

abstract def literal(x: Short): Expr[Short]

Сокращенная запись для Literal(Constant(x: Short)) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use quasiquotes instead

abstract def literal(x: Byte): Expr[Byte]

Сокращенная запись для Literal(Constant(x: Byte)) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use quasiquotes instead

abstract def literal(x: Boolean): Expr[Boolean]

Сокращенная запись для Literal(Constant(x: Boolean)) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use quasiquotes instead

abstract def literalFalse: Expr[Boolean]

Сокращенная запись для Literal(Constant(false)) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use quasiquotes instead

abstract def literalNull: Expr[Null]

Сокращенная запись для Literal(Constant(null)) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) use quasiquotes instead

abstract def literalTrue: Expr[Boolean]

Сокращённая форма для Literal(Constant(true)) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) используйте квазицитаты вместо этого

abstract def literalUnit: Expr[Unit]

Сокращённая форма для Literal(Constant(())) в базовом universe.

Definition Classes
ExprUtils
Annotations
@deprecated
Deprecated

(Since version 2.11.0) используйте квазицитаты вместо этого

abstract def resetLocalAttrs(tree: Tree): Tree

Рекурсивно сбрасывает локально определённые символы и типы в заданном дереве. ВНИМАНИЕ: Не используйте этот API, воспользуйтесь untypecheck вместо этого.

Definition Classes
Typers
Annotations
@deprecated
Deprecated

(Since version 2.11.0) используйте c.untypecheck вместо этого

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

final def !=(arg0: Any): Boolean

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

final def ##(): Int

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

def +(other: String): String

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

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

Неявный
Этот член добавлен неявным преобразованием из Context вArrowAssoc[Context] выполненным методом ArrowAssoc в scala.Predef.
Определяющие классы
ArrowAssoc
Аннотации
@inline()

final def ==(arg0: Any): Boolean

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

val Expr: Universe.Expr.type

Конструктор/экстрактор для Expr.

Определяющие классы
Aliases

val TypeTag: Universe.TypeTag.type

Конструктор/экстрактор для TypeTag.

Определяющие классы
Aliases

val TypecheckException: macros.TypecheckException.type

Определяющие классы
Typers
См. также

scala.reflect.macros.TypecheckException

val WeakTypeTag: Universe.WeakTypeTag.type

Конструктор/экстрактор для WeakTypeTag.

Определяющие классы
Aliases

final def asInstanceOf[T0]: T0

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

def clone(): AnyRef

Атрибуты
protected[java.lang]
Определяющие классы
AnyRef
Аннотации
@throws(classOf[java.lang.CloneNotSupportedException]) @native()

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

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

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

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

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

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

def ensuring(cond: Boolean): Context

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

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

def symbolOf[T](implicit arg0: WeakTypeTag[T]): Universe.TypeSymbol

Символ типа x , полученный из тега типа.

Классы определений
Aliases

final def synchronized[T0](arg0: => T0): T0

Классы определений
AnyRef

def toString(): String

Классы определений
AnyRef → Any

def typeOf[T](implicit ttag: TypeTag[T]): Type

Сокращение для implicitly[TypeTag[T]].tpe

Классы определений
Aliases

def typeTag[T](implicit ttag: TypeTag[T]): TypeTag[T]

Сокращение для implicitly[TypeTag[T]]

Классы определений
Aliases

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()

def weakTypeOf[T](implicit attag: WeakTypeTag[T]): Type

Сокращение для implicitly[WeakTypeTag[T]].tpe

Определяющие классы
Aliases

def weakTypeTag[T](implicit attag: WeakTypeTag[T]): WeakTypeTag[T]

Сокращение для implicitly[WeakTypeTag[T]]

Определяющие классы
Aliases

© 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/macros/whitebox/Context.html

Spec-Zone.ru

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