Spec-Zone.ru › Scala 2.13 Reflection

Трейт scala.reflect.api.Printers

трейт Printers extends AnyRef

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

Утилиты для красивой печати scala.reflect.api.Trees и scala.reflect.api.Types.

Печать деревьев

Метод show отображает "форматированное" представление отражаемых артефактов. Это представление предоставляет десугаризованное Java-представление кода Scala. Например:

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> def tree = reify{ final class C { def x = 2 } }.tree
tree: reflect.runtime.universe.Tree

scala> show(tree)
res0: String =
{
  final class C extends AnyRef {
    def <init>() = {
      super.<init>();
      ()
    };
    def x = 2
  };
  ()
}

Метод showRaw отображает внутреннюю структуру данного объекта рефлексии в виде абстрактного синтаксического дерева (AST) Scala, на котором работает Scala-типизатор.

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

scala> showRaw(tree)
res1: String = Block(List(
  ClassDef(Modifiers(FINAL), TypeName("C"), List(), Template(
    List(Ident(TypeName("AnyRef"))),
    noSelfType,
    List(
      DefDef(Modifiers(), nme.CONSTRUCTOR, List(), List(List()), TypeTree(),
        Block(List(
          Apply(Select(Super(This(tpnme.EMPTY), tpnme.EMPTY), nme.CONSTRUCTOR), List())),
          Literal(Constant(())))),
      DefDef(Modifiers(), TermName("x"), List(), List(), TypeTree(),
        Literal(Constant(2))))))),
  Literal(Constant(())))

Метод showRaw также может печатать scala.reflect.api.Types рядом с проверяемыми артефактами.

scala> import scala.tools.reflect.ToolBox // requires scala-compiler.jar
import scala.tools.reflect.ToolBox

scala> import scala.reflect.runtime.{currentMirror => cm}
import scala.reflect.runtime.{currentMirror=>cm}

scala> showRaw(cm.mkToolBox().typecheck(tree), printTypes = true)
res2: String = Block[1](List(
  ClassDef[2](Modifiers(FINAL), TypeName("C"), List(), Template[3](
    List(Ident[4](TypeName("AnyRef"))),
    noSelfType,
    List(
      DefDef[2](Modifiers(), nme.CONSTRUCTOR, List(), List(List()), TypeTree[3](),
        Block[1](List(
          Apply[4](Select[5](Super[6](This[3](TypeName("C")), tpnme.EMPTY), ...))),
          Literal[1](Constant(())))),
      DefDef[2](Modifiers(), TermName("x"), List(), List(), TypeTree[7](),
        Literal[8](Constant(2))))))),
  Literal[1](Constant(())))
[1] TypeRef(ThisType(scala), scala.Unit, List())
[2] NoType
[3] TypeRef(NoPrefix, TypeName("C"), List())
[4] TypeRef(ThisType(java.lang), java.lang.Object, List())
[5] MethodType(List(), TypeRef(ThisType(java.lang), java.lang.Object, List()))
[6] SuperType(ThisType(TypeName("C")), TypeRef(... java.lang.Object ...))
[7] TypeRef(ThisType(scala), scala.Int, List())
[8] ConstantType(Constant(2))
Печать типов

Метод show

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> def tpe = typeOf[{ def x: Int; val y: List[Int] }]
tpe: reflect.runtime.universe.Type

scala> show(tpe)
res0: String = scala.AnyRef{def x: Int; val y: scala.List[Int]}

Как и метод showRaw для scala.reflect.api.Trees, showRaw для scala.reflect.api.Types предоставляет визуализацию Scala AST, над которой работает Scala-типизатор.

// showRaw has already been discussed above
scala> showRaw(tpe)
res1: String = RefinedType(
  List(TypeRef(ThisType(scala), TypeName("AnyRef"), List())),
  Scope(
    TermName("x"),
    TermName("y")))

printIds и/или printKinds могут дополнительно быть переданы в качестве аргументов в вызове showRaw, который дополнительно отображает уникальные идентификаторы символов.

