[IR, Serialization] Support kotlinx-based (de)serialization of MFVC, nullable MFVC value assignment to nonnull variable

Signed-off-by: Evgeniy.Zhelenskiy <Evgeniy.Zhelenskiy@jetbrains.com>

#KT-1179
This commit is contained in:
Evgeniy.Zhelenskiy
2022-12-13 17:08:35 +01:00
parent 561df74419
commit f6c63c6e4f
9 changed files with 118 additions and 15 deletions
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.ir.builders.declarations.addFunction
import org.jetbrains.kotlin.ir.builders.declarations.addTypeParameter
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.isSingleFieldValueClass
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.companionObject
import org.jetbrains.kotlin.name.Name
@@ -102,7 +103,7 @@ class IrPreGenerator(
if (irClass.hasCompanionObjectAsSerializer && irClass.companionObject()
?.findPluginGeneratedMethod(SerialEntityNames.LOAD, compilerContext.afterK2) == null
) return
if (irClass.isValue) return
if (irClass.isSingleFieldValueClass) return
if (irClass.findSerializableSyntheticConstructor() != null) return
val ctor = irClass.addConstructor {
origin = SERIALIZATION_PLUGIN_ORIGIN
@@ -121,7 +122,7 @@ class IrPreGenerator(
ctor.addValueParameter(prop.name, prop.type.makeNullableIfNotPrimitive(), SERIALIZATION_PLUGIN_ORIGIN)
}
ctor.addValueParameter(SerialEntityNames.dummyParamName, markerClassSymbol.defaultType, SERIALIZATION_PLUGIN_ORIGIN)
ctor.addValueParameter(SerialEntityNames.dummyParamName, markerClassSymbol.defaultType.makeNullable(), SERIALIZATION_PLUGIN_ORIGIN)
}
private fun IrType.makeNullableIfNotPrimitive() =
@@ -253,4 +253,4 @@ fun IrSimpleType.argumentTypesOrUpperBounds(): List<IrType> {
}
internal inline fun IrClass.shouldHaveSpecificSyntheticMethods(functionPresenceChecker: () -> IrSimpleFunction?) =
!isValue && (isAbstractOrSealedSerializableClass || functionPresenceChecker() != null)
!isSingleFieldValueClass && (isAbstractOrSealedSerializableClass || functionPresenceChecker() != null)
@@ -634,7 +634,7 @@ open class SerializerIrGenerator(
irClass,
context
)
serializableDesc.isValue -> SerializerForInlineClassGenerator(irClass, context)
serializableDesc.isSingleFieldValueClass -> SerializerForInlineClassGenerator(irClass, context)
else -> SerializerIrGenerator(irClass, context, metadataPlugin)
}
generator.generate()