trait Printers extends AnyRef
EXPERIMENTAL
Utilities for nicely printing scala.reflect.api.Trees and scala.reflect.api.Types.
Printing Trees
The method show
displays the "prettified" representation of reflection artifacts.
This representation provides one with the desugared Java representation of Scala code.
For example:
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 }; () }
The method showRaw
displays internal structure of a given reflection object
as a Scala abstract syntax tree (AST), the representation that the Scala typechecker
operates on.
Note, that while this representation appears to generate correct trees that one might think would be possible to use in a macro implementation, this is not usually the case. Symbols aren't fully represented (only their names are). Thus, this method is best-suited for use simply inspecting ASTs given some valid Scala code.
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(())))
The method showRaw
can also print scala.reflect.api.Types next to the artifacts
being inspected
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))
Printing Types
The method 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]}
Like the method showRaw
for scala.reflect.api.Trees, showRaw
for scala.reflect.api.Types provides a visualization of the Scala
AST operated on by the Scala typechecker.
// 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
and/or printKinds
can additionally be supplied as arguments in a call to
showRaw
which additionally shows the unique identifiers of symbols.
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))
For more details about Printer
s and other aspects of Scala reflection, see the
Reflection Guide
- Self Type
- Universe
- Source
- Printers.scala
- Grouped
- Alphabetic
- By Inheritance
- Printers
- AnyRef
- Any
- by any2stringadd
- by StringFormat
- by Ensuring
- by ArrowAssoc
- Hide All
- Show All
- Public
- All
Type Members
- case class BooleanFlag(value: Option[Boolean]) extends Product with Serializable
- trait TreePrinter extends AnyRef
- Attributes
- protected
Abstract Value Members
- abstract def newCodePrinter(out: PrintWriter, tree: Universe.Tree, printRootPkg: Boolean): Universe.TreePrinter
Hook to define what
showCode(...)
means.Hook to define what
showCode(...)
means.- Attributes
- protected
- abstract def newRawTreePrinter(out: PrintWriter): Universe.TreePrinter
Hook to define what
showRaw(...)
means.Hook to define what
showRaw(...)
means.- Attributes
- protected
- abstract def newTreePrinter(out: PrintWriter): Universe.TreePrinter
Hook to define what
show(...)
means.Hook to define what
show(...)
means.- Attributes
- protected
- abstract def show(position: Universe.Position): String
Renders a prettified representation of a position.
- abstract def show(flags: Universe.FlagSet): String
Renders a prettified representation of a flag set.
- abstract def show(name: Universe.Name): String
Renders a prettified representation of a name.
- abstract def showDecl(sym: Universe.Symbol): String
Renders a string that represents a declaration of this symbol written in Scala.
Concrete Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##(): Int
- Definition Classes
- AnyRef → Any
- def +(other: String): String
- def ->[B](y: B): (Printers, B)
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def clone(): AnyRef
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native()
- def ensuring(cond: (Printers) => Boolean, msg: => Any): Printers
- def ensuring(cond: (Printers) => Boolean): Printers
- def ensuring(cond: Boolean, msg: => Any): Printers
- def ensuring(cond: Boolean): Printers
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef → Any
- def finalize(): Unit
- Attributes
- protected[java.lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.Throwable])
- def formatted(fmtstr: String): String
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- def hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @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
- Attributes
- 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
Renders a representation of a reflection artifact as desugared Scala code.
- 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
Renders the code of the passed tree, so that: 1) it can be later compiled by scalac retaining the same meaning, 2) it looks pretty.
Renders the code of the passed tree, so that: 1) it can be later compiled by scalac retaining the same meaning, 2) it looks pretty. #1 is available for unattributed trees and attributed trees #2 is more or less okay indentation-wise, but at the moment there's a lot of desugaring left in place, and that's what we plan to improve in the future. printTypes, printIds, printPositions options have the same meaning as for TreePrinter printRootPkg option is available only for attributed trees.
- def showRaw(position: Universe.Position): String
Renders internal structure of a position.
- def showRaw(flags: Universe.FlagSet): String
Renders internal structure of a flag set.
- def showRaw(name: Universe.Name): String
Renders internal structure of a name.
- 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
Renders internal structure of a reflection artifact as the visualization of a Scala syntax tree.
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toString(): String
- Definition Classes
- AnyRef → Any
- def treeToString(tree: Universe.Tree): String
By default trees are printed with
show
By default trees are printed with
show
- Attributes
- protected
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
- object BooleanFlag extends java.io.Serializable
Deprecated Value Members
- def →[B](y: B): (Printers, B)
- Implicit
- This member is added by an implicit conversion from Printers toArrowAssoc[Printers] performed by method ArrowAssoc in scala.Predef.
- Definition Classes
- ArrowAssoc
- Annotations
- @deprecated
- Deprecated
(Since version 2.13.0) Use
->
instead. If you still wish to display it as one character, consider using a font with programming ligatures such as Fira Code.