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.AbstractAndroidIrBoxTest
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.AbstractFirLightTreeBlackBoxCodegenTestForAssignmentPlugin
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.AbstractFirPsiPluginDiagnosticTest
import org.jetbrains.kotlin.generators.generateTestGroupSuiteWithJUnit5
import org.jetbrains.kotlin.generators.impl.generateTestGroupSuite
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.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.AbstractKaptToolIntegrationTest
import org.jetbrains.kotlin.kapt3.test.runners.AbstractClassFileToSourceStubConverterTest
@@ -200,10 +202,6 @@ fun main(args: Array<String>) {
val excludedFirTestdataPattern = "^(.+)\\.fir\\.kts?\$"
testGroup("plugins/parcelize/parcelize-compiler/tests-gen", "plugins/parcelize/parcelize-compiler/testData") {
testClass<AbstractParcelizeBoxTest> {
model("box")
}
testClass<AbstractParcelizeIrBoxTest> {
model("box")
}
@@ -212,10 +210,6 @@ fun main(args: Array<String>) {
model("box")
}
testClass<AbstractParcelizeBytecodeListingTest> {
model("codegen")
}
testClass<AbstractParcelizeIrBytecodeListingTest> {
model("codegen")
}
@@ -2,7 +2,8 @@
* 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.ir
package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.*
@@ -2,7 +2,8 @@
* 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.ir
package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.common.ir.addExtensionReceiver
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.
*/
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.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.
*/
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.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.
*/
package org.jetbrains.kotlin.parcelize.ir
package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer
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.IrPluginContext
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.parcelize.ir.AndroidSymbols
import org.jetbrains.kotlin.parcelize.ir.ParcelizeFirIrTransformer
class ParcelizeFirIrGeneratorExtension : IrGenerationExtension {
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.
*/
package org.jetbrains.kotlin.parcelize.ir
package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
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.render
import org.jetbrains.kotlin.parcelize.ParcelizeNames.PARCELER_FQN
import org.jetbrains.kotlin.parcelize.ParcelizeSyntheticComponent
import org.jetbrains.kotlin.parcelize.fir.ParcelizePluginKey
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.IrPluginContext
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.parcelize.ir.AndroidSymbols
import org.jetbrains.kotlin.parcelize.ir.ParcelizeIrTransformer
class ParcelizeIrGeneratorExtension : IrGenerationExtension {
override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) {
@@ -17,4 +15,3 @@ class ParcelizeIrGeneratorExtension : IrGenerationExtension {
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.
*/
package org.jetbrains.kotlin.parcelize.ir
package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
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.PARCELER_FQN
import org.jetbrains.kotlin.parcelize.ParcelizeNames.WRITE_TO_PARCEL_NAME
import org.jetbrains.kotlin.parcelize.ParcelizeSyntheticComponent
@OptIn(ObsoleteDescriptorBasedAPI::class)
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.
*/
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.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.
*/
package org.jetbrains.kotlin.parcelize.ir
package org.jetbrains.kotlin.parcelize
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
@@ -6,8 +6,6 @@
package org.jetbrains.kotlin.parcelize
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.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
@@ -24,14 +22,12 @@ import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension
class ParcelizeComponentRegistrar : CompilerPluginRegistrar() {
companion object {
fun registerParcelizeComponents(extensionStorage: ExtensionStorage, useFir: Boolean) = with(extensionStorage) {
ExpressionCodegenExtension.registerExtension(ParcelizeCodegenExtension())
if (useFir) {
IrGenerationExtension.registerExtension(ParcelizeFirIrGeneratorExtension())
} else {
IrGenerationExtension.registerExtension(ParcelizeIrGeneratorExtension())
}
SyntheticResolveExtension.registerExtension(ParcelizeResolveExtension())
ClassBuilderInterceptorExtension.registerExtension(ParcelizeClinitClassBuilderInterceptorExtension())
StorageComponentContainerContributor.registerExtension(ParcelizeDeclarationCheckerComponentContainerContributor())
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.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.NEW_ARRAY_NAME
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.extensions.SyntheticResolveExtension
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.SimpleType
import org.jetbrains.kotlin.types.error.ErrorTypeKind
import org.jetbrains.kotlin.types.error.ErrorUtils
open class ParcelizeResolveExtension : SyntheticResolveExtension {
companion object {
@@ -53,11 +52,6 @@ open class ParcelizeResolveExtension : SyntheticResolveExtension {
return module.findClassAcrossModuleDependencies(PARCEL_ID)?.defaultType
}
fun resolveParcelableCreatorClassType(module: ModuleDescriptor): SimpleType? {
val creatorClassId = CREATOR_ID
return module.findClassAcrossModuleDependencies(creatorClassId)?.defaultType
}
fun createMethod(
classDescriptor: ClassDescriptor,
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>(
FrontendKinds.ClassicFrontend,
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.test.builders.TestConfigurationBuilder
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
open class AbstractParcelizeBytecodeListingTest : AbstractAsmLikeInstructionListingTest() {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
builder.configureParcelizeSpecific()
}
}
open class AbstractParcelizeIrBytecodeListingTest : AbstractIrAsmLikeInstructionListingTest() {
override fun configure(builder: TestConfigurationBuilder) {
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)
}
}