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.kotlin.resolve.BindingContext
import org.jetbrains.kotlinx.serialization.compiler.resolve.KSerializerDescriptorResolver import org.jetbrains.kotlinx.serialization.compiler.resolve.KSerializerDescriptorResolver
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializableProperties 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( abstract class SerializableCodegen(
protected val serializableDescriptor: ClassDescriptor, protected val serializableDescriptor: ClassDescriptor,
@@ -35,13 +37,19 @@ abstract class SerializableCodegen(
} }
private fun generateSyntheticInternalConstructor() { private fun generateSyntheticInternalConstructor() {
val constrDesc = KSerializerDescriptorResolver.createLoadConstructorDescriptor(serializableDescriptor, bindingContext) val serializerDescriptor = serializableDescriptor.classSerializer?.toClassDescriptor ?: return
generateInternalConstructor(constrDesc) if (SerializerCodegen.getSyntheticLoadMember(serializerDescriptor) != null) {
val constrDesc = KSerializerDescriptorResolver.createLoadConstructorDescriptor(serializableDescriptor, bindingContext)
generateInternalConstructor(constrDesc)
}
} }
private fun generateSyntheticMethods() { private fun generateSyntheticMethods() {
val func = KSerializerDescriptorResolver.createWriteSelfFunctionDescriptor(serializableDescriptor) val serializerDescriptor = serializableDescriptor.classSerializer?.toClassDescriptor ?: return
generateWriteSelfMethod(func) if (SerializerCodegen.getSyntheticSaveMember(serializerDescriptor) != null) {
val func = KSerializerDescriptorResolver.createWriteSelfFunctionDescriptor(serializableDescriptor)
generateWriteSelfMethod(func)
}
} }
protected abstract fun generateInternalConstructor(constructorDescriptor: ClassConstructorDescriptor) protected abstract fun generateInternalConstructor(constructorDescriptor: ClassConstructorDescriptor)
@@ -110,22 +110,14 @@ abstract class SerializerCodegen(
} }
private fun generateSaveIfNeeded(): Boolean { private fun generateSaveIfNeeded(): Boolean {
val function = getMemberToGenerate( val function = getSyntheticSaveMember(serializerDescriptor) ?: return false
serializerDescriptor, SerialEntityNames.SAVE,
serializerDescriptor::checkSaveMethodResult, serializerDescriptor::checkSaveMethodParameters
)
?: return false
checkSerializability() checkSerializability()
generateSave(function) generateSave(function)
return true return true
} }
private fun generateLoadIfNeeded(): Boolean { private fun generateLoadIfNeeded(): Boolean {
val function = getMemberToGenerate( val function = getSyntheticLoadMember(serializerDescriptor) ?: return false
serializerDescriptor, SerialEntityNames.LOAD,
serializerDescriptor::checkLoadMethodResult, serializerDescriptor::checkLoadMethodParameters
)
?: return false
checkSerializability() checkSerializability()
generateLoad(function) generateLoad(function)
return true return true
@@ -160,4 +152,16 @@ abstract class SerializerCodegen(
protected fun ClassDescriptor.getFuncDesc(funcName: String): Sequence<FunctionDescriptor> = protected fun ClassDescriptor.getFuncDesc(funcName: String): Sequence<FunctionDescriptor> =
unsubstitutedMemberScope.getDescriptorsFiltered { it == Name.identifier(funcName) }.asSequence().filterIsInstance<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
)
}
} }