Fix unresolved symbol to SerialDescriptor in KSerializer if it was

referenced from user custom serializer code (kotlinx.serialization/290)
This commit is contained in:
Leonid Startsev
2018-11-30 16:10:07 +03:00
parent 58c145210c
commit 7c8b34fe1c
3 changed files with 8 additions and 13 deletions
@@ -65,7 +65,8 @@ abstract class SerializerCodegen(
protected val generatedSerialDescPropertyDescriptor = getPropertyToGenerate(
serializerDescriptor, SerialEntityNames.SERIAL_DESC_FIELD,
serializerDescriptor::checkSerializableClassPropertyResult)
serializerDescriptor::checkSerializableClassPropertyResult
)
protected val anySerialDescProperty = getProperty(
serializerDescriptor, SerialEntityNames.SERIAL_DESC_FIELD,
serializerDescriptor::checkSerializableClassPropertyResult
@@ -192,11 +192,6 @@ interface IrBuilderExtension {
val SerializableProperty.irField: IrField get() = compilerContext.externalSymbols.referenceField(this.descriptor).owner
// get () {
// val symb = compilerContext.localSymbolTable.referenceField(this.descriptor)
// return if (symb.isBound) symb.owner
// else compilerContext.localSymbolTable.declareField()
// }
/*
The rest of the file is mainly copied from FunctionGenerator.
@@ -252,10 +247,10 @@ interface IrBuilderExtension {
fieldSymbol: IrFieldSymbol,
ownerSymbol: IrValueSymbol
): IrSimpleFunction {
return compilerContext.localSymbolTable.declareSimpleFunctionWithOverrides(
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
SERIALIZABLE_PLUGIN_ORIGIN, descriptor
).buildWithScope { irAccessor ->
// Declaration can also be called from user code. Since we lookup descriptor getter in externalSymbols
// (see generateSave/generateLoad), seems it is correct approach to declare getter lazily there.
val declaration = compilerContext.externalSymbols.referenceSimpleFunction(descriptor).owner
return declaration.buildWithScope { irAccessor ->
irAccessor.createParameterDeclarations((ownerSymbol as IrValueParameterSymbol).owner) // todo: neat this
irAccessor.returnType = irAccessor.descriptor.returnType!!.toIrType()
irAccessor.body = when (descriptor) {
@@ -264,7 +259,6 @@ interface IrBuilderExtension {
else -> throw AssertionError("Should be getter or setter: $descriptor")
}
}
}
private fun generateDefaultGetterBody(
@@ -167,7 +167,7 @@ class SerializerIrGenerator(val irClass: IrClass, override val compilerContext:
val kOutputClass = serializerDescriptor.getClassFromSerializationPackage(STRUCTURE_ENCODER_CLASS)
val kOutputSmallClass = serializerDescriptor.getClassFromSerializationPackage(ENCODER_CLASS)
val descriptorGetterSymbol = compilerContext.localSymbolTable.referenceFunction(anySerialDescProperty?.getter!!) //???
val descriptorGetterSymbol = compilerContext.externalSymbols.referenceFunction(anySerialDescProperty?.getter!!) //???
val localSerialDesc = irTemporary(irGet(descriptorGetterSymbol.owner.returnType, irThis(), descriptorGetterSymbol), "desc")
@@ -268,7 +268,7 @@ class SerializerIrGenerator(val irClass: IrClass, override val compilerContext:
val inputClass = serializerDescriptor.getClassFromSerializationPackage(STRUCTURE_DECODER_CLASS)
val inputSmallClass = serializerDescriptor.getClassFromSerializationPackage(DECODER_CLASS)
val descriptorGetterSymbol = compilerContext.localSymbolTable.referenceFunction(anySerialDescProperty?.getter!!) //???
val descriptorGetterSymbol = compilerContext.externalSymbols.referenceFunction(anySerialDescProperty?.getter!!) //???
val localSerialDesc = irTemporary(irGet(descriptorGetterSymbol.owner.returnType, irThis(), descriptorGetterSymbol), "desc")
// workaround due to unavailability of labels (KT-25386)