in scalding-serialization/src/main/scala/com/twitter/scalding/serialization/macros/impl/ordered_serialization/SealedTraitLike.scala [154:213]
def length(
c: Context
)(element: c.Tree)(subData: List[(Int, c.Type, TreeOrderedBuf[c.type])]): CompileTimeLengthTypes[c.type] = {
import CompileTimeLengthTypes._
import c.universe._
def freshT(id: String) = TermName(c.freshName(id))
val prevSizeData = subData
.foldLeft(Option.empty[Tree]) { case (optiTree, (idx, tpe, tBuf)) =>
val baseLenT: Tree = tBuf.length(q"$element.asInstanceOf[$tpe]") match {
case m: MaybeLengthCalculation[_] =>
m.asInstanceOf[MaybeLengthCalculation[c.type]].t
case f: FastLengthCalculation[_] =>
q"""_root_.com.twitter.scalding.serialization.macros.impl.ordered_serialization.runtime_helpers.DynamicLen(${f
.asInstanceOf[FastLengthCalculation[c.type]]
.t})"""
case _: NoLengthCalculationAvailable[_] =>
return NoLengthCalculationAvailable(c)
case const: ConstantLengthCalculation[_] =>
q"""_root_.com.twitter.scalding.serialization.macros.impl.ordered_serialization.runtime_helpers.ConstLen(${const.toInt})"""
case e => sys.error("unexpected input to union length code of " + e)
}
val tmpPreLen = freshT("tmpPreLen")
val lenT = q"""
val $tmpPreLen: _root_.com.twitter.scalding.serialization.macros.impl.ordered_serialization.runtime_helpers.MaybeLength = $baseLenT
($tmpPreLen match {
case _root_.com.twitter.scalding.serialization.macros.impl.ordered_serialization.runtime_helpers.ConstLen(l) =>
_root_.com.twitter.scalding.serialization.macros.impl.ordered_serialization.runtime_helpers.DynamicLen(l + 1)
case _root_.com.twitter.scalding.serialization.macros.impl.ordered_serialization.runtime_helpers.DynamicLen(l) =>
_root_.com.twitter.scalding.serialization.macros.impl.ordered_serialization.runtime_helpers.DynamicLen(l + 1)
case _ =>
_root_.com.twitter.scalding.serialization.macros.impl.ordered_serialization.runtime_helpers.NoLengthCalculation
}): _root_.com.twitter.scalding.serialization.macros.impl.ordered_serialization.runtime_helpers.MaybeLength
"""
optiTree match {
case Some(t) =>
Some(q"""
if($element.isInstanceOf[$tpe]) {
$lenT
} else {
$t
}
""")
case None =>
Some(q"""
if($element.isInstanceOf[$tpe]) {
$lenT
} else {
sys.error("Unreachable code, did not match sealed trait type")
}""")
}
}
.get
MaybeLengthCalculation(c)(prevSizeData)
}