data class MethodDescription( val qualifiedName: String, val className: String, val packageName: String, val declaration: String, val javaDoc: String, val content: List ) private object TokenSerializer: JsonSerializer, JsonDeserializer { override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Token = with(context) { val type = json.asJsonObject["type"].asString return when (type) { "LiteralToken" -> deserialize(json, LiteralToken::class.java) "TypeToken" -> deserialize(json, TypeToken::class.java) "IdentifierToken" -> deserialize(json, IdentifierToken::class.java) "CallToken" -> deserialize(json, CallToken::class.java) else -> throw IllegalArgumentException("There is no registered token class for type $type") } } override fun serialize(src: Token, typeOfSrc: Type, context: JsonSerializationContext): JsonElement { return context.serialize(src).asJsonObject.apply { addProperty("type", src.javaClass.simpleName) } } }