diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/SerializableCodegen.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/SerializableCodegen.kt index a49ba347772..f6f77a32bb3 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/SerializableCodegen.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/common/SerializableCodegen.kt @@ -54,5 +54,7 @@ abstract class SerializableCodegen( protected abstract fun generateInternalConstructor(constructorDescriptor: ClassConstructorDescriptor) - protected abstract fun generateWriteSelfMethod(methodDescriptor: FunctionDescriptor) + protected open fun generateWriteSelfMethod(methodDescriptor: FunctionDescriptor) { + + } } \ No newline at end of file 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 ad3e2dd561f..ef2f3becf2d 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 @@ -13,6 +13,8 @@ import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.IrValueParameter import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin +import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.TypeTranslator diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/js/SerializableJsTranslator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/js/SerializableJsTranslator.kt index f9cf493f20f..6f0bd173d63 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/js/SerializableJsTranslator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/js/SerializableJsTranslator.kt @@ -20,8 +20,8 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.codegen.CompilationException import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.js.backend.ast.* import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi import org.jetbrains.kotlin.js.translate.context.Namer diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/SerializableCodegenImpl.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/SerializableCodegenImpl.kt index 727b265ef33..5cd0a449fb5 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/SerializableCodegenImpl.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/SerializableCodegenImpl.kt @@ -109,7 +109,7 @@ class SerializableCodegenImpl( } val superSignature = classCodegen.typeMapper.mapSignatureSkipGeneric(KSerializerDescriptorResolver.createWriteSelfFunctionDescriptor(superClass)) - invokespecial( + invokestatic( classCodegen.typeMapper.mapType(superClass).internalName, superSignature.asmMethod.name, superSignature.asmMethod.descriptor, @@ -242,8 +242,9 @@ class SerializableCodegenImpl( load(0, thisAsmType) if (!superClass.isInternalSerializable) { - require(superClass.constructors.firstOrNull { it.valueParameters.isEmpty() } != null, - { "Non-serializable parent of serializable $serializableDescriptor must have no arg constructor" }) + require(superClass.constructors.firstOrNull { it.valueParameters.isEmpty() } != null) { + "Non-serializable parent of serializable $serializableDescriptor must have no arg constructor" + } // call // Sealed classes have private so they cannot be inherited from Java src diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/SerializableCompanionCodegenImpl.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/SerializableCompanionCodegenImpl.kt index f47bc9283ba..ab73ff9bdfc 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/SerializableCompanionCodegenImpl.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/jvm/SerializableCompanionCodegenImpl.kt @@ -20,13 +20,10 @@ import org.jetbrains.kotlin.codegen.ImplementationBodyCodegen import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlinx.serialization.compiler.backend.common.SerializableCompanionCodegen -import org.jetbrains.kotlinx.serialization.compiler.resolve.classSerializer -import org.jetbrains.kotlinx.serialization.compiler.resolve.getSerializableClassDescriptorByCompanion -import org.jetbrains.kotlinx.serialization.compiler.resolve.shouldHaveGeneratedMethodsInCompanion -import org.jetbrains.kotlinx.serialization.compiler.resolve.toClassDescriptor +import org.jetbrains.kotlinx.serialization.compiler.resolve.* -class SerializableCompanionCodegenImpl(private val codegen: ImplementationBodyCodegen) : - SerializableCompanionCodegen(codegen.descriptor, codegen.bindingContext) { +class SerializableCompanionCodegenImpl(private val classCodegen: ImplementationBodyCodegen) : + SerializableCompanionCodegen(classCodegen.descriptor, classCodegen.bindingContext) { companion object { fun generateSerializableExtensions(codegen: ImplementationBodyCodegen) { @@ -38,8 +35,15 @@ class SerializableCompanionCodegenImpl(private val codegen: ImplementationBodyCo override fun generateSerializerGetter(methodDescriptor: FunctionDescriptor) { val serial = serializableDescriptor.classSerializer?.toClassDescriptor ?: return - codegen.generateMethod(methodDescriptor) { _, _ -> - stackValueSerializerInstance(codegen, serializableDescriptor.module, serializableDescriptor.defaultType, serial, this, null) { + classCodegen.generateMethod(methodDescriptor) { _, _ -> + stackValueSerializerInstance( + classCodegen, + serializableDescriptor.module, + serializableDescriptor.defaultType, + serial, + this, + null + ) { load(it + 1, kSerializerType) } areturn(kSerializerType) 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 89d3115d4dc..434b66dfd26 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 @@ -228,7 +228,7 @@ class SerializerCodegenImpl( ) store(outputVar, kOutputType) if (serializableDescriptor.isInternalSerializable) { - val sig = StringBuilder("(${kOutputType.descriptor}${descType.descriptor}") + val sig = StringBuilder("(${objType.descriptor}${kOutputType.descriptor}${descType.descriptor}") // call obj.write$Self(output, classDesc) load(objVar, objType) load(outputVar, kOutputType) @@ -239,7 +239,7 @@ class SerializerCodegenImpl( sig.append(kSerializerType.descriptor) } sig.append(")V") - invokevirtual( + invokestatic( objType.internalName, SerialEntityNames.WRITE_SELF_NAME.asString(), sig.toString(), false ) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt index abd77ea2a90..5488cc44327 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/resolve/KSerializerDescriptorResolver.kt @@ -18,13 +18,17 @@ package org.jetbrains.kotlinx.serialization.compiler.resolve import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.* import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.synthetics.SyntheticClassOrObjectDescriptor import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns +import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.lazy.LazyClassContext import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor @@ -424,9 +428,18 @@ object KSerializerDescriptorResolver { else this.makeNullable() fun createWriteSelfFunctionDescriptor(thisClass: ClassDescriptor): FunctionDescriptor { + val jvmStaticClass = thisClass.module.findClassAcrossModuleDependencies( + ClassId( + FqName("kotlin.jvm"), + Name.identifier("JvmStatic") + ) + )!! + val jvmStaticAnnotation = AnnotationDescriptorImpl(jvmStaticClass.defaultType, mapOf(), jvmStaticClass.source) + val annotations = Annotations.create(listOf(jvmStaticAnnotation)) + val f = SimpleFunctionDescriptorImpl.create( thisClass, - Annotations.EMPTY, + annotations, SerialEntityNames.WRITE_SELF_NAME, CallableMemberDescriptor.Kind.SYNTHESIZED, thisClass.source @@ -435,6 +448,15 @@ object KSerializerDescriptorResolver { val args = mutableListOf() var i = 0 + // object + args.add( + ValueParameterDescriptorImpl( + f, null, i++, Annotations.EMPTY, Name.identifier("self"), thisClass.defaultType, false, + false, false, null, f.source + ) + ) + + // encoder args.add( ValueParameterDescriptorImpl( f, @@ -451,6 +473,7 @@ object KSerializerDescriptorResolver { ) ) + //descriptor args.add( ValueParameterDescriptorImpl( f, @@ -469,6 +492,7 @@ object KSerializerDescriptorResolver { val kSerialClassDesc = thisClass.getClassFromSerializationPackage(SerialEntityNames.KSERIALIZER_CLASS) + // type parameters serialziers thisClass.declaredTypeParameters.forEach { val typeArgument = TypeProjectionImpl(it.defaultType) val kSerialClass = KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, kSerialClassDesc, listOf(typeArgument)) @@ -497,7 +521,7 @@ object KSerializerDescriptorResolver { emptyList(), args, returnType, - Modality.OPEN, + Modality.FINAL, Visibilities.PUBLIC )