in scalding-serialization/src/main/scala/com/twitter/scalding/serialization/macros/impl/ordered_serialization/providers/ProductOrderedBuf.scala [23:160]
def dispatch(c: Context)(
buildDispatcher: => PartialFunction[c.Type, TreeOrderedBuf[c.type]]
): PartialFunction[c.Type, TreeOrderedBuf[c.type]] = {
import c.universe._
val validTypes: List[Type] = List(
typeOf[Product1[Any]],
typeOf[Product2[Any, Any]],
typeOf[Product3[Any, Any, Any]],
typeOf[Product4[Any, Any, Any, Any]],
typeOf[Product5[Any, Any, Any, Any, Any]],
typeOf[Product6[Any, Any, Any, Any, Any, Any]],
typeOf[Product7[Any, Any, Any, Any, Any, Any, Any]],
typeOf[Product8[Any, Any, Any, Any, Any, Any, Any, Any]],
typeOf[Product9[Any, Any, Any, Any, Any, Any, Any, Any, Any]],
typeOf[Product10[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
typeOf[Product11[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
typeOf[Product12[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
typeOf[Product13[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
typeOf[Product14[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
typeOf[Product15[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
typeOf[Product16[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
typeOf[Product17[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]],
typeOf[
Product18[Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any, Any]
],
typeOf[Product19[
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any
]],
typeOf[Product20[
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any
]],
typeOf[Product21[
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any
]],
typeOf[Product22[
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any,
Any
]]
)
def validType(curType: Type): Boolean =
validTypes.exists { t =>
curType <:< t
}
// The `_.get` is safe since it's always preceded by a matching
// `_.isDefined` check in `validType`
@SuppressWarnings(Array("org.wartremover.warts.OptionPartial"))
def symbolFor(subType: Type): Type = {
val superType = validTypes.find { t =>
subType.erasure <:< t
}.get
subType.baseType(superType.typeSymbol)
}
val pf: PartialFunction[c.Type, TreeOrderedBuf[c.type]] = {
case tpe if validType(tpe.erasure) =>
ProductOrderedBuf(c)(buildDispatcher, tpe, symbolFor(tpe))
}
pf
}