Case Classes
Case classes are defined using CASECLASSDEF(...):
import treehugger.forest._, definitions._, treehuggerDSL._
object sym {
val Expr = RootClass.newClass("Expr")
val Var = RootClass.newClass("Var")
}
val tree = (CLASSDEF(sym.Expr) withFlags(Flags.SEALED, Flags.ABSTRACT): Tree)
// tree: Tree = ClassDef(
// Modifiers(1032L, TypeName(""), List()),
// Modifiers(0L, TypeName(""), List()),
// TypeName("Expr"),
// List(),
// List(),
// Template(
// List(),
// ValDef(Modifiers(4L, TypeName(""), List()), Ident(TermName("_")), EmptyTree),
// List()
// )
// )
treeToString(tree)
// res0: String = "sealed abstract class Expr"
val tree2 = (CASECLASSDEF(sym.Var)
withParams(PARAM("name", StringClass)) withParents(sym.Expr): Tree)
// tree2: Tree = ClassDef(
// Modifiers(2048L, TypeName(""), List()),
// Modifiers(0L, TypeName(""), List()),
// TypeName("Var"),
// List(),
// List(
// ValDef(
// Modifiers(8192L, TypeName(""), List()),
// Typed(Ident(TermName("name")), TypeTree()),
// EmptyTree
// )
// ),
// Template(
// List(TypeTree()),
// ValDef(Modifiers(4L, TypeName(""), List()), Ident(TermName("_")), EmptyTree),
// List()
// )
// )
treeToString(tree2)
// res1: String = "case class Var(name: String) extends Expr"