scala> showRaw(tpe, printIds = true, printKinds = true)
res2: String = RefinedType(
  List(TypeRef(ThisType(scala#2043#PK), TypeName("AnyRef")#691#TPE, List())),
  Scope(
    TermName("x")#2540#METH,
    TermName("y")#2541#GET))

Для получения более подробной информации о Printer и других аспектах рефлексии Scala, см. Руководство по рефлексии

Тип самого себя
Universe
Источник
Printers.scala
Линейные супертипы
AnyRef, Any
Известные подклассы
JavaUniverse, Universe, Universe

Члены типа

служебный классBooleanFlag(value: Option[Boolean]) extends Product с Serializable

трейтTreePrinter extends AnyRef

Атрибуты
защищенный

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

абстрактный defnewCodePrinter(out: PrintWriter, tree: Universe.Tree, printRootPkg: Boolean): Universe.TreePrinter

Способ определить, что showCode(...) означает.

Атрибуты
защищенный

абстрактный defnewRawTreePrinter(out: PrintWriter): Universe.TreePrinter

Способ определить, что showRaw(...) означает.

Атрибуты
защищенный

абстрактный defnewTreePrinter(out: PrintWriter): Universe.TreePrinter

Способ определить, что show(...) означает.

Атрибуты
защищенный

абстрактный defshow(position: Universe.Position): String

абстрактный defshow(flags: Universe.FlagSet): String

абстрактный defshow(name: Universe.Name): String

абстрактный defshowDecl(sym: Universe.Symbol): String

Члены-значения конкретного типа

final def !=(arg0: Any): Boolean

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

final def ##(): Int

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

def +(other: String): String

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

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

Неявный
Этот член добавлен с помощью неявного преобразования из Printers в ArrowAssoc[Printers] посредством метода 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: (Printers) => Boolean, msg: => Any): Printers

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

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

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

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

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

def ensuring(cond: Boolean): Printers

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

Неявный
Этот член добавлен в результате неявного преобразования из Printers в StringFormat[Printers] при помощи метода 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 render(what: Any, mkPrinter: (PrintWriter) => Universe.TreePrinter, printTypes: Universe.BooleanFlag = None, printIds: Universe.BooleanFlag = None, printOwners: Universe.BooleanFlag = None, printKinds: Universe.BooleanFlag = None, printMirrors: Universe.BooleanFlag = None, printPositions: Universe.BooleanFlag = None): String

Атрибуты
protected

def show(any: Any, printTypes: Universe.BooleanFlag = None, printIds: Universe.BooleanFlag = None, printOwners: Universe.BooleanFlag = None, printKinds: Universe.BooleanFlag = None, printMirrors: Universe.BooleanFlag = None, printPositions: Universe.BooleanFlag = None): String

def showCode(tree: Universe.Tree, printTypes: Universe.BooleanFlag = None, printIds: Universe.BooleanFlag = None, printOwners: Universe.BooleanFlag = None, printPositions: Universe.BooleanFlag = None, printRootPkg: Boolean = false): String

Отображает код переданного дерева таким образом, чтобы: 1) его можно было позже скомпилировать с помощью scalac, сохраняя то же значение, 2) он выглядел красиво. #1 доступен для деревьев без атрибутов и деревьев с атрибутами #2 более или менее имеет правильный отступ, но в данный момент там много оставленной десугаризации, и это то, что мы планируем улучшить в будущем. Опции printTypes, printIds, printPositions имеют то же значение, что и для TreePrinter. Опция printRootPkg доступна только для атрибутированных деревьев.

def showRaw(position: Universe.Position): String

def showRaw(flags: Universe.FlagSet): String

def showRaw(name: Universe.Name): String

def showRaw(any: Any, printTypes: Universe.BooleanFlag = None, printIds: Universe.BooleanFlag = None, printOwners: Universe.BooleanFlag = None, printKinds: Universe.BooleanFlag = None, printMirrors: Universe.BooleanFlag = None, printPositions: Universe.BooleanFlag = None): String

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

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

def toString(): String

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

def treeToString(tree: Universe.Tree): String

По умолчанию деревья печатаются с show

Атрибуты
protected

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

object BooleanFlag extends java.io.Serializable

© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.13.0/scala-reflect/scala/reflect/api/Printers.html

Spec-Zone.ru

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