Don't generate writeSelf/internal constructor if corresponding serialize/deserialize aren't auto-generated
This commit is contained in:
+12
-4
@@ -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)
|
||||||
|
|||||||
+14
-10
@@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user