From 566e5ce6037726448266bca6c9caa6c3304b6a9e Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Fri, 20 Jul 2018 19:10:19 +0300 Subject: [PATCH] Updates for new API --- .../tools/kotlin-serialization/build.gradle | 2 +- .../gradle/SerializationSubplugin.kt | 2 +- .../backend/common/SerializerCodegen.kt | 41 ++++++++++++++----- .../backend/ir/SerializerIrGenerator.kt | 8 ++-- .../backend/js/SerializerJsTranslator.kt | 26 +++++------- .../compiler/backend/jvm/JVMCodegenUtil.kt | 6 ++- .../backend/jvm/SerializerCodegenImpl.kt | 8 ++-- .../compiler/resolve/KSerializationUtil.kt | 2 +- .../compiler/resolve/NamingConventions.kt | 10 ++--- 9 files changed, 62 insertions(+), 43 deletions(-) diff --git a/libraries/tools/kotlin-serialization/build.gradle b/libraries/tools/kotlin-serialization/build.gradle index 2830b56a11a..e6c7254d259 100644 --- a/libraries/tools/kotlin-serialization/build.gradle +++ b/libraries/tools/kotlin-serialization/build.gradle @@ -8,7 +8,7 @@ configureJvmProject(project) configurePublishing(project) group = 'org.jetbrains.kotlinx' -version = '0.5.2' +version = '0.6.2' if (!project.hasProperty("deploy")) { version = "$version-SNAPSHOT" } diff --git a/libraries/tools/kotlin-serialization/src/main/kotlin/org/jetbrains/kotlinx/serialization/gradle/SerializationSubplugin.kt b/libraries/tools/kotlin-serialization/src/main/kotlin/org/jetbrains/kotlinx/serialization/gradle/SerializationSubplugin.kt index a74770fd791..502bd205444 100644 --- a/libraries/tools/kotlin-serialization/src/main/kotlin/org/jetbrains/kotlinx/serialization/gradle/SerializationSubplugin.kt +++ b/libraries/tools/kotlin-serialization/src/main/kotlin/org/jetbrains/kotlinx/serialization/gradle/SerializationSubplugin.kt @@ -45,7 +45,7 @@ class SerializationKotlinGradleSubplugin : KotlinGradleSubplugin Boolean - ): PropertyDescriptor? = - classDescriptor.unsubstitutedMemberScope.getContributedVariables(Name.identifier(name), NoLookupLocation.FROM_BACKEND) - .singleOrNull { property -> - property.kind.let { kind -> kind == CallableMemberDescriptor.Kind.SYNTHESIZED || kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE } && - property.modality != Modality.FINAL && - property.returnType != null && - isReturnTypeOk(property) - } + ): PropertyDescriptor? = getProperty( + classDescriptor, + name, + isReturnTypeOk + ) { kind -> + kind == CallableMemberDescriptor.Kind.SYNTHESIZED || kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE + } + + fun getProperty( + classDescriptor: ClassDescriptor, + name: String, + isReturnTypeOk: (PropertyDescriptor) -> Boolean, + isKindOk: (CallableMemberDescriptor.Kind) -> Boolean + ): PropertyDescriptor? = classDescriptor.unsubstitutedMemberScope.getContributedVariables( + Name.identifier(name), + NoLookupLocation.FROM_BACKEND + ) + .singleOrNull { property -> + isKindOk(property.kind) && + property.modality != Modality.FINAL && + property.returnType != null && + isReturnTypeOk(property) + } protected fun ClassDescriptor.getFuncDesc(funcName: String): Sequence = unsubstitutedMemberScope.getDescriptorsFiltered { it == Name.identifier(funcName) }.asSequence().filterIsInstance() 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 12c3779d82f..656c8f5f1f9 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 @@ -49,7 +49,7 @@ class SerializerIrGenerator(val irClass: IrClass, override val compilerContext: override val translator: TypeTranslator = TypeTranslator(compilerContext.symbolTable) override fun generateSerialDesc() { - val desc: PropertyDescriptor = serialDescPropertyDescriptor ?: return + val desc: PropertyDescriptor = generatedSerialDescPropertyDescriptor ?: return val serialDescImplClass = serializerDescriptor .getClassFromInternalSerializationPackage(SERIAL_DESCRIPTOR_CLASS_IMPL) val serialDescImplConstructor = serialDescImplClass @@ -97,7 +97,7 @@ class SerializerIrGenerator(val irClass: IrClass, override val compilerContext: +irSetField( generateReceiverExpressionForFieldAccess( thisAsReceiverParameter.symbol, - serialDescPropertyDescriptor + generatedSerialDescPropertyDescriptor ), prop.backingField!!, irGet(localDesc) @@ -168,7 +168,7 @@ class SerializerIrGenerator(val irClass: IrClass, override val compilerContext: val kOutputClass = serializerDescriptor.getClassFromSerializationPackage(STRUCTURE_ENCODER_CLASS) - val descriptorGetterSymbol = compilerContext.symbolTable.referenceFunction(serialDescPropertyDescriptor?.getter!!) + val descriptorGetterSymbol = compilerContext.symbolTable.referenceFunction(anySerialDescProperty?.getter!!) val localSerialDesc = irTemporary(irGet(descriptorGetterSymbol.owner.returnType, irThis(), descriptorGetterSymbol), "desc") @@ -256,7 +256,7 @@ class SerializerIrGenerator(val irClass: IrClass, override val compilerContext: fun IrVariable.get() = irGet(this) val inputClass = serializerDescriptor.getClassFromSerializationPackage(STRUCTURE_DECODER_CLASS) - val descriptorGetterSymbol = compilerContext.symbolTable.referenceFunction(serialDescPropertyDescriptor?.getter!!) + val descriptorGetterSymbol = compilerContext.symbolTable.referenceFunction(anySerialDescProperty?.getter!!) val localSerialDesc = irTemporary(irGet(descriptorGetterSymbol.owner.returnType, irThis(), descriptorGetterSymbol), "desc") // workaround due to unavailability of labels (KT-25386) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/js/SerializerJsTranslator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/js/SerializerJsTranslator.kt index 1f716a0c60e..9cc3b2b07b7 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/js/SerializerJsTranslator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/js/SerializerJsTranslator.kt @@ -27,10 +27,8 @@ import org.jetbrains.kotlin.js.translate.declaration.DefaultPropertyTranslator import org.jetbrains.kotlin.js.translate.general.Translation import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.TranslationUtils -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtPureClassOrObject import org.jetbrains.kotlin.resolve.descriptorUtil.classId -import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.builtIns import org.jetbrains.kotlinx.serialization.compiler.backend.common.SerializerCodegen @@ -41,7 +39,6 @@ import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.enumSerializerId import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.referenceArraySerializerId import org.jetbrains.kotlinx.serialization.compiler.resolve.* import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.SERIAL_DESCRIPTOR_CLASS_IMPL -import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.STRUCTURE_ENCODER_CLASS import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.typeArgPrefix class SerializerJsTranslator(declaration: KtPureClassOrObject, @@ -55,7 +52,7 @@ class SerializerJsTranslator(declaration: KtPureClassOrObject, override fun generateSerialDesc() { - val desc = serialDescPropertyDescriptor ?: return + val desc = generatedSerialDescPropertyDescriptor ?: return val serialDescImplClass = serializerDescriptor .getClassFromInternalSerializationPackage(SERIAL_DESCRIPTOR_CLASS_IMPL) val serialDescImplConstructor = serialDescImplClass @@ -70,7 +67,7 @@ class SerializerJsTranslator(declaration: KtPureClassOrObject, val addFunc = serialDescImplClass.getFuncDesc(CallingConventions.addElement).single() val pushFunc = serialDescImplClass.getFuncDesc(CallingConventions.addAnnotation).single() val pushClassFunc = serialDescImplClass.getFuncDesc(CallingConventions.addClassAnnotation).single() - val serialClassDescRef = JsNameRef(context.getNameForDescriptor(serialDescPropertyDescriptor), JsThisRef()) + val serialClassDescRef = JsNameRef(context.getNameForDescriptor(generatedSerialDescPropertyDescriptor), JsThisRef()) for (prop in orderedProperties) { if (prop.transient) continue @@ -96,7 +93,7 @@ class SerializerJsTranslator(declaration: KtPureClassOrObject, } override fun generateSerializableClassProperty(property: PropertyDescriptor) { - val propDesc = serialDescPropertyDescriptor ?: return + val propDesc = generatedSerialDescPropertyDescriptor ?: return val propTranslator = DefaultPropertyTranslator(propDesc, context, translator.getBackingFieldReference(propDesc)) val getterDesc = propDesc.getter!! @@ -122,10 +119,11 @@ class SerializerJsTranslator(declaration: KtPureClassOrObject, } override fun generateSave(function: FunctionDescriptor) = generateFunction(function) { jsFun, ctx -> + val encoderClass = serializerDescriptor.getClassFromSerializationPackage(SerialEntityNames.ENCODER_CLASS) val kOutputClass = serializerDescriptor.getClassFromSerializationPackage(SerialEntityNames.STRUCTURE_ENCODER_CLASS) val wBeginFunc = ctx.getNameForDescriptor( - kOutputClass.getFuncDesc(CallingConventions.begin).single { it.valueParameters.size == 2 }) - val serialClassDescRef = JsNameRef(context.getNameForDescriptor(serialDescPropertyDescriptor!!), JsThisRef()) + encoderClass.getFuncDesc(CallingConventions.begin).single { it.valueParameters.size == 2 }) + val serialClassDescRef = JsNameRef(context.getNameForDescriptor(anySerialDescProperty!!), JsThisRef()) // output.writeBegin(desc, []) val typeParams = serializableDescriptor.declaredTypeParameters.mapIndexed { idx, _ -> @@ -212,7 +210,8 @@ class SerializerJsTranslator(declaration: KtPureClassOrObject, override fun generateLoad(function: FunctionDescriptor) = generateFunction(function) { jsFun, context -> val inputClass = serializerDescriptor.getClassFromSerializationPackage(SerialEntityNames.STRUCTURE_DECODER_CLASS) - val serialClassDescRef = JsNameRef(context.getNameForDescriptor(serialDescPropertyDescriptor!!), JsThisRef()) + val decoderClass = serializerDescriptor.getClassFromSerializationPackage(SerialEntityNames.DECODER_CLASS) + val serialClassDescRef = JsNameRef(context.getNameForDescriptor(anySerialDescProperty!!), JsThisRef()) // var index = -1, readAll = false val indexVar = JsNameRef(jsFun.scope.declareFreshName("index")) @@ -236,7 +235,7 @@ class SerializerJsTranslator(declaration: KtPureClassOrObject, JsNameRef(context.scope().declareName("$typeArgPrefix$idx"), JsThisRef()) } val inputVar = JsNameRef(jsFun.scope.declareFreshName("input")) - val readBeginF = inputClass.getFuncDesc(CallingConventions.begin).single() + val readBeginF = decoderClass.getFuncDesc(CallingConventions.begin).single() val call = JsInvocation(JsNameRef(context.getNameForDescriptor(readBeginF), JsNameRef(jsFun.parameters[0].name)), serialClassDescRef, JsArrayLiteral(typeParams)) +JsVars(JsVars.JsVar(inputVar.name, call)) @@ -312,12 +311,7 @@ class SerializerJsTranslator(declaration: KtPureClassOrObject, } // char unboxing crutch if (KotlinBuiltIns.isCharOrNullableChar(property.type)) { - // can't use KotlinCompilerVersion.VERSION because javac inlines final string literal :( - val coerceTo = if (KotlinVersion.CURRENT.run { major == 1 && minor == 2 && patch in (0..10) }) { - context.currentModule.builtIns.charType - } else { - TranslationUtils.getReturnTypeForCoercion(property.descriptor) - } + val coerceTo = TranslationUtils.getReturnTypeForCoercion(property.descriptor) +JsAstUtils.assignment( localProps[i], TranslationUtils.coerce(context, localProps[i], coerceTo) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/JVMCodegenUtil.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/JVMCodegenUtil.kt index ee1866f0985..8c1df316702 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/JVMCodegenUtil.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/JVMCodegenUtil.kt @@ -30,6 +30,8 @@ import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlinx.serialization.compiler.backend.common.SerialTypeInfo import org.jetbrains.kotlinx.serialization.compiler.backend.common.findTypeSerializer import org.jetbrains.kotlinx.serialization.compiler.resolve.* +import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.DECODER_CLASS +import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.ENCODER_CLASS import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.KSERIALIZER_CLASS import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.MISSING_FIELD_EXC import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.SERIAL_CTOR_MARKER_NAME @@ -51,6 +53,8 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter internal val descType = Type.getObjectType("kotlinx/serialization/$SERIAL_DESCRIPTOR_CLASS") internal val descImplType = Type.getObjectType("kotlinx/serialization/internal/$SERIAL_DESCRIPTOR_CLASS_IMPL") internal val kOutputType = Type.getObjectType("kotlinx/serialization/$STRUCTURE_ENCODER_CLASS") +internal val encoderType = Type.getObjectType("kotlinx/serialization/$ENCODER_CLASS") +internal val decoderType = Type.getObjectType("kotlinx/serialization/$DECODER_CLASS") internal val kInputType = Type.getObjectType("kotlinx/serialization/$STRUCTURE_DECODER_CLASS") @@ -198,7 +202,7 @@ internal fun stackValueSerializerInstance(codegen: ClassBodyCodegen, module: Mod assert(stackValueSerializerInstance(codegen, module, argType, argSerializer, this, argType.genericIndex, genericSerializerFieldGetter)) // wrap into nullable serializer if argType is nullable if (argType.isMarkedNullable) { - invokestatic("kotlinx/serialization/internal/BuiltinSerializersKt", "makeNullable", // todo: extract? + invokestatic("kotlinx/serialization/internal/NullableSerializerKt", "makeNullable", // todo: extract? "(" + kSerializerType.descriptor + ")" + kSerializerType.descriptor, false) } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/SerializerCodegenImpl.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/SerializerCodegenImpl.kt index 6200b5ba92b..c91348f3849 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/SerializerCodegenImpl.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/SerializerCodegenImpl.kt @@ -160,11 +160,11 @@ class SerializerCodegenImpl( serialCLassDescToLocalVar(descVar) val objType = signature.valueParameters[1].asmType // output = output.writeBegin(classDesc, new KSerializer[0]) - load(outputVar, kOutputType) + load(outputVar, encoderType) load(descVar, descType) genArrayOfTypeParametersSerializers() invokeinterface( - kOutputType.internalName, CallingConventions.begin, + encoderType.internalName, CallingConventions.begin, "(" + descType.descriptor + kSerializerArrayType.descriptor + ")" + kOutputType.descriptor) store(outputVar, kOutputType) @@ -253,11 +253,11 @@ class SerializerCodegenImpl( propVar += propertyType.size } // input = input.readBegin(classDesc, new KSerializer[0]) - load(inputVar, kInputType) + load(inputVar, decoderType) load(descVar, descType) genArrayOfTypeParametersSerializers() invokeinterface( - kInputType.internalName, CallingConventions.begin, + decoderType.internalName, CallingConventions.begin, "(" + descType.descriptor + kSerializerArrayType.descriptor + ")" + kInputType.descriptor) store(inputVar, kInputType) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializationUtil.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializationUtil.kt index c95f0cd751d..a6186fae555 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializationUtil.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializationUtil.kt @@ -148,7 +148,7 @@ fun getSerializableClassDescriptorBySerializer(serializerDescriptor: ClassDescri } fun ClassDescriptor.checkSerializableClassPropertyResult(prop: PropertyDescriptor): Boolean = - prop.returnType!!.isSubtypeOf(getClassFromSerializationPackage("SerialDescriptor").toSimpleType(false)) // todo: cache lookup + prop.returnType!!.isSubtypeOf(getClassFromSerializationPackage(SerialEntityNames.SERIAL_DESCRIPTOR_CLASS).toSimpleType(false)) // todo: cache lookup // todo: serialization: do an actual check better that just number of parameters fun ClassDescriptor.checkSaveMethodParameters(parameters: List): Boolean = diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt index 4207367536f..b488fff0734 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/NamingConventions.kt @@ -33,12 +33,12 @@ object SerialEntityNames { val IMPL_NAME = Name.identifier("Impl") const val ENCODER_CLASS = "Encoder" - const val STRUCTURE_ENCODER_CLASS = "StructureEncoder" + const val STRUCTURE_ENCODER_CLASS = "CompositeEncoder" const val DECODER_CLASS = "Decoder" - const val STRUCTURE_DECODER_CLASS = "StructureDecoder" + const val STRUCTURE_DECODER_CLASS = "CompositeDecoder" const val SERIAL_SAVER_CLASS = "SerializationStrategy" - const val SERIAL_LOADER_CLASS = "SerializationStrategy" + const val SERIAL_LOADER_CLASS = "DeserializationStrategy" const val SERIAL_DESCRIPTOR_CLASS = "SerialDescriptor" const val SERIAL_DESCRIPTOR_CLASS_IMPL = "SerialClassDescImpl" @@ -75,8 +75,8 @@ object CallingConventions { const val decode = "decode" const val update = "update" const val encode = "encode" - const val decodeElementIndex = "decodeElement" - const val elementPostfix = "ElementValue" + const val decodeElementIndex = "decodeElementIndex" + const val elementPostfix = "Element" const val addElement = "addElement" const val addAnnotation = "pushAnnotation"