Remove old JVM backend implementation of Parcelize

There's no way for the end user to use this implementation anymore,
since old JVM backend cannot be enabled, and nothing else from Kotlin
depends on it.
This commit is contained in:
Alexander Udalov
2023-03-06 16:26:46 +01:00
parent f4b4922a13
commit 163a052f98
21 changed files with 18 additions and 1324 deletions
@@ -14,19 +14,21 @@ import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBoxTest
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBytecodeShapeTest import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidBytecodeShapeTest
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidIrBoxTest import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidIrBoxTest
import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidSyntheticPropertyDescriptorTest import org.jetbrains.kotlin.android.synthetic.test.AbstractAndroidSyntheticPropertyDescriptorTest
import org.jetbrains.kotlin.assignment.plugin.AbstractIrBlackBoxCodegenTestAssignmentPlugin
import org.jetbrains.kotlin.assignment.plugin.AbstractAssignmentPluginDiagnosticTest import org.jetbrains.kotlin.assignment.plugin.AbstractAssignmentPluginDiagnosticTest
import org.jetbrains.kotlin.assignment.plugin.AbstractFirLightTreeBlackBoxCodegenTestForAssignmentPlugin import org.jetbrains.kotlin.assignment.plugin.AbstractFirLightTreeBlackBoxCodegenTestForAssignmentPlugin
import org.jetbrains.kotlin.assignment.plugin.AbstractFirPsiAssignmentPluginDiagnosticTest import org.jetbrains.kotlin.assignment.plugin.AbstractFirPsiAssignmentPluginDiagnosticTest
import org.jetbrains.kotlin.assignment.plugin.AbstractIrBlackBoxCodegenTestAssignmentPlugin
import org.jetbrains.kotlin.fir.plugin.runners.AbstractFirLightTreePluginBlackBoxCodegenTest import org.jetbrains.kotlin.fir.plugin.runners.AbstractFirLightTreePluginBlackBoxCodegenTest
import org.jetbrains.kotlin.fir.plugin.runners.AbstractFirPsiPluginDiagnosticTest import org.jetbrains.kotlin.fir.plugin.runners.AbstractFirPsiPluginDiagnosticTest
import org.jetbrains.kotlin.generators.generateTestGroupSuiteWithJUnit5 import org.jetbrains.kotlin.generators.generateTestGroupSuiteWithJUnit5
import org.jetbrains.kotlin.generators.impl.generateTestGroupSuite import org.jetbrains.kotlin.generators.impl.generateTestGroupSuite
import org.jetbrains.kotlin.generators.model.annotation import org.jetbrains.kotlin.generators.model.annotation
import org.jetbrains.kotlin.generators.tests.IncrementalTestsGeneratorUtil.Companion.IcTestTypes.* import org.jetbrains.kotlin.generators.tests.IncrementalTestsGeneratorUtil.Companion.IcTestTypes.PURE_KOTLIN
import org.jetbrains.kotlin.generators.tests.IncrementalTestsGeneratorUtil.Companion.incrementalJvmTestData import org.jetbrains.kotlin.generators.tests.IncrementalTestsGeneratorUtil.Companion.incrementalJvmTestData
import org.jetbrains.kotlin.incremental.* import org.jetbrains.kotlin.incremental.*
import org.jetbrains.kotlin.jvm.abi.* import org.jetbrains.kotlin.jvm.abi.AbstractCompareJvmAbiTest
import org.jetbrains.kotlin.jvm.abi.AbstractCompileAgainstJvmAbiTest
import org.jetbrains.kotlin.jvm.abi.AbstractJvmAbiContentTest
import org.jetbrains.kotlin.kapt.cli.test.AbstractArgumentParsingTest import org.jetbrains.kotlin.kapt.cli.test.AbstractArgumentParsingTest
import org.jetbrains.kotlin.kapt.cli.test.AbstractKaptToolIntegrationTest import org.jetbrains.kotlin.kapt.cli.test.AbstractKaptToolIntegrationTest
import org.jetbrains.kotlin.kapt3.test.runners.AbstractClassFileToSourceStubConverterTest import org.jetbrains.kotlin.kapt3.test.runners.AbstractClassFileToSourceStubConverterTest
@@ -200,10 +202,6 @@ fun main(args: Array<String>) {
val excludedFirTestdataPattern = "^(.+)\\.fir\\.kts?\$" val excludedFirTestdataPattern = "^(.+)\\.fir\\.kts?\$"
testGroup("plugins/parcelize/parcelize-compiler/tests-gen", "plugins/parcelize/parcelize-compiler/testData") { testGroup("plugins/parcelize/parcelize-compiler/tests-gen", "plugins/parcelize/parcelize-compiler/testData") {
testClass<AbstractParcelizeBoxTest> {
model("box")
}
testClass<AbstractParcelizeIrBoxTest> { testClass<AbstractParcelizeIrBoxTest> {
model("box") model("box")
} }
@@ -212,10 +210,6 @@ fun main(args: Array<String>) {
model("box") model("box")
} }
testClass<AbstractParcelizeBytecodeListingTest> {
model("codegen")
}
testClass<AbstractParcelizeIrBytecodeListingTest> { testClass<AbstractParcelizeIrBytecodeListingTest> {
model("codegen") model("codegen")
} }
@@ -2,7 +2,8 @@
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
package org.jetbrains.kotlin.parcelize.ir
package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.*
@@ -2,7 +2,8 @@
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
package org.jetbrains.kotlin.parcelize.ir
package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.common.ir.addExtensionReceiver import org.jetbrains.kotlin.backend.common.ir.addExtensionReceiver
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
package org.jetbrains.kotlin.parcelize.ir package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
import org.jetbrains.kotlin.backend.jvm.ir.psiElement import org.jetbrains.kotlin.backend.jvm.ir.psiElement
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
package org.jetbrains.kotlin.parcelize.ir package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
import org.jetbrains.kotlin.backend.jvm.ir.isJvmInterface import org.jetbrains.kotlin.backend.jvm.ir.isJvmInterface
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
package org.jetbrains.kotlin.parcelize.ir package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
@@ -1,144 +0,0 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.parcelize
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.codegen.AbstractClassBuilder
import org.jetbrains.kotlin.codegen.ClassBuilder
import org.jetbrains.kotlin.codegen.ClassBuilderFactory
import org.jetbrains.kotlin.codegen.DelegatingClassBuilder
import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
import org.jetbrains.org.objectweb.asm.MethodVisitor
import org.jetbrains.org.objectweb.asm.Opcodes
import org.jetbrains.org.objectweb.asm.RecordComponentVisitor
import org.jetbrains.org.objectweb.asm.Type
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
class ParcelizeClinitClassBuilderInterceptorExtension : ClassBuilderInterceptorExtension {
override fun interceptClassBuilderFactory(
interceptedFactory: ClassBuilderFactory,
bindingContext: BindingContext,
diagnostics: DiagnosticSink
): ClassBuilderFactory {
return ParcelableClinitClassBuilderFactory(interceptedFactory, bindingContext)
}
private inner class ParcelableClinitClassBuilderFactory(
private val delegateFactory: ClassBuilderFactory,
val bindingContext: BindingContext
) : ClassBuilderFactory {
override fun newClassBuilder(origin: JvmDeclarationOrigin): ClassBuilder {
return AndroidOnDestroyCollectorClassBuilder(origin, delegateFactory.newClassBuilder(origin), bindingContext)
}
override fun getClassBuilderMode() = delegateFactory.classBuilderMode
override fun asText(builder: ClassBuilder?): String? {
return delegateFactory.asText((builder as AndroidOnDestroyCollectorClassBuilder).delegateClassBuilder)
}
override fun asBytes(builder: ClassBuilder?): ByteArray? {
return delegateFactory.asBytes((builder as AndroidOnDestroyCollectorClassBuilder).delegateClassBuilder)
}
override fun close() {
delegateFactory.close()
}
}
private class AndroidOnDestroyCollectorClassBuilder(
val declarationOrigin: JvmDeclarationOrigin,
val delegateClassBuilder: ClassBuilder,
val bindingContext: BindingContext
) : DelegatingClassBuilder() {
private var currentClass: KtClassOrObject? = null
private var currentClassName: String? = null
private var isClinitGenerated = false
override fun getDelegate() = delegateClassBuilder
override fun defineClass(
origin: PsiElement?,
version: Int,
access: Int,
name: String,
signature: String?,
superName: String,
interfaces: Array<out String>
) {
currentClass = origin as? KtClassOrObject
currentClassName = name
isClinitGenerated = false
super.defineClass(origin, version, access, name, signature, superName, interfaces)
}
override fun done(generateSmapCopyToAnnotation: Boolean) {
if (!isClinitGenerated && currentClass != null && currentClassName != null) {
val descriptor = bindingContext[BindingContext.CLASS, currentClass]
if (descriptor != null && declarationOrigin.descriptor == descriptor && descriptor.isParcelize) {
val baseVisitor = super.newMethod(JvmDeclarationOrigin.NO_ORIGIN, Opcodes.ACC_STATIC, "<clinit>", "()V", null, null)
val visitor = ClinitAwareMethodVisitor(currentClassName!!, baseVisitor)
visitor.visitCode()
visitor.visitInsn(Opcodes.RETURN)
visitor.visitEnd()
}
}
super.done(generateSmapCopyToAnnotation)
}
override fun newMethod(
origin: JvmDeclarationOrigin,
access: Int,
name: String,
desc: String,
signature: String?,
exceptions: Array<out String>?
): MethodVisitor {
if (name == "<clinit>" && currentClass != null && currentClassName != null) {
isClinitGenerated = true
val descriptor = bindingContext[BindingContext.CLASS, currentClass]
if (descriptor != null && declarationOrigin.descriptor == descriptor && descriptor.isParcelize) {
return ClinitAwareMethodVisitor(
currentClassName!!,
super.newMethod(origin, access, name, desc, signature, exceptions)
)
}
}
return super.newMethod(origin, access, name, desc, signature, exceptions)
}
override fun newRecordComponent(name: String, desc: String, signature: String?): RecordComponentVisitor {
return AbstractClassBuilder.EMPTY_RECORD_VISITOR
}
}
private class ClinitAwareMethodVisitor(val parcelableName: String, mv: MethodVisitor) : MethodVisitor(Opcodes.API_VERSION, mv) {
override fun visitInsn(opcode: Int) {
if (opcode == Opcodes.RETURN) {
val iv = InstructionAdapter(this)
val creatorName = "$parcelableName\$Creator"
val creatorType = Type.getObjectType(creatorName)
iv.anew(creatorType)
iv.dup()
iv.invokespecial(creatorName, "<init>", "()V", false)
iv.putstatic(parcelableName, "CREATOR", "Landroid/os/Parcelable\$Creator;")
}
super.visitInsn(opcode)
}
}
}
@@ -1,426 +0,0 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.parcelize
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.codegen.*
import org.jetbrains.kotlin.codegen.FunctionGenerationStrategy.CodegenBased
import org.jetbrains.kotlin.codegen.context.ClassContext
import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.impl.ClassDescriptorImpl
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.parcelize.ParcelizeNames.NEW_ARRAY_NAME
import org.jetbrains.kotlin.parcelize.ParcelizeResolveExtension.Companion.createMethod
import org.jetbrains.kotlin.parcelize.ParcelizeSyntheticComponent.ComponentKind.*
import org.jetbrains.kotlin.parcelize.serializers.*
import org.jetbrains.kotlin.parcelize.serializers.ParcelizeExtensionBase.Companion.FILE_DESCRIPTOR_FQNAME
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorFactory
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.inline.InlineUtil
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeUtils
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjections
import org.jetbrains.org.objectweb.asm.Opcodes.*
import org.jetbrains.org.objectweb.asm.Type
open class ParcelizeCodegenExtension : ParcelizeExtensionBase, ExpressionCodegenExtension {
open fun isAvailable(element: PsiElement): Boolean {
return true
}
override val shouldGenerateClassSyntheticPartsInLightClassesMode: Boolean
get() = true
override fun generateClassSyntheticParts(codegen: ImplementationBodyCodegen) {
val declaration = codegen.myClass as? PsiElement ?: return
if (!isAvailable(declaration)) {
return
}
val parcelableClass = codegen.descriptor
if (!parcelableClass.isParcelizeClassDescriptor) {
return
}
val propertiesToSerialize = getPropertiesToSerialize(codegen, parcelableClass)
val parcelerObject = parcelableClass.companionObjectDescriptor?.takeIf {
TypeUtils.getAllSupertypes(it.defaultType).any { supertype -> supertype.isParceler }
}
with(parcelableClass) {
if (hasSyntheticDescribeContents()) {
writeDescribeContentsFunction(codegen, propertiesToSerialize)
}
if (hasSyntheticWriteToParcel()) {
writeWriteToParcel(codegen, propertiesToSerialize, PARCEL_TYPE, parcelerObject)
}
if (!hasCreatorField()) {
writeCreatorAccessField(codegen, parcelableClass)
}
}
if (codegen.state.classBuilderMode != ClassBuilderMode.LIGHT_CLASSES) {
val parcelClassType = ParcelizeResolveExtension.resolveParcelClassType(parcelableClass.module)
?: error("Can't resolve 'android.os.Parcel' class")
val parcelableCreatorClassType = ParcelizeResolveExtension.resolveParcelableCreatorClassType(parcelableClass.module)
?: error("Can't resolve 'android.os.Parcelable.Creator' class")
writeCreatorClass(
codegen,
parcelableClass, parcelClassType, parcelableCreatorClassType,
PARCEL_TYPE, parcelerObject, propertiesToSerialize
)
}
}
private fun getCompanionClassType(containerAsmType: Type, parcelerObject: ClassDescriptor): Pair<Type, String> {
val shortName = parcelerObject.name
return Pair(Type.getObjectType(containerAsmType.internalName + "\$$shortName"), shortName.asString())
}
private fun ClassDescriptor.writeWriteToParcel(
codegen: ImplementationBodyCodegen,
properties: List<PropertyToSerialize>,
parcelAsmType: Type,
parcelerObject: ClassDescriptor?
): Unit? {
val containerAsmType = codegen.typeMapper.mapType(this.defaultType)
return findFunction(WRITE_TO_PARCEL)?.write(codegen) {
if (parcelerObject != null) {
val (companionAsmType, companionFieldName) = getCompanionClassType(containerAsmType, parcelerObject)
v.getstatic(containerAsmType.internalName, companionFieldName, companionAsmType.descriptor)
v.load(0, containerAsmType)
v.load(1, PARCEL_TYPE)
v.load(2, Type.INT_TYPE)
v.invokevirtual(
companionAsmType.internalName, "write",
"(${containerAsmType.descriptor}${PARCEL_TYPE.descriptor}I)V", false
)
} else {
val frameMap = FrameMap().apply {
enterTemp(containerAsmType)
enterTemp(PARCEL_TYPE)
enterTemp(Type.INT_TYPE)
}
val globalContext = ParcelSerializer.ParcelSerializerContext(codegen.typeMapper, containerAsmType, emptyList(), frameMap)
if (properties.isEmpty()) {
val entityType = this@writeWriteToParcel.defaultType
val asmType = codegen.state.typeMapper.mapType(entityType)
val serializer = if (this@writeWriteToParcel.kind == ClassKind.CLASS) {
NullAwareParcelSerializerWrapper(ZeroParameterClassSerializer(asmType, entityType))
} else {
ParcelSerializer.get(entityType, asmType, globalContext, strict = true)
}
v.load(1, parcelAsmType)
v.load(0, containerAsmType)
serializer.writeValue(v)
} else {
for ((fieldName, type, parcelers) in properties) {
val asmType = codegen.typeMapper.mapType(type)
v.load(1, parcelAsmType)
v.load(0, containerAsmType)
v.getfield(containerAsmType.internalName, fieldName, asmType.descriptor)
val serializer = ParcelSerializer.get(type, asmType, globalContext.copy(typeParcelers = parcelers))
serializer.writeValue(v)
}
}
}
v.areturn(Type.VOID_TYPE)
}
}
private fun ClassDescriptor.writeDescribeContentsFunction(
codegen: ImplementationBodyCodegen,
propertiesToSerialize: List<PropertyToSerialize>
): Unit? {
val hasFileDescriptorAnywhere = propertiesToSerialize.any { it.type.containsFileDescriptor() }
return findFunction(DESCRIBE_CONTENTS)?.write(codegen) {
v.aconst(if (hasFileDescriptorAnywhere) 1 /* CONTENTS_FILE_DESCRIPTOR */ else 0)
v.areturn(Type.INT_TYPE)
}
}
private fun KotlinType.containsFileDescriptor(): Boolean {
val declarationDescriptor = this.constructor.declarationDescriptor
if (declarationDescriptor != null) {
if (declarationDescriptor.fqNameSafe == FILE_DESCRIPTOR_FQNAME) {
return true
}
}
return this.arguments.any { it.type.containsFileDescriptor() }
}
data class PropertyToSerialize(val name: String, val type: KotlinType, val parcelers: List<TypeParcelerMapping>)
private fun getPropertiesToSerialize(
codegen: ImplementationBodyCodegen,
parcelableClass: ClassDescriptor
): List<PropertyToSerialize> {
if (parcelableClass.kind != ClassKind.CLASS) {
return emptyList()
}
val constructor = parcelableClass.constructors.firstOrNull { it.isPrimary } ?: return emptyList()
val propertiesToSerialize = constructor.valueParameters.mapNotNull { param ->
codegen.bindingContext[BindingContext.VALUE_PARAMETER_AS_PROPERTY, param]
}
val classParcelers = getTypeParcelers(parcelableClass.annotations)
return propertiesToSerialize.map {
PropertyToSerialize(it.name.asString(), it.type, classParcelers + getTypeParcelers(it.annotations))
}
}
private fun writeCreateFromParcel(
codegen: ImplementationBodyCodegen,
parcelableClass: ClassDescriptor,
parcelableCreatorClassType: KotlinType,
creatorClass: ClassDescriptorImpl,
parcelClassType: KotlinType,
parcelAsmType: Type,
parcelerObject: ClassDescriptor?,
properties: List<PropertyToSerialize>
) {
val containerAsmType = codegen.typeMapper.mapType(parcelableClass)
val creatorAsmType = codegen.typeMapper.mapType(creatorClass)
val overriddenFunction = parcelableCreatorClassType.findFunction(CREATE_FROM_PARCEL)
?: error("Can't resolve 'android.os.Parcelable.Creator.${CREATE_FROM_PARCEL.methodName}' method")
createMethod(
creatorClass, CREATE_FROM_PARCEL, Modality.FINAL,
parcelableClass.defaultType.replaceArgumentsWithStarProjections(), "in" to parcelClassType
).write(codegen, overriddenFunction) {
if (parcelerObject != null) {
val (companionAsmType, companionFieldName) = getCompanionClassType(containerAsmType, parcelerObject)
v.getstatic(containerAsmType.internalName, companionFieldName, companionAsmType.descriptor)
v.load(1, PARCEL_TYPE)
v.invokevirtual(companionAsmType.internalName, "create", "(${PARCEL_TYPE.descriptor})$containerAsmType", false)
} else {
v.anew(containerAsmType)
v.dup()
val asmConstructorParameters = StringBuilder()
val frameMap = FrameMap().apply {
enterTemp(creatorAsmType)
enterTemp(PARCEL_TYPE)
}
val globalContext = ParcelSerializer.ParcelSerializerContext(codegen.typeMapper, containerAsmType, emptyList(), frameMap)
if (properties.isEmpty()) {
val entityType = parcelableClass.defaultType
val asmType = codegen.state.typeMapper.mapType(entityType)
val serializer = if (parcelableClass.kind == ClassKind.CLASS) {
NullAwareParcelSerializerWrapper(ZeroParameterClassSerializer(asmType, entityType))
} else {
ParcelSerializer.get(entityType, asmType, globalContext, strict = true)
}
v.load(1, parcelAsmType)
serializer.readValue(v)
} else {
for ((_, type, parcelers) in properties) {
val asmType = codegen.typeMapper.mapType(type)
asmConstructorParameters.append(asmType.descriptor)
val serializer = ParcelSerializer.get(type, asmType, globalContext.copy(typeParcelers = parcelers))
v.load(1, parcelAsmType)
serializer.readValue(v)
}
v.invokespecial(containerAsmType.internalName, "<init>", "($asmConstructorParameters)V", false)
}
}
v.areturn(containerAsmType)
}
}
private fun writeCreatorAccessField(codegen: ImplementationBodyCodegen, parcelableClass: ClassDescriptor) {
val creatorType = Type.getObjectType("android/os/Parcelable\$Creator")
val parcelableType = codegen.typeMapper.mapType(parcelableClass)
val fieldSignature = "L${creatorType.internalName}<${parcelableType.descriptor}>;"
codegen.v.newField(
JvmDeclarationOrigin.NO_ORIGIN,
ACC_STATIC or ACC_PUBLIC or ACC_FINAL,
"CREATOR",
creatorType.descriptor,
fieldSignature,
null
)
}
private fun writeCreatorClass(
codegen: ImplementationBodyCodegen,
parcelableClass: ClassDescriptor,
parcelClassType: KotlinType,
parcelableCreatorClassType: KotlinType,
parcelAsmType: Type,
parcelerObject: ClassDescriptor?,
properties: List<PropertyToSerialize>
) {
val containerAsmType = codegen.typeMapper.mapType(parcelableClass.defaultType)
val creatorAsmType = Type.getObjectType(containerAsmType.internalName + "\$Creator")
val creatorClass = ClassDescriptorImpl(
parcelableClass, Name.identifier("Creator"), Modality.FINAL, ClassKind.CLASS, listOf(parcelableCreatorClassType),
parcelableClass.source, false, LockBasedStorageManager.NO_LOCKS
)
creatorClass.initialize(
MemberScope.Empty, emptySet(),
DescriptorFactory.createPrimaryConstructorForObject(creatorClass, creatorClass.source)
)
val classBuilderForCreator = codegen.state.factory.newVisitor(
JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, null, creatorClass),
Type.getObjectType(creatorAsmType.internalName),
codegen.myClass.containingKtFile
)
val classContextForCreator = ClassContext(
codegen.typeMapper, creatorClass, OwnerKind.IMPLEMENTATION, codegen.context.parentContext, null
)
val codegenForCreator = ImplementationBodyCodegen(
codegen.myClass, classContextForCreator, classBuilderForCreator, codegen.state, codegen.parentCodegen, false
)
val classSignature = "Ljava/lang/Object;Landroid/os/Parcelable\$Creator<${containerAsmType.descriptor}>;"
classBuilderForCreator.defineClass(
null, V1_6, ACC_PUBLIC or ACC_FINAL or ACC_SUPER,
creatorAsmType.internalName, classSignature, "java/lang/Object",
arrayOf("android/os/Parcelable\$Creator")
)
codegen.v.visitInnerClass(creatorAsmType.internalName, containerAsmType.internalName, "Creator", ACC_PUBLIC or ACC_STATIC)
codegenForCreator.v.visitInnerClass(creatorAsmType.internalName, containerAsmType.internalName, "Creator", ACC_PUBLIC or ACC_STATIC)
writeSyntheticClassMetadata(classBuilderForCreator, codegen.state, InlineUtil.isInPublicInlineScope(parcelableClass))
writeCreatorConstructor(codegenForCreator, creatorClass, creatorAsmType)
writeNewArrayMethod(codegenForCreator, parcelableClass, parcelableCreatorClassType, creatorClass, parcelerObject)
writeCreateFromParcel(
codegenForCreator,
parcelableClass, parcelableCreatorClassType, creatorClass, parcelClassType,
parcelAsmType, parcelerObject, properties
)
classBuilderForCreator.done(codegen.state.generateSmapCopyToAnnotation)
}
private fun writeCreatorConstructor(codegen: ImplementationBodyCodegen, creatorClass: ClassDescriptor, creatorAsmType: Type) {
DescriptorFactory.createPrimaryConstructorForObject(creatorClass, creatorClass.source)
.apply {
returnType = creatorClass.defaultType
}.write(codegen) {
v.load(0, creatorAsmType)
v.invokespecial("java/lang/Object", "<init>", "()V", false)
v.areturn(Type.VOID_TYPE)
}
}
private fun writeNewArrayMethod(
codegen: ImplementationBodyCodegen,
parcelableClass: ClassDescriptor,
parcelableCreatorClassType: KotlinType,
creatorClass: ClassDescriptorImpl,
parcelerObject: ClassDescriptor?
) {
val builtIns = parcelableClass.builtIns
val parcelableAsmType = codegen.typeMapper.mapType(parcelableClass)
val overriddenFunction = parcelableCreatorClassType.findFunction(NEW_ARRAY)
?: error("Can't resolve 'android.os.Parcelable.Creator.${NEW_ARRAY.methodName}' method")
createMethod(
creatorClass, NEW_ARRAY, Modality.FINAL,
builtIns.getArrayType(Variance.INVARIANT, parcelableClass.defaultType.replaceArgumentsWithStarProjections()),
"size" to builtIns.intType
).write(codegen, overriddenFunction) {
if (parcelerObject != null) {
val newArrayMethod = parcelerObject.unsubstitutedMemberScope
.getContributedFunctions(NEW_ARRAY_NAME, NoLookupLocation.WHEN_GET_ALL_DESCRIPTORS)
.firstOrNull {
it.typeParameters.isEmpty()
&& it.kind == CallableMemberDescriptor.Kind.DECLARATION
&& (it.valueParameters.size == 1 && KotlinBuiltIns.isInt(it.valueParameters[0].type))
&& !((it.containingDeclaration as? ClassDescriptor)?.defaultType?.isParceler ?: true)
}
if (newArrayMethod != null) {
val containerAsmType = codegen.typeMapper.mapType(parcelableClass.defaultType)
val (companionAsmType, companionFieldName) = getCompanionClassType(containerAsmType, parcelerObject)
v.getstatic(containerAsmType.internalName, companionFieldName, companionAsmType.descriptor)
v.load(1, Type.INT_TYPE)
v.invokevirtual(companionAsmType.internalName, "newArray", "(I)[$parcelableAsmType", false)
v.areturn(Type.getType("[$parcelableAsmType"))
return@write
}
}
v.load(1, Type.INT_TYPE)
v.newarray(parcelableAsmType)
v.areturn(Type.getType("[$parcelableAsmType"))
}
}
private fun FunctionDescriptor.write(
codegen: ImplementationBodyCodegen,
overriddenDescriptor: FunctionDescriptor? = null,
code: ExpressionCodegen.() -> Unit
) {
val declarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, null, this)
if (overriddenDescriptor != null) {
this.overriddenDescriptors = listOf(overriddenDescriptor)
}
codegen.functionCodegen.generateMethod(declarationOrigin, this, object : CodegenBased(codegen.state) {
override fun doGenerateBody(e: ExpressionCodegen, signature: JvmMethodSignature) = with(e) {
e.code()
}
})
}
private fun KotlinType.findFunction(componentKind: ParcelizeSyntheticComponent.ComponentKind): SimpleFunctionDescriptor? {
return memberScope
.getContributedFunctions(Name.identifier(componentKind.methodName), NoLookupLocation.WHEN_GET_ALL_DESCRIPTORS)
.firstOrNull()
}
}
@@ -8,8 +8,6 @@ package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.parcelize.ir.AndroidSymbols
import org.jetbrains.kotlin.parcelize.ir.ParcelizeFirIrTransformer
class ParcelizeFirIrGeneratorExtension : IrGenerationExtension { class ParcelizeFirIrGeneratorExtension : IrGenerationExtension {
override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) { override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
package org.jetbrains.kotlin.parcelize.ir package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.ir.util.companionObject
import org.jetbrains.kotlin.ir.util.functions import org.jetbrains.kotlin.ir.util.functions
import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.parcelize.ParcelizeNames.PARCELER_FQN import org.jetbrains.kotlin.parcelize.ParcelizeNames.PARCELER_FQN
import org.jetbrains.kotlin.parcelize.ParcelizeSyntheticComponent
import org.jetbrains.kotlin.parcelize.fir.ParcelizePluginKey import org.jetbrains.kotlin.parcelize.fir.ParcelizePluginKey
class ParcelizeFirIrTransformer( class ParcelizeFirIrTransformer(
@@ -8,8 +8,6 @@ package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.parcelize.ir.AndroidSymbols
import org.jetbrains.kotlin.parcelize.ir.ParcelizeIrTransformer
class ParcelizeIrGeneratorExtension : IrGenerationExtension { class ParcelizeIrGeneratorExtension : IrGenerationExtension {
override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) { override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
@@ -17,4 +15,3 @@ class ParcelizeIrGeneratorExtension : IrGenerationExtension {
ParcelizeIrTransformer(pluginContext, androidSymbols).transform(moduleFragment) ParcelizeIrTransformer(pluginContext, androidSymbols).transform(moduleFragment)
} }
} }
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
package org.jetbrains.kotlin.parcelize.ir package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
@@ -35,7 +35,6 @@ import org.jetbrains.kotlin.parcelize.ParcelizeNames.FLAGS_NAME
import org.jetbrains.kotlin.parcelize.ParcelizeNames.PARCELABLE_FQN import org.jetbrains.kotlin.parcelize.ParcelizeNames.PARCELABLE_FQN
import org.jetbrains.kotlin.parcelize.ParcelizeNames.PARCELER_FQN import org.jetbrains.kotlin.parcelize.ParcelizeNames.PARCELER_FQN
import org.jetbrains.kotlin.parcelize.ParcelizeNames.WRITE_TO_PARCEL_NAME import org.jetbrains.kotlin.parcelize.ParcelizeNames.WRITE_TO_PARCEL_NAME
import org.jetbrains.kotlin.parcelize.ParcelizeSyntheticComponent
@OptIn(ObsoleteDescriptorBasedAPI::class) @OptIn(ObsoleteDescriptorBasedAPI::class)
class ParcelizeIrTransformer( class ParcelizeIrTransformer(
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
package org.jetbrains.kotlin.parcelize.ir package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
package org.jetbrains.kotlin.parcelize.ir package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
@@ -6,8 +6,6 @@
package org.jetbrains.kotlin.parcelize package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.codegen.extensions.ClassBuilderInterceptorExtension
import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
@@ -24,14 +22,12 @@ import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension
class ParcelizeComponentRegistrar : CompilerPluginRegistrar() { class ParcelizeComponentRegistrar : CompilerPluginRegistrar() {
companion object { companion object {
fun registerParcelizeComponents(extensionStorage: ExtensionStorage, useFir: Boolean) = with(extensionStorage) { fun registerParcelizeComponents(extensionStorage: ExtensionStorage, useFir: Boolean) = with(extensionStorage) {
ExpressionCodegenExtension.registerExtension(ParcelizeCodegenExtension())
if (useFir) { if (useFir) {
IrGenerationExtension.registerExtension(ParcelizeFirIrGeneratorExtension()) IrGenerationExtension.registerExtension(ParcelizeFirIrGeneratorExtension())
} else { } else {
IrGenerationExtension.registerExtension(ParcelizeIrGeneratorExtension()) IrGenerationExtension.registerExtension(ParcelizeIrGeneratorExtension())
} }
SyntheticResolveExtension.registerExtension(ParcelizeResolveExtension()) SyntheticResolveExtension.registerExtension(ParcelizeResolveExtension())
ClassBuilderInterceptorExtension.registerExtension(ParcelizeClinitClassBuilderInterceptorExtension())
StorageComponentContainerContributor.registerExtension(ParcelizeDeclarationCheckerComponentContainerContributor()) StorageComponentContainerContributor.registerExtension(ParcelizeDeclarationCheckerComponentContainerContributor())
FirExtensionRegistrarAdapter.registerExtension(FirParcelizeExtensionRegistrar()) FirExtensionRegistrarAdapter.registerExtension(FirParcelizeExtensionRegistrar())
} }
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.parcelize.ParcelizeNames.CREATE_FROM_PARCEL_NAME import org.jetbrains.kotlin.parcelize.ParcelizeNames.CREATE_FROM_PARCEL_NAME
import org.jetbrains.kotlin.parcelize.ParcelizeNames.CREATOR_ID
import org.jetbrains.kotlin.parcelize.ParcelizeNames.DESCRIBE_CONTENTS_NAME import org.jetbrains.kotlin.parcelize.ParcelizeNames.DESCRIBE_CONTENTS_NAME
import org.jetbrains.kotlin.parcelize.ParcelizeNames.NEW_ARRAY_NAME import org.jetbrains.kotlin.parcelize.ParcelizeNames.NEW_ARRAY_NAME
import org.jetbrains.kotlin.parcelize.ParcelizeNames.PARCELER_FQN import org.jetbrains.kotlin.parcelize.ParcelizeNames.PARCELER_FQN
@@ -42,10 +41,10 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.* import org.jetbrains.kotlin.resolve.descriptorUtil.*
import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension
import org.jetbrains.kotlin.resolve.source.PsiSourceElement import org.jetbrains.kotlin.resolve.source.PsiSourceElement
import org.jetbrains.kotlin.types.error.ErrorTypeKind
import org.jetbrains.kotlin.types.error.ErrorUtils
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.SimpleType import org.jetbrains.kotlin.types.SimpleType
import org.jetbrains.kotlin.types.error.ErrorTypeKind
import org.jetbrains.kotlin.types.error.ErrorUtils
open class ParcelizeResolveExtension : SyntheticResolveExtension { open class ParcelizeResolveExtension : SyntheticResolveExtension {
companion object { companion object {
@@ -53,11 +52,6 @@ open class ParcelizeResolveExtension : SyntheticResolveExtension {
return module.findClassAcrossModuleDependencies(PARCEL_ID)?.defaultType return module.findClassAcrossModuleDependencies(PARCEL_ID)?.defaultType
} }
fun resolveParcelableCreatorClassType(module: ModuleDescriptor): SimpleType? {
val creatorClassId = CREATOR_ID
return module.findClassAcrossModuleDependencies(creatorClassId)?.defaultType
}
fun createMethod( fun createMethod(
classDescriptor: ClassDescriptor, classDescriptor: ClassDescriptor,
componentKind: ParcelizeSyntheticComponent.ComponentKind, componentKind: ParcelizeSyntheticComponent.ComponentKind,
@@ -1,507 +0,0 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.parcelize.test.runners;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.test.TargetBackend;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("plugins/parcelize/parcelize-compiler/testData/box")
@TestDataPath("$PROJECT_ROOT")
public class ParcelizeBoxTestGenerated extends AbstractParcelizeBoxTest {
@Test
public void testAllFilesPresentInBox() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/parcelize/parcelize-compiler/testData/box"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true);
}
@Test
@TestMetadata("allPrimitiveTypes.kt")
public void testAllPrimitiveTypes() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/allPrimitiveTypes.kt");
}
@Test
@TestMetadata("allUnsignedTypes.kt")
public void testAllUnsignedTypes() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/allUnsignedTypes.kt");
}
@Test
@TestMetadata("arraySimple.kt")
public void testArraySimple() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/arraySimple.kt");
}
@Test
@TestMetadata("arrays.kt")
public void testArrays() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/arrays.kt");
}
@Test
@TestMetadata("binder.kt")
public void testBinder() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/binder.kt");
}
@Test
@TestMetadata("boxedTypes.kt")
public void testBoxedTypes() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/boxedTypes.kt");
}
@Test
@TestMetadata("bundle.kt")
public void testBundle() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/bundle.kt");
}
@Test
@TestMetadata("charSequence.kt")
public void testCharSequence() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/charSequence.kt");
}
@Test
@TestMetadata("constructorWithoutValOrVar.kt")
public void testConstructorWithoutValOrVar() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/constructorWithoutValOrVar.kt");
}
@Test
@TestMetadata("customNewArray.kt")
public void testCustomNewArray() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/customNewArray.kt");
}
@Test
@TestMetadata("customParcelable.kt")
public void testCustomParcelable() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/customParcelable.kt");
}
@Test
@TestMetadata("customParcelerChecks.kt")
public void testCustomParcelerChecks() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/customParcelerChecks.kt");
}
@Test
@TestMetadata("customParcelerScoping.kt")
public void testCustomParcelerScoping() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/customParcelerScoping.kt");
}
@Test
@TestMetadata("customSerializerBoxing.kt")
public void testCustomSerializerBoxing() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/customSerializerBoxing.kt");
}
@Test
@TestMetadata("customSerializerSimple.kt")
public void testCustomSerializerSimple() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/customSerializerSimple.kt");
}
@Test
@TestMetadata("customSerializerWriteWith.kt")
public void testCustomSerializerWriteWith() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/customSerializerWriteWith.kt");
}
@Test
@TestMetadata("customSimple.kt")
public void testCustomSimple() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/customSimple.kt");
}
@Test
@TestMetadata("enumObject.kt")
public void testEnumObject() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/enumObject.kt");
}
@Test
@TestMetadata("enums.kt")
public void testEnums() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/enums.kt");
}
@Test
@TestMetadata("exceptions.kt")
public void testExceptions() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/exceptions.kt");
}
@Test
@TestMetadata("functions.kt")
public void testFunctions() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/functions.kt");
}
@Test
@TestMetadata("genericParcelable.kt")
public void testGenericParcelable() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/genericParcelable.kt");
}
@Test
@TestMetadata("generics.kt")
public void testGenerics() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/generics.kt");
}
@Test
@TestMetadata("ignoredOnParcel.kt")
public void testIgnoredOnParcel() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/ignoredOnParcel.kt");
}
@Test
@TestMetadata("intArray.kt")
public void testIntArray() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/intArray.kt");
}
@Test
@TestMetadata("javaInterop.kt")
public void testJavaInterop() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/javaInterop.kt");
}
@Test
@TestMetadata("kt19747.kt")
public void testKt19747() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt19747.kt");
}
@Test
@TestMetadata("kt19747Deprecated.kt")
public void testKt19747Deprecated() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt19747Deprecated.kt");
}
@Test
@TestMetadata("kt19747_2.kt")
public void testKt19747_2() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt19747_2.kt");
}
@Test
@TestMetadata("kt19749.kt")
public void testKt19749() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt19749.kt");
}
@Test
@TestMetadata("kt19853.kt")
public void testKt19853() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt19853.kt");
}
@Test
@TestMetadata("kt20002.kt")
public void testKt20002() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt20002.kt");
}
@Test
@TestMetadata("kt20021.kt")
public void testKt20021() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt20021.kt");
}
@Test
@TestMetadata("kt20717.kt")
public void testKt20717() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt20717.kt");
}
@Test
@TestMetadata("kt25839.kt")
public void testKt25839() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt25839.kt");
}
@Test
@TestMetadata("kt26221.kt")
public void testKt26221() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt26221.kt");
}
@Test
@TestMetadata("kt36658.kt")
public void testKt36658() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt36658.kt");
}
@Test
@TestMetadata("kt39981.kt")
public void testKt39981() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt39981.kt");
}
@Test
@TestMetadata("kt41553.kt")
public void testKt41553() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt41553.kt");
}
@Test
@TestMetadata("kt41553_2.kt")
public void testKt41553_2() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt41553_2.kt");
}
@Test
@TestMetadata("kt46567.kt")
public void testKt46567() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/kt46567.kt");
}
@Test
@TestMetadata("listKinds.kt")
public void testListKinds() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/listKinds.kt");
}
@Test
@TestMetadata("listSimple.kt")
public void testListSimple() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/listSimple.kt");
}
@Test
@TestMetadata("lists.kt")
public void testLists() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/lists.kt");
}
@Test
@TestMetadata("mapKinds.kt")
public void testMapKinds() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/mapKinds.kt");
}
@Test
@TestMetadata("mapSimple.kt")
public void testMapSimple() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/mapSimple.kt");
}
@Test
@TestMetadata("maps.kt")
public void testMaps() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/maps.kt");
}
@Test
@TestMetadata("nestedArrays.kt")
public void testNestedArrays() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/nestedArrays.kt");
}
@Test
@TestMetadata("nestedLists.kt")
public void testNestedLists() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/nestedLists.kt");
}
@Test
@TestMetadata("nestedMaps.kt")
public void testNestedMaps() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/nestedMaps.kt");
}
@Test
@TestMetadata("nestedParcelable.kt")
public void testNestedParcelable() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/nestedParcelable.kt");
}
@Test
@TestMetadata("nestedSparseArrays.kt")
public void testNestedSparseArrays() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/nestedSparseArrays.kt");
}
@Test
@TestMetadata("nestedSparseArrays2.kt")
public void testNestedSparseArrays2() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/nestedSparseArrays2.kt");
}
@Test
@TestMetadata("newArray.kt")
public void testNewArray() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/newArray.kt");
}
@Test
@TestMetadata("newArrayParceler.kt")
public void testNewArrayParceler() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/newArrayParceler.kt");
}
@Test
@TestMetadata("nullableSparseArrays.kt")
public void testNullableSparseArrays() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/nullableSparseArrays.kt");
}
@Test
@TestMetadata("nullableTypes.kt")
public void testNullableTypes() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/nullableTypes.kt");
}
@Test
@TestMetadata("nullableTypesSimple.kt")
public void testNullableTypesSimple() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/nullableTypesSimple.kt");
}
@Test
@TestMetadata("objectWriteParcelable.kt")
public void testObjectWriteParcelable() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/objectWriteParcelable.kt");
}
@Test
@TestMetadata("objects.kt")
public void testObjects() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/objects.kt");
}
@Test
@TestMetadata("openParcelize.kt")
public void testOpenParcelize() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/openParcelize.kt");
}
@Test
@TestMetadata("overriddenDescribeContents.kt")
public void testOverriddenDescribeContents() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/overriddenDescribeContents.kt");
}
@Test
@TestMetadata("parcelableValueClass.kt")
public void testParcelableValueClass() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/parcelableValueClass.kt");
}
@Test
@TestMetadata("parcelizeCustomValueClass.kt")
public void testParcelizeCustomValueClass() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/parcelizeCustomValueClass.kt");
}
@Test
@TestMetadata("persistableBundle.kt")
public void testPersistableBundle() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/persistableBundle.kt");
}
@Test
@TestMetadata("primitiveTypes.kt")
public void testPrimitiveTypes() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/primitiveTypes.kt");
}
@Test
@TestMetadata("privateConstructor.kt")
public void testPrivateConstructor() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/privateConstructor.kt");
}
@Test
@TestMetadata("recursiveGenerics.kt")
public void testRecursiveGenerics() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/recursiveGenerics.kt");
}
@Test
@TestMetadata("sealedClass.kt")
public void testSealedClass() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/sealedClass.kt");
}
@Test
@TestMetadata("sealedClass2.kt")
public void testSealedClass2() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/sealedClass2.kt");
}
@Test
@TestMetadata("sealedInterface.kt")
public void testSealedInterface() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/sealedInterface.kt");
}
@Test
@TestMetadata("shortArray.kt")
public void testShortArray() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/shortArray.kt");
}
@Test
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/simple.kt");
}
@Test
@TestMetadata("simpleDeprecated.kt")
public void testSimpleDeprecated() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/simpleDeprecated.kt");
}
@Test
@TestMetadata("sparseArrays.kt")
public void testSparseArrays() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/sparseArrays.kt");
}
@Test
@TestMetadata("sparseBooleanArray.kt")
public void testSparseBooleanArray() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/sparseBooleanArray.kt");
}
@Test
@TestMetadata("typeParameters.kt")
public void testTypeParameters() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/typeParameters.kt");
}
@Test
@TestMetadata("unsignedArrays.kt")
public void testUnsignedArrays() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/unsignedArrays.kt");
}
@Test
@TestMetadata("valueClassWrapper.kt")
public void testValueClassWrapper() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/valueClassWrapper.kt");
}
@Test
@TestMetadata("valueClasses.kt")
public void testValueClasses() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/box/valueClasses.kt");
}
}
@@ -1,159 +0,0 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.parcelize.test.runners;
import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.util.KtTestUtil;
import org.jetbrains.kotlin.test.TargetBackend;
import org.jetbrains.kotlin.test.TestMetadata;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.GenerateTestsKt}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all")
@TestMetadata("plugins/parcelize/parcelize-compiler/testData/codegen")
@TestDataPath("$PROJECT_ROOT")
public class ParcelizeBytecodeListingTestGenerated extends AbstractParcelizeBytecodeListingTest {
@Test
public void testAllFilesPresentInCodegen() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("plugins/parcelize/parcelize-compiler/testData/codegen"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM, true);
}
@Test
@TestMetadata("classLoaderValues.kt")
public void testClassLoaderValues() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/classLoaderValues.kt");
}
@Test
@TestMetadata("customDescribeContents.kt")
public void testCustomDescribeContents() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/customDescribeContents.kt");
}
@Test
@TestMetadata("customParcelablesDifferentModule.kt")
public void testCustomParcelablesDifferentModule() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/customParcelablesDifferentModule.kt");
}
@Test
@TestMetadata("customParcelablesSameModule.kt")
public void testCustomParcelablesSameModule() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/customParcelablesSameModule.kt");
}
@Test
@TestMetadata("customSimple.kt")
public void testCustomSimple() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/customSimple.kt");
}
@Test
@TestMetadata("customSimpleWithNewArray.kt")
public void testCustomSimpleWithNewArray() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/customSimpleWithNewArray.kt");
}
@Test
@TestMetadata("describeContentsFromSuperType.kt")
public void testDescribeContentsFromSuperType() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/describeContentsFromSuperType.kt");
}
@Test
@TestMetadata("duplicatingClinit.kt")
public void testDuplicatingClinit() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/duplicatingClinit.kt");
}
@Test
@TestMetadata("efficientParcelable.kt")
public void testEfficientParcelable() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/efficientParcelable.kt");
}
@Test
@TestMetadata("generics.kt")
public void testGenerics() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/generics.kt");
}
@Test
@TestMetadata("IBinderIInterface.kt")
public void testIBinderIInterface() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/IBinderIInterface.kt");
}
@Test
@TestMetadata("kt25839.kt")
public void testKt25839() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/kt25839.kt");
}
@Test
@TestMetadata("listInsideList.kt")
public void testListInsideList() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/listInsideList.kt");
}
@Test
@TestMetadata("nullableNotNullSize.kt")
public void testNullableNotNullSize() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/nullableNotNullSize.kt");
}
@Test
@TestMetadata("parcelable.kt")
public void testParcelable() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/parcelable.kt");
}
@Test
@TestMetadata("parcelableCreator.kt")
public void testParcelableCreator() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/parcelableCreator.kt");
}
@Test
@TestMetadata("serializable.kt")
public void testSerializable() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/serializable.kt");
}
@Test
@TestMetadata("serializeValue.kt")
public void testSerializeValue() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/serializeValue.kt");
}
@Test
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/simple.kt");
}
@Test
@TestMetadata("simpleList.kt")
public void testSimpleList() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/simpleList.kt");
}
@Test
@TestMetadata("size.kt")
public void testSize() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/size.kt");
}
@Test
@TestMetadata("unsignedPrimitiveArrays.kt")
public void testUnsignedPrimitiveArrays() throws Exception {
runTest("plugins/parcelize/parcelize-compiler/testData/codegen/unsignedPrimitiveArrays.kt");
}
}
@@ -90,20 +90,6 @@ abstract class AbstractParcelizeBoxTestBase<R : ResultingArtifact.FrontendOutput
} }
} }
open class AbstractParcelizeBoxTest : AbstractParcelizeBoxTestBase<ClassicFrontendOutputArtifact, ClassicBackendInput>(
FrontendKinds.ClassicFrontend,
TargetBackend.JVM
) {
override val frontendFacade: Constructor<FrontendFacade<ClassicFrontendOutputArtifact>>
get() = ::ClassicFrontendFacade
override val frontendToBackendConverter: Constructor<Frontend2BackendConverter<ClassicFrontendOutputArtifact, ClassicBackendInput>>
get() = ::ClassicFrontend2ClassicBackendConverter
override val backendFacade: Constructor<BackendFacade<ClassicBackendInput, BinaryArtifacts.Jvm>>
get() = ::ClassicJvmBackendFacade
}
open class AbstractParcelizeIrBoxTest : AbstractParcelizeBoxTestBase<ClassicFrontendOutputArtifact, IrBackendInput>( open class AbstractParcelizeIrBoxTest : AbstractParcelizeBoxTestBase<ClassicFrontendOutputArtifact, IrBackendInput>(
FrontendKinds.ClassicFrontend, FrontendKinds.ClassicFrontend,
TargetBackend.JVM_IR TargetBackend.JVM_IR
@@ -8,16 +8,8 @@ package org.jetbrains.kotlin.parcelize.test.runners
import org.jetbrains.kotlin.parcelize.test.services.ParcelizeEnvironmentConfigurator import org.jetbrains.kotlin.parcelize.test.services.ParcelizeEnvironmentConfigurator
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.IR_DIFFERENCE import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.IR_DIFFERENCE
import org.jetbrains.kotlin.test.runners.codegen.AbstractAsmLikeInstructionListingTest
import org.jetbrains.kotlin.test.runners.codegen.AbstractIrAsmLikeInstructionListingTest import org.jetbrains.kotlin.test.runners.codegen.AbstractIrAsmLikeInstructionListingTest
open class AbstractParcelizeBytecodeListingTest : AbstractAsmLikeInstructionListingTest() {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
builder.configureParcelizeSpecific()
}
}
open class AbstractParcelizeIrBytecodeListingTest : AbstractIrAsmLikeInstructionListingTest() { open class AbstractParcelizeIrBytecodeListingTest : AbstractIrAsmLikeInstructionListingTest() {
override fun configure(builder: TestConfigurationBuilder) { override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder) super.configure(builder)
@@ -1,27 +0,0 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.parcelize.test.runners
import com.intellij.testFramework.TestDataPath
import org.jetbrains.kotlin.parcelize.test.services.SerializableLikeExtensionProvider
import org.jetbrains.kotlin.test.TestMetadata
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.junit.jupiter.api.Test
@TestMetadata("plugins/parcelize/parcelize-compiler/testData/box")
@TestDataPath("\$PROJECT_ROOT")
class ParcelizeBoxTestWithSerializableLikeExtension : AbstractParcelizeBoxTest() {
@Test
@TestMetadata("simple.kt")
fun testSimple() {
runTest("plugins/parcelize/parcelize-compiler/testData/box/simple.kt")
}
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
builder.useConfigurators(::SerializableLikeExtensionProvider)
}
}