Remove requirement on 'Serializable class must have single primary constructor'
#KT-38868 Fixed #KT-41627 Fixed Fixes https://github.com/Kotlin/kotlinx.serialization/issues/396 Fixes https://github.com/Kotlin/kotlinx.serialization/issues/1049
This commit is contained in:
+12
-5
@@ -442,12 +442,17 @@ interface IrBuilderExtension {
|
|||||||
|
|
||||||
fun IrBuilderWithScope.classReference(classType: KotlinType): IrClassReference = createClassReference(classType, startOffset, endOffset)
|
fun IrBuilderWithScope.classReference(classType: KotlinType): IrClassReference = createClassReference(classType, startOffset, endOffset)
|
||||||
|
|
||||||
fun buildInitializersRemapping(irClass: IrClass): (IrField) -> IrExpression? {
|
private fun extractDefaultValuesFromConstructor(irClass: IrClass?): Map<ParameterDescriptor, IrExpression?> {
|
||||||
|
if (irClass == null) return emptyMap()
|
||||||
val original = irClass.constructors.singleOrNull { it.isPrimary }
|
val original = irClass.constructors.singleOrNull { it.isPrimary }
|
||||||
?: throw IllegalStateException("Serializable class must have single primary constructor")
|
|
||||||
// default arguments of original constructor
|
// default arguments of original constructor
|
||||||
val defaultsMap: Map<ParameterDescriptor, IrExpression?> =
|
val defaultsMap: Map<ParameterDescriptor, IrExpression?> =
|
||||||
original.valueParameters.associate { it.descriptor to it.defaultValue?.expression }
|
original?.valueParameters?.associate { it.descriptor to it.defaultValue?.expression } ?: emptyMap()
|
||||||
|
return defaultsMap + extractDefaultValuesFromConstructor(irClass.getSuperClassNotAny())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun buildInitializersRemapping(irClass: IrClass): (IrField) -> IrExpression? {
|
||||||
|
val defaultsMap = extractDefaultValuesFromConstructor(irClass)
|
||||||
return fun(f: IrField): IrExpression? {
|
return fun(f: IrField): IrExpression? {
|
||||||
val i = f.initializer?.expression ?: return null
|
val i = f.initializer?.expression ?: return null
|
||||||
val irExpression =
|
val irExpression =
|
||||||
@@ -744,10 +749,12 @@ interface IrBuilderExtension {
|
|||||||
return forClass.declarations.filterIsInstance<IrConstructor>().single { it.isSerializationCtor() }.symbol
|
return forClass.declarations.filterIsInstance<IrConstructor>().single { it.isSerializationCtor() }.symbol
|
||||||
}
|
}
|
||||||
|
|
||||||
fun IrClass.getSuperClassOrAny(): IrClass {
|
fun IrClass.getSuperClassOrAny(): IrClass = getSuperClassNotAny() ?: compilerContext.irBuiltIns.anyClass.owner
|
||||||
|
|
||||||
|
fun IrClass.getSuperClassNotAny(): IrClass? {
|
||||||
val superClasses = superTypes.mapNotNull { it.classOrNull }.map { it.owner }
|
val superClasses = superTypes.mapNotNull { it.classOrNull }.map { it.owner }
|
||||||
|
|
||||||
return superClasses.singleOrNull { it.kind == ClassKind.CLASS } ?: compilerContext.irBuiltIns.anyClass.owner
|
return superClasses.singleOrNull { it.kind == ClassKind.CLASS }
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user