From 6370f0b3be9f97ebddbbb70753d826a1ed89e216 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Mon, 3 Jun 2019 17:21:05 +0300 Subject: [PATCH] Correctly reference deserialization constructor added by plugin Fixes https://github.com/Kotlin/kotlinx.serialization/issues/472 --- .../serialization/compiler/backend/ir/GeneratorHelpers.kt | 4 ++-- .../compiler/backend/ir/SerializableIrGenerator.kt | 2 +- .../compiler/backend/ir/SerializerIrGenerator.kt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt index fa45ebae57c..2636acb610b 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt @@ -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() }) } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt index 1869159bcd1..b70d443634f 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt @@ -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) + diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt index 3f26e7d25b9..437a07eb72c 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt @@ -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!!) }