Трейт scala.reflect.macros.blackbox.Context
trait Context extends Aliases with Enclosures with Names with Reifiers with FrontEnds with Infrastructure with Typers with Parsers with Evals with ExprUtils with Internals
Члены типов
интерфейс ContextInternalApi расширяет MacroInternalApi
- Определяющие классы
- Internals
- См. также
тип Expr[+T] = Universe.Expr[T]
Expr оборачивает абстрактное синтаксическое дерево и помечает его типом.
- Определяющие классы
- Aliases
тип Modifiers = Universe.Modifiers
Тип модификаторов дерева.
- Определяющие классы
- Aliases
тип Name = Universe.Name
Абстрактный тип имён.
- Определяющие классы
- Aliases
тип Position = Universe.Position
Определяет специфичное для вселенной понятие позиций.
- Определяющие классы
- Aliases
абстрактный тип PrefixType
Тип префиксного дерева, из которого выбран макрос. См. запись документации для prefix для примера.
тип Scope = Universe.Scope
Базовый тип всех областей.
- Определяющие классы
- Aliases
тип Symbol = Universe.Symbol
Тип символов, представляющих объявления.
- Определяющие классы
- Aliases
тип TermName = Universe.TermName
Абстрактный тип имён, представляющих термины.
- Определяющие классы
- Aliases
тип Tree = Universe.Tree
Тип абстрактных синтаксических деревьев Scala.
- Определяющие классы
- Aliases
тип Type = Universe.Type
Тип Scala-типов, а также сигнатур Scala-типов. (Внутренне между ними разницы нет).
- Определяющие классы
- Aliases
тип TypeName = Universe.TypeName
Абстрактный тип имён, представляющих типы.
- Определяющие классы
- Aliases
тип TypeTag[T] = Universe.TypeTag[T]
Тип тегов типов.
- Определяющие классы
- Aliases
тип TypecheckException = macros.TypecheckException
- Определяющие классы
- Typers
- См. также
scala.reflect.macros.TypecheckException
абстрактный тип TypecheckMode
Представляет режим работы типопроверяющего средства, лежащего в основе c.typecheck вызовов. Необходимо, поскольку форма только что проверенного дерева недостаточно для того, чтобы догадаться, как его следует проверять. Может быть TERMmode (проверка как терм), TYPEmode (проверка как тип) или PATTERNmode (проверка как шаблон).
- Определяющие классы
- Typers
тип WeakTypeTag[T] = Universe.WeakTypeTag[T]
Тип слабых тегов типов.
- Определяющие классы
- Aliases
Члены-значения абстрактного типа
abstract def Expr[T](tree: Tree)(implicit arg0: WeakTypeTag[T]): Expr[T]
Сокращенная запись для создания выражения.
В отличие от стандартного фабричного метода для создания выражений, который требует scala.reflect.api.TreeCreator, данный метод принимает обычное дерево, но полученные выражения не могут быть перенесены в другие вселенные/зеркала (эта функциональность обычно не нужна для макросов, так как существует только одна вселенная во время компиляции и только одно зеркало во время компиляции).
- Definition Classes
- Aliases
abstract val PATTERNmode: TypecheckMode
Указывает, что аргумент c.typecheck должен быть проверен как шаблон.
- Definition Classes
- Typers
abstract val TERMmode: TypecheckMode
Указывает, что аргумент c.typecheck должен быть проверен как терм. Это режим проверки по умолчанию в Scala 2.11 и единственный поддерживаемый режим в Scala 2.10.
- Definition Classes
- Typers
abstract val TYPEmode: TypecheckMode
Указывает, что аргумент c.typecheck должен быть проверен как тип.
- Definition Classes
- Typers
abstract def TypeTag[T](tpe: Type): TypeTag[T]
Сокращенная запись для создания тега типа.
В отличие от стандартного фабричного метода для создания тегов типа, который требует scala.reflect.api.TypeCreator, данный метод принимает обычный тип, но полученные теги типа не могут быть перенесены в другие вселенные/зеркала (эта функциональность обычно не нужна для макросов, так как существует только одна вселенная во время компиляции и только одно зеркало во время компиляции).
- Definition Classes
- Aliases
abstract def WeakTypeTag[T](tpe: Type): WeakTypeTag[T]
Сокращенная запись для создания слабого тега типа.
В отличие от стандартного фабричного метода для создания тегов типа, который требует scala.reflect.api.TypeCreator, данный метод принимает обычный тип, но полученные теги типа не могут быть перенесены в другие вселенные/зеркала (эта функциональность обычно не нужна для макросов, так как существует только одна вселенная во время компиляции и только одно зеркало во время компиляции).
- Definition Classes
- Aliases
abstract def abort(pos: Position, msg: String): Nothing
Прерывает текущую макрорасшифровку, оставив заметку о случившемся. Используйте enclosingPosition, если вы сомневаетесь, какую позицию передать в pos.
- Definition Classes
- FrontEnds
abstract def classPath: List[URL]
Возвращает текущий путь к классам.
- Definition Classes
- Infrastructure
abstract def compilerSettings: List[String]
Возвращает текущие настройки компилятора как список опций. Используйте scalac -help, scalac -X и scalac -Y, чтобы узнать о поддерживаемых опциях.
- Definition Classes
- Infrastructure
abstract def echo(pos: Position, msg: String): Unit
Отправляет сообщение, которое не должно быть помечено как предупреждение/ошибка, но также не должно требовать -verbose для отображения. Используйте enclosingPosition, если вы сомневаетесь, какую позицию передать в pos.
- Definition Classes
- FrontEnds
abstract def enclosingMacros: List[Context]
Контексты, представляющие выполняемые макросы, включая текущий. Очень похожи на стек вызовов, но только для макросов. Могут быть полезны для взаимодействия с другими макросами и для наложения дружественных компилятору ограничений на расширение макросов.
Также бесценны для вывода осмысленных сообщений об ошибках для макросов, которые вызываются другими макросами на синтетических (т.е. лишенных позиции) деревьях. В таком случае просмотрите стек enclosingMacros, и он, скорее всего, будет содержать как минимум один макрос с макроприменением с позицией. См. enclosingPosition для реализации по умолчанию этой логики.
В отличие от openMacros, это значение, что означает, что оно инициализируется при создании контекста и всегда остается неизменным независимо от того, что происходит во время расширения макроса.
- Классы определения
- Окружения
абстрактный def enclosingPosition: Позиция
Пытается угадать позицию для окружающего применения. Но это просто, верно? Просто разыменовать pos macroApplication? Не совсем. Если мы находимся в синтетическом расширении макроса (без позиций), мы должны сделать все возможное, чтобы вывести позицию того, что спровоцировало это расширение. Удивительно, но довольно часто мы можем сделать это, просматривая стек enclosingMacros.
- Классы определения
- Окружения
абстрактный def error(pos: Позиция, msg: Строка): Единица
Выводит ошибку компиляции. Используйте enclosingPosition, если сомневаетесь, какую позицию передать pos.
- Классы определения
- Передние части
абстрактный def eval[T](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, которое неизвестно во время компиляции.
- Классы определения
- Вычисления
абстрактный def freshName[NameType <: Имя](name: NameType): NameType
Создает более или менее уникальное имя, имеющее указанное имя в качестве префикса и имеющее тот же тип (имя термина или имя типа), что и данное имя. См. scala.reflect.macros.Names для получения дополнительной информации об уникальности таких имен.
- Классы определения
- Имена
абстрактный def freshName(name: Строка): Строка
Создает строку, представляющую более или менее уникальное имя, имеющее указанный префикс. См. scala.reflect.macros.Names для получения дополнительной информации об уникальности таких имен.
- Классы определения
- Имена
абстрактный def freshName(): Строка
Создает строку, представляющую более или менее уникальное имя. См. scala.reflect.macros.Names для получения дополнительной информации об уникальности таких имен.
- Классы определения
- Имена
абстрактный def hasErrors: Булево
В сессии компиляции есть ошибки?
- Классы определения
- Передние части
абстрактный def hasWarnings: Булево
В сессии компиляции есть какие-либо предупреждения?
- Классы определения
- Передние части
абстрактный def inferImplicitValue(pt: Тип, silent: Булево = true, withMacrosDisabled: Булево = false, pos: Позиция = enclosingPosition): Дерево
Вычисляет неявное значение требуемого типа pt в контексте вызова макроса. Дополнительный параметр pos предоставляет позицию, которая будет связана с поиском неявного значения.
Если silent равно false, TypecheckException будет вызвано в случае ошибки вывода. Если silent равно true, проверка типов будет беззвучной и вернет EmptyTree в случае ошибки. Такие ошибки не исчезают и могут быть проверены, включив -Xlog-implicits. В отличие от typecheck, silent по умолчанию равно true.
- Классы определения
- Типовые средства
- Исключения
abstract def inferImplicitView(tree: Tree, from: Type, to: Type, silent: Boolean = true, withMacrosDisabled: Boolean = false, pos: Position = enclosingPosition): Tree
Определяет неявное представление (implicit view) из предоставленного дерева tree типа from к типу to в контексте вызова макроса. Необязательный параметр pos задаёт позицию, которая будет ассоциирована с поиском неявного представления.
Если silent равно false, TypecheckException будет выброшено в случае ошибки вывода. Если silent равно true, проверка типов будет выполнена в бесшумном режиме, и будет возвращено значение EmptyTree в случае возникновения ошибки. Такие ошибки не исчезают и могут быть просмотрены, если включить -Xlog-implicits. В отличие от typecheck, значение silent по умолчанию равно true.
- Definition Classes
- Typers
- Исключения
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
- См. также
abstract def macroApplication: Tree
Дерево, над которым выполняется расширение макроса. Может быть полезно для получения смещения или диапазона позиций всего обрабатываемого дерева.
- Definition Classes
- Enclosures
abstract val mirror: Universe.Mirror
abstract def openMacros: List[Context]
Контексты, представляющие активные макросы, включая текущий. Очень похоже на стек вызовов, но только для макросов. Может быть полезно для взаимодействия с другими макросами и для наложения компилятором-дружественных ограничений на расширение макросов.
Также очень ценно для вывода осмысленных сообщений об ошибках для макросов, которые вызываются другими макросами над синтетическими (т.е. без позиций) деревьями. В таком случае просмотрите стек openMacros, и он, скорее всего, будет содержать как минимум один макрос с позицией в дереве макро-применения. См. enclosingPosition для реализации по умолчанию этой логики.
В отличие от enclosingMacros, это метод, что означает, что он пересчитывается при каждом вызове, поэтому он может меняться в зависимости от происходящего во время расширения макросов.
- Definition Classes
- Typers
abstract def parse(code: String): Tree
Разбирает строку со скала-выражением в дерево абстрактного синтаксиса. Работает только с выражениями, т.е. разбор объявления пакета завершится ошибкой.
- Definition Classes
- Parsers
- Исключения
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].
abstract def reifyEnclosingRuntimeClass: Tree
Для данного типа генерируется дерево, которое при компиляции и выполнении создаёт класс времени выполнения окружающего класса или модуля. Возвращает EmptyTree если не существует окружающего класса или модуля.
- Definition Classes
- Reifiers
abstract def reifyRuntimeClass(tpe: Type, concrete: Boolean = true): Tree
Для данного типа генерируется дерево, которое при компиляции и выполнении создаёт класс времени выполнения исходного типа. Если concrete равно true, эта функция будет прерываться для типов, которые ссылаются на абстрактные типы (как это делает ClassTag).
- Definition Classes
- 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. Это возможно, потому что это макрос, поэтому он может генерировать любой код, который пожелает.
* Результат компиляции и выполнения результата reifyTree будет prefix, который необходимо явно передать. Это происходит, потому что Вселенная результата вычисления находится на другом метауровне, чем контекст, вызвавший reify.
Типичное использование этой функции заключается в сохранении некоторых деревьев, полученных/созданных макросом, в форме, которую можно просмотреть (с помощью сопоставления с образцом) или скомпилировать/выполнить (с помощью рефлективного инструментария) во время выполнения.
- Definition Classes
- Reifiers
абстрактный def reifyType(universe: Tree, mirror: Tree, tpe: Type, concrete: Boolean = false): Tree
В заданном типе, сгенерировать дерево, которое при компиляции и выполнении произведёт исходный тип. Сгенерированное дерево будет связано со специфицированными universe и mirror. Для получения дополнительной информации и примеров, обратитесь к документации для Context.reifyTree и Universe.reify.
- Definition Classes
- Reifiers
абстрактный def settings: List[String]
Выводит специфичные для макроса настройки в виде списка строк. Эти настройки передаются компилятору через командную строку "-Xmacro-settings:setting1,setting2...,settingN".
- Definition Classes
- 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
абстрактный val universe: Universe
абстрактный def unreifyTree(tree: Tree): Tree
Отменяет реификацию дерева.
Это обращение не просто восстанавливает исходное дерево (это потеряло бы контекст реификации), а делает что-то более сложное, что соответствует следующим законам:
1) unreifyTree(reifyTree(tree)) != tree // деифицированное дерево — это дерево + сохранённый контекст // в текущей реализации результат unreify является непрозрачным // т. е. нет возможности просмотреть базовое дерево/контекст
2) reifyTree(unreifyTree(reifyTree(tree))) == reifyTree(tree) // результат реификации дерева в его исходном контексте равен // результату реификации дерева вместе с его сохранённым контекстом
3) compileAndEval(unreifyTree(reifyTree(tree))) ~ compileAndEval(tree) // во время выполнения исходное и деифицированное деревья поведенчески эквивалентны
- 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
абстрактный def enclosingTemplate: Universe.Template
Дерево, соответствующее дереву Шаблона, содержащему эту функцию. Возвращает EnclosureException, если такого дерева нет.
- Определения классов
- Enclosures
- Аннотации
- @deprecated
- Устарело
(С версии 2.11.0) API в стиле c.enclosingTree теперь устарело; обратитесь к scaladoc для получения дополнительной информации
- См. также
абстрактный def enclosingUnit: CompilationUnit
Единица компиляции, содержащая это применение макроса.
- Определения классов
- Enclosures
- Аннотации
- @deprecated
- Устарело
(С версии 2.11.0) API в стиле c.enclosingTree теперь устарело; обратитесь к scaladoc для получения дополнительной информации
- См. также
абстрактный def fresh[NameType <: Name](name: NameType): NameType
Создаёт более или менее уникальное имя, имеющее заданное имя в качестве префикса и тот же тип (имя переменной или имя типа), что и заданное имя. Обратитесь к scala.reflect.macros.Names для получения дополнительной информации об уникальности таких имён.
- Определения классов
- Names
- Аннотации
- @deprecated
- Устарело
(С версии 2.11.0) используйте freshName вместо
абстрактный def fresh(name: String): String
Создаёт строку, представляющую более или менее уникальное имя, имеющее заданный префикс. Обратитесь к scala.reflect.macros.Names для получения дополнительной информации об уникальности таких имён.
- Определения классов
- Names
- Аннотации
- @deprecated
- Устарело
(С версии 2.11.0) используйте freshName вместо
абстрактный def fresh(): String
Создаёт строку, представляющую более или менее уникальное имя. Обратитесь к scala.reflect.macros.Names для получения дополнительной информации об уникальности таких имён.
- Определения классов
- Names
- Аннотации
- @deprecated
- Устарело
(С версии 2.11.0) используйте freshName вместо
абстрактный def literal(x: Char): Expr[Char]
Краткая запись для Literal(Constant(x: Char)) в базовом universe.
- Определения классов
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(С версии 2.11.0) используйте quasiquotes вместо
абстрактный def literal(x: String): Expr[String]
Краткая запись для Literal(Constant(x: String)) в базовом universe.
- Определения классов
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(С версии 2.11.0) используйте quasiquotes вместо
абстрактный def literal(x: Double): Expr[Double]
Краткая запись для Literal(Constant(x: Double)) в базовом universe.
- Определения классов
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(С версии 2.11.0) используйте quasiquotes вместо
абстрактный def literal(x: Float): Expr[Float]
Краткая запись для Literal(Constant(x: Float)) в базовом universe.
- Определения классов
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(С версии 2.11.0) используйте quasiquotes вместо
абстрактный def literal(x: Long): Expr[Long]
Сокращенная запись для Literal(Constant(x: Long)) в базовом universe.
- Определяющие классы
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) используйте quasiquotes вместо этого
abstract def literal(x: Int): Expr[Int]
Сокращенная запись для Literal(Constant(x: Int)) в базовом universe.
- Определяющие классы
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) используйте quasiquotes вместо этого
abstract def literal(x: Short): Expr[Short]
Сокращенная запись для Literal(Constant(x: Short)) в базовом universe.
- Определяющие классы
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) используйте quasiquotes вместо этого
abstract def literal(x: Byte): Expr[Byte]
Сокращенная запись для Literal(Constant(x: Byte)) в базовом universe.
- Определяющие классы
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) используйте quasiquotes вместо этого
abstract def literal(x: Boolean): Expr[Boolean]
Сокращенная запись для Literal(Constant(x: Boolean)) в базовом universe.
- Определяющие классы
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) используйте quasiquotes вместо этого
abstract def literalFalse: Expr[Boolean]
Сокращенная запись для Literal(Constant(false)) в базовом universe.
- Определяющие классы
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) используйте quasiquotes вместо этого
abstract def literalNull: Expr[Null]
Сокращенная запись для Literal(Constant(null)) в базовом universe.
- Определяющие классы
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) используйте quasiquotes вместо этого
abstract def literalTrue: Expr[Boolean]
Сокращенная запись для Literal(Constant(true)) в базовом universe.
- Определяющие классы
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) используйте quasiquotes вместо этого
abstract def literalUnit: Expr[Unit]
Сокращенная запись для Literal(Constant(())) в базовом universe.
- Определяющие классы
- ExprUtils
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) используйте quasiquotes вместо этого
abstract def resetLocalAttrs(tree: Tree): Tree
Рекурсивно сбрасывает локально определенные символы и типы в заданном дереве. ВНИМАНИЕ: Не используйте этот API, используйте untypecheck вместо этого.
- Определяющие классы
- Typers
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 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/blackbox/Context.html
ЭКСПЕРИМЕНТАЛЬНО
Контекст макросов Scala blackbox.
См. страницу обзора для описания работы макросов. Этот элемент документации предоставляет информацию об API, доступном для разработчиков макросов.
Контекст макроса обертывает вселенную компилятора, представленную в
universeи имеющую тип scala.reflect.macros.Universe. Этот тип является уточнением общего API рефлексии, предоставляемого в scala.reflect.api.Universe. Расширенная Вселенная обеспечивает возможность изменения рефлексивных артефактов (например, макросы могут изменять типы деревьев компилятора, добавлять аннотации к символам, представляющим определения и т. д.) и предоставляет некоторые внутренние функции компилятора, такие какSymbol.deSkolemizeилиTree.attachments.Еще одна фундаментальная часть контекста макроса —
macroApplication, которая предоставляет доступ к дереву, подвергающемуся макрорасширению. Части этого дерева можно найти в аргументах соответствующих реализаций макросов и вprefix, ноmacroApplicationдает полную картину.Помимо этого, контексты макросов предоставляют средства для проверки типов, исследования таблицы символов компилятора и охватывающих деревьев и единиц компиляции, вычисления деревьев, протоколирования предупреждений/ошибок и многого другого. Обратитесь к документации верхних трейтов в этом пакете, чтобы узнать подробности.
Если макрос def ссылается на реализацию макро impl, использующую
blackbox.Context, то этот макрос def становится макросом blackbox, что означает, что его расширение будет преобразовано в его тип возврата, обеспечивая соответствие этого макроса его сигнатуре типа. Белые макросы, т. е. определенные сwhitebox.Context, не ограничены этим ограничением, что позволяет использовать ряд важных случаев использования, но они также получат меньше поддержки, чем blackbox-макросы, поэтому выбирайте обдуманно. См. Руководство по макросам для получения дополнительной информации.scala.reflect.macros.whitebox.Context