Correctly reference deserialization constructor added by plugin

Fixes https://github.com/Kotlin/kotlinx.serialization/issues/472
This commit is contained in:
Leonid Startsev
2019-06-03 17:21:05 +03:00
parent 43cb17cdd5
commit 6370f0b3be
3 changed files with 4 additions and 4 deletions
@@ -579,6 +579,6 @@ interface IrBuilderExtension {
} }
} }
fun IrClass.serializableSyntheticConstructor(): IrConstructorSymbol = fun ReferenceSymbolTable.serializableSyntheticConstructor(forClass: ClassDescriptor): IrConstructorSymbol =
this.constructors.single { it.descriptor.isSerializationCtor() }.symbol referenceConstructor(forClass.constructors.single { it.isSerializationCtor() })
} }
@@ -127,7 +127,7 @@ class SerializableIrGenerator(
propertiesStart: Int propertiesStart: Int
): Int { ): Int {
check(superClass.isInternalSerializable) check(superClass.isInternalSerializable)
val superCtorRef = compilerContext.externalSymbols.referenceClass(superClass).owner.serializableSyntheticConstructor() val superCtorRef = compilerContext.externalSymbols.serializableSyntheticConstructor(superClass)
val superProperties = SerializableProperties(superClass, bindingContext).serializableProperties val superProperties = SerializableProperties(superClass, bindingContext).serializableProperties
val superSlots = superProperties.bitMaskSlotCount() val superSlots = superProperties.bitMaskSlotCount()
val arguments = allValueParameters.subList(0, superSlots) + val arguments = allValueParameters.subList(0, superSlots) +
@@ -431,7 +431,7 @@ class SerializerIrGenerator(val irClass: IrClass, override val compilerContext:
val typeArgs = (loadFunc.returnType as IrSimpleType).arguments.map { (it as IrTypeProjection).type } val typeArgs = (loadFunc.returnType as IrSimpleType).arguments.map { (it as IrTypeProjection).type }
val ctor: IrConstructorSymbol = if (serializableDescriptor.isInternalSerializable) { val ctor: IrConstructorSymbol = if (serializableDescriptor.isInternalSerializable) {
args = bitMasks.map { irGet(it) } + args + irNull() args = bitMasks.map { irGet(it) } + args + irNull()
serializableIrClass.serializableSyntheticConstructor() compilerContext.externalSymbols.serializableSyntheticConstructor(serializableDescriptor)
} else { } else {
compilerContext.externalSymbols.referenceConstructor(serializableDescriptor.unsubstitutedPrimaryConstructor!!) compilerContext.externalSymbols.referenceConstructor(serializableDescriptor.unsubstitutedPrimaryConstructor!!)
} }