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 =
this.constructors.single { it.descriptor.isSerializationCtor() }.symbol
fun ReferenceSymbolTable.serializableSyntheticConstructor(forClass: ClassDescriptor): IrConstructorSymbol =
referenceConstructor(forClass.constructors.single { it.isSerializationCtor() })
}
@@ -127,7 +127,7 @@ class SerializableIrGenerator(
propertiesStart: Int
): Int {
check(superClass.isInternalSerializable)
val superCtorRef = compilerContext.externalSymbols.referenceClass(superClass).owner.serializableSyntheticConstructor()
val superCtorRef = compilerContext.externalSymbols.serializableSyntheticConstructor(superClass)
val superProperties = SerializableProperties(superClass, bindingContext).serializableProperties
val superSlots = superProperties.bitMaskSlotCount()
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 ctor: IrConstructorSymbol = if (serializableDescriptor.isInternalSerializable) {
args = bitMasks.map { irGet(it) } + args + irNull()
serializableIrClass.serializableSyntheticConstructor()
compilerContext.externalSymbols.serializableSyntheticConstructor(serializableDescriptor)
} else {
compilerContext.externalSymbols.referenceConstructor(serializableDescriptor.unsubstitutedPrimaryConstructor!!)
}