Don't generate writeSelf/internal constructor if corresponding serialize/deserialize aren't auto-generated

This commit is contained in:
Leonid Startsev
2019-01-31 19:08:49 +03:00
parent a6651fd6f9
commit 5231ef9966
2 changed files with 26 additions and 14 deletions
@@ -22,6 +22,8 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlinx.serialization.compiler.resolve.KSerializerDescriptorResolver
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializableProperties
import org.jetbrains.kotlinx.serialization.compiler.resolve.classSerializer
import org.jetbrains.kotlinx.serialization.compiler.resolve.toClassDescriptor
abstract class SerializableCodegen(
protected val serializableDescriptor: ClassDescriptor,
@@ -35,13 +37,19 @@ abstract class SerializableCodegen(
}
private fun generateSyntheticInternalConstructor() {
val constrDesc = KSerializerDescriptorResolver.createLoadConstructorDescriptor(serializableDescriptor, bindingContext)
generateInternalConstructor(constrDesc)
val serializerDescriptor = serializableDescriptor.classSerializer?.toClassDescriptor ?: return
if (SerializerCodegen.getSyntheticLoadMember(serializerDescriptor) != null) {
val constrDesc = KSerializerDescriptorResolver.createLoadConstructorDescriptor(serializableDescriptor, bindingContext)
generateInternalConstructor(constrDesc)
}
}
private fun generateSyntheticMethods() {
val func = KSerializerDescriptorResolver.createWriteSelfFunctionDescriptor(serializableDescriptor)
generateWriteSelfMethod(func)
val serializerDescriptor = serializableDescriptor.classSerializer?.toClassDescriptor ?: return
if (SerializerCodegen.getSyntheticSaveMember(serializerDescriptor) != null) {
val func = KSerializerDescriptorResolver.createWriteSelfFunctionDescriptor(serializableDescriptor)
generateWriteSelfMethod(func)
}
}
protected abstract fun generateInternalConstructor(constructorDescriptor: ClassConstructorDescriptor)
@@ -110,22 +110,14 @@ abstract class SerializerCodegen(
}
private fun generateSaveIfNeeded(): Boolean {
val function = getMemberToGenerate(
serializerDescriptor, SerialEntityNames.SAVE,
serializerDescriptor::checkSaveMethodResult, serializerDescriptor::checkSaveMethodParameters
)
?: return false
val function = getSyntheticSaveMember(serializerDescriptor) ?: return false
checkSerializability()
generateSave(function)
return true
}
private fun generateLoadIfNeeded(): Boolean {
val function = getMemberToGenerate(
serializerDescriptor, SerialEntityNames.LOAD,
serializerDescriptor::checkLoadMethodResult, serializerDescriptor::checkLoadMethodParameters
)
?: return false
val function = getSyntheticLoadMember(serializerDescriptor) ?: return false
checkSerializability()
generateLoad(function)
return true
@@ -160,4 +152,16 @@ abstract class SerializerCodegen(
protected fun ClassDescriptor.getFuncDesc(funcName: String): Sequence<FunctionDescriptor> =
unsubstitutedMemberScope.getDescriptorsFiltered { it == Name.identifier(funcName) }.asSequence().filterIsInstance<FunctionDescriptor>()
companion object {
fun getSyntheticLoadMember(serializerDescriptor: ClassDescriptor): FunctionDescriptor? = getMemberToGenerate(
serializerDescriptor, SerialEntityNames.LOAD,
serializerDescriptor::checkLoadMethodResult, serializerDescriptor::checkLoadMethodParameters
)
fun getSyntheticSaveMember(serializerDescriptor: ClassDescriptor): FunctionDescriptor? = getMemberToGenerate(
serializerDescriptor, SerialEntityNames.SAVE,
serializerDescriptor::checkSaveMethodResult, serializerDescriptor::checkSaveMethodParameters
)
}
}