Trait scala.reflect.macros.Enclosures
trait Enclosures extends AnyRef
Абстрактные члены значения
abstract def enclosingMacros: List[blackbox.Context]
Контексты, представляющие макросы в процессе выполнения, включая текущий. Очень похоже на стек вызовов, но только для макросов. Может быть полезно для взаимодействия с другими макросами и для наложения ограничений, удобных для компилятора, на разворачивание макросов.
Также бесценно для выдачи адекватных сообщений об ошибках для макросов, которые вызываются другими макросами на синтетических (т.е. без позиций) деревьях. В этом крайнем случае пройдитесь по стеку enclosingMacros, и он, скорее всего, будет содержать хотя бы один макрос с позиционным применением макроса. Смотрите enclosingPosition для реализации этой логики по умолчанию.
В отличие от openMacros, это val, что означает, что он инициализируется при создании контекста и всегда остаётся тем же, независимо от того, что происходит во время разворачивания макроса.
abstract def enclosingPosition: blackbox.Context.Position
Пытается угадать позицию для окружающего применения. Но это просто, верно? Просто разыменовать pos из macroApplication? Не совсем. Если мы находимся в синтетическом разворачивании макроса (без позиций), мы должны сделать всё возможное, чтобы вывести позицию того, что вызвало это разворачивание. Удивительно, но довольно часто мы можем сделать это, пройдясь по стеку enclosingMacros.
abstract def macroApplication: blackbox.Context.Tree
Дерево, которое подвергается разворачиванию макроса. Может быть полезно для получения смещения или диапазона позиций всего обрабатываемого дерева.
abstract def enclosingClass: blackbox.Context.Tree
Дерево, соответствующее окружающему классу, или EmptyTree, если это неприменимо.
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) API в стиле c.enclosingTree теперь устарели; см. документацию scaladoc для получения дополнительной информации
- См. также
abstract def enclosingDef: Universe.DefDef
Дерево, соответствующее окружающему дереву DefDef. Выбрасывает EnclosureException если нет такого окружающего дерева.
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) API в стиле c.enclosingTree теперь устарели; см. документацию scaladoc для получения дополнительной информации
- См. также
abstract def enclosingImpl: Universe.ImplDef
Дерево, соответствующее окружающему дереву ImplDef (т.е. либо ClassDef, либо ModuleDef). Выбрасывает EnclosureException если нет такого окружающего дерева.
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) API в стиле c.enclosingTree теперь устарели; см. документацию scaladoc для получения дополнительной информации
- См. также
abstract def enclosingMethod: blackbox.Context.Tree
Дерево, соответствующее окружающему методу, или EmptyTree, если это неприменимо.
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) API в стиле c.enclosingTree теперь устарели; см. документацию scaladoc для получения дополнительной информации
- См. также
abstract def enclosingPackage: Universe.PackageDef
Дерево, соответствующее окружающему дереву PackageDef. Выбрасывает EnclosureException если нет такого окружающего дерева.
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) API в стиле c.enclosingTree теперь устарели; см. документацию scaladoc для получения дополнительной информации
- См. также
abstract def enclosingRun: blackbox.Context.Run
Сеанс компиляции, содержащий это применение макроса.
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) API в стиле c.enclosingTree теперь устарели; см. документацию scaladoc для получения дополнительной информации
- См. также
abstract def enclosingTemplate: Universe.Template
Дерево, соответствующее окружающему дереву Template. Выбрасывает EnclosureException если нет такого окружающего дерева.
- Аннотации
- @deprecated
- Устарело
(Начиная с версии 2.11.0) API в стиле c.enclosingTree теперь устарели; см. документацию scaladoc для получения дополнительной информации
- См. также
abstract def enclosingUnit: blackbox.Context.CompilationUnit
Единица компиляции, содержащая это применение макроса.
- Аннотации
- @deprecated
- Устаревшее
(Since version 2.11.0) c.enclosingTree-style APIs are now deprecated; consult the scaladoc for more information
- См. также
Члены-значения
final def !=(arg0: Any): Boolean
- Определения классов
- AnyRef → Any
final def ##(): Int
- Определения классов
- AnyRef → Any
def +(other: String): String
- Неявный
- Этот член добавлен неявным преобразованием из Enclosures вany2stringadd[Enclosures] с помощью метода any2stringadd в scala.Predef.
- Определения классов
- any2stringadd
def ->[B](y: B): (Enclosures, B)
- Неявный
- Этот член добавлен неявным преобразованием из Enclosures вArrowAssoc[Enclosures] с помощью метода ArrowAssoc в scala.Predef.
- Определения классов
- ArrowAssoc
- Аннотации
- @inline()
final def ==(arg0: Any): Boolean
- Определения классов
- AnyRef → Any
final def asInstanceOf[T0]: T0
- Определения классов
- Any
def clone(): AnyRef
- Атрибуты
- protected[java.lang]
- Определения классов
- AnyRef
- Аннотации
- @throws(classOf[java.lang.CloneNotSupportedException]) @native()
def ensuring(cond: (Enclosures) => Boolean, msg: => Any): Enclosures
- Неявный
- Этот член добавлен неявным преобразованием из Enclosures вEnsuring[Enclosures] с помощью метода Ensuring в scala.Predef.
- Определения классов
- Ensuring
def ensuring(cond: (Enclosures) => Boolean): Enclosures
- Неявный
- Этот член добавлен неявным преобразованием из Enclosures вEnsuring[Enclosures] с помощью метода Ensuring в scala.Predef.
- Определения классов
- Ensuring
def ensuring(cond: Boolean, msg: => Any): Enclosures
- Неявный
- Этот член добавлен неявным преобразованием из Enclosures вEnsuring[Enclosures] с помощью метода Ensuring в scala.Predef.
- Определения классов
- Ensuring
def ensuring(cond: Boolean): Enclosures
- Неявный
- Этот член добавлен неявным преобразованием из Enclosures вEnsuring[Enclosures] с помощью метода 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
- Неявное
- Этот член добавлен неявно посредством преобразования из Enclosures в StringFormat[Enclosures] с помощью метода 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()
final def synchronized[T0](arg0: => T0): T0
- Классы-определения
- AnyRef
def toString(): String
- Классы-определения
- AnyRef → Any
final def wait(): Unit
- Классы-определения
- AnyRef
- Аннотации
- @throws(classOf[java.lang.InterruptedException])
final def wait(arg0: Long, arg1: Int): Unit
- Классы-определения
- AnyRef
- Аннотации
- @throws(classOf[java.lang.InterruptedException])
final def wait(arg0: Long): Unit
- Классы-определения
- AnyRef
- Аннотации
- @throws(classOf[java.lang.InterruptedException]) @native()
© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.13.0/scala-reflect/scala/reflect/macros/Enclosures.html
ЭКСПЕРИМЕНТАЛЬНО
Часть контекста макросов Scala, которая предоставляет доступ к охватывающим деревьям (метод, класс, единица компиляции и текущее приложение макроса), положению охватывающей области макрорасширения, а также макросам и имплицитам, которые в данный момент находятся в процессе выполнения.
Начиная со Scala 2.11.0, API для получения деревьев, охватывающих текущее приложение макроса, устарели, и причины для этого двояки. Во-первых, мы хотели бы перейти к философии локально-расширяемых макросов, так как это оказалось важным для понимания кода. Во-вторых, в текущей архитектуре scalac, у нас нет возможности иметь API в стиле c.enclosingTree, работающие надежно. Необходимые изменения в типе-проверке значительно превышают усилия, которые мы хотели бы потратить на эту функцию, учитывая наличие более насущных задач в данный момент. Это в некоторой степени согласуется с общей эволюцией макросов в течение цикла разработки 2.11, где мы экспериментировали с
c.introduceTopLevelиc.introduceMember, но в конечном итоге решили их отклонить.Если вы полагаетесь на устаревшие API, рассмотрите использование нового метода c.internal.enclosingOwner, который можно использовать для получения имён охватывающих определений. В качестве альтернативы, попробуйте переформулировать свои макросы в терминах полностью локального расширения и/или присоединиться к обсуждению потенциальной функции языка, имеющей некоторое сходство с этим, на https://groups.google.com/forum/#!topic/scala-debate/f4CLmYShX6Q. Мы также приветствуем вопросы и предложения на наших почтовых списках, где будем рады продолжить обсуждение этого вопроса.