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"