scala> import treehugger.forest._, definitions._, treehuggerDSL._
import treehugger.forest._
import definitions._
import treehuggerDSL._

scala> val tree: Tree = Predef_println APPLY LIT("Hello, world!")
[1m[34mtree[0m: [1m[32mtreehugger.forest.Tree[0m = Apply(Ident(println),List(Literal(Constant(Hello, world!))))

scala> treeToString(tree)
[1m[34mres0[0m: [1m[32mString[0m = println("Hello, world!")

The entire treehugger system is bundled up as treehugger.Forest class. The package object for treehugger defines an instance of Forest called forest for convenience. Under the forest, definitions object defines built-in symbols and treehuggerDSL object defines the DSL.

In the above code, object sym defines optional symbols. By wrapping in sym we can avoid conflicting with the real println function. Then, the line defining val tree: Tree is an example of treehugger DSL.

Finally, forest defines treeToString method to convert AST into a String:

def treeToString(args: Any*): String

treesToString takes a vararg of Any, and pretty prints Tree as Scala source code and everything else using toString with a new line in between.