in scrooge-generator/src/main/scala/com/twitter/scrooge/backend/StructTemplate.scala [46:144]
def readWriteInfo[T <: FieldType](sid: SimpleID, t: FieldType): Dictionary = {
t match {
case at: AnnotatedFieldType => readWriteInfo(sid, at.unwrap)
case t: ListType =>
val elt = sid.append("_element")
TypeTemplate + Dictionary(
"fieldType" -> genType(t),
"isCollection" -> v(true),
"isList" -> v(
Dictionary(
"name" -> genID(sid),
"eltName" -> genID(elt),
"eltConstType" -> genConstType(t.eltType),
"eltWireConstType" -> genWireConstType(t.eltType),
"eltType" -> genType(t.eltType),
"eltReadWriteInfo" -> v(readWriteInfo(elt, t.eltType))
)
)
)
case t: SetType =>
val elt = sid.append("_element")
TypeTemplate + Dictionary(
"fieldType" -> genType(t),
"isCollection" -> v(true),
"isSet" -> v(
Dictionary(
"name" -> genID(sid),
"eltName" -> genID(elt),
"eltConstType" -> genConstType(t.eltType),
"eltWireConstType" -> genWireConstType(t.eltType),
"eltType" -> genType(t.eltType),
"isEnumSet" -> v(t.eltType.isInstanceOf[EnumType]),
"eltReadWriteInfo" -> v(readWriteInfo(elt, t.eltType))
)
)
)
case t: MapType =>
val key = sid.append("_key")
val value = sid.append("_value")
TypeTemplate + Dictionary(
"fieldType" -> genType(t),
"isCollection" -> v(true),
"isMap" -> v(
Dictionary(
"name" -> genID(sid),
"keyConstType" -> genConstType(t.keyType),
"keyWireConstType" -> genWireConstType(t.keyType),
"valueConstType" -> genConstType(t.valueType),
"valueWireConstType" -> genWireConstType(t.valueType),
"keyType" -> genType(t.keyType),
"valueType" -> genType(t.valueType),
"keyName" -> genID(key),
"valueName" -> genID(value),
"keyReadWriteInfo" -> v(readWriteInfo(key, t.keyType)),
"valueReadWriteInfo" -> v(readWriteInfo(value, t.valueType))
)
)
)
case t: StructType =>
TypeTemplate + Dictionary(
"isNamedType" -> v(true),
"isImported" -> v(t.scopePrefix.isDefined),
"fieldType" -> genType(t),
"isStruct" -> v(
Dictionary(
"name" -> genID(sid)
)
)
)
case t: EnumType =>
TypeTemplate + Dictionary(
"isNamedType" -> v(true),
"isImported" -> v(t.scopePrefix.isDefined),
"fieldType" -> {
genType(t.copy(enum = t.enum.copy(t.enum.sid.toTitleCase)))
},
"isEnum" -> v(
Dictionary(
"name" -> genID(sid)
)
)
)
case t: BaseType =>
TypeTemplate + Dictionary(
"fieldType" -> genType(t),
"isBase" -> v(
Dictionary(
"type" -> genType(t),
"name" -> genID(sid),
"protocolWriteMethod" -> genProtocolWriteMethod(t),
"protocolReadMethod" -> genProtocolReadMethod(t),
"protocolSkipMethod" -> genProtocolSkipMethod(t)
)
)
)
case _: ReferenceType =>
throw new ScroogeInternalException("ReferenceType should have been resolved by now")
}
}