Трейт scala.reflect.macros.whitebox.Context
трейт Context extends blackbox.Context
Типы элементов
trait ContextInternalApi extends MacroInternalApi
- Определяющие классы
- 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
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, что означает, что он пересчитывается при каждом вызове, поэтому он может меняться в зависимости от того, что происходит во время макрорасширения.
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, что иногда приводит к повреждению деревьев, из-за чего они становятся бессмысленными. К сожалению, для этого нет решения. Мы планируем исправить эту проблему в ближайшее время, но пока имейте это в виду.
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
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
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
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
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
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
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
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
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
def ->[B](y: B): (Context, B)
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
def ensuring(cond: (Context) => Boolean): Context
def ensuring(cond: Boolean, msg: => Any): Context
def ensuring(cond: Boolean): Context
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
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
ЭКСПЕРИМЕНТАЛЬНО
Контекст для макросов 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, этого сделать не могут, поэтому они менее мощные. Однако макросы с ограниченным доступом также получат лучшую поддержку, чем макросы с полным доступом, поэтому выбирайте с умом. См. Руководство по макросам для получения дополнительной информации.scala.reflect.macros.blackbox.Context