def length()

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)
  }