diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 6de8cd34231..5fa4cb3e698 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -392,10 +392,12 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (context.closure != null) genClosureFields(context.closure, v, typeMapper); - if (state.getClassBuilderMode() == ClassBuilderMode.LIGHT_CLASSES) return; - for (ExpressionCodegenExtension extension : ExpressionCodegenExtension.Companion.getInstances(state.getProject())) { - extension.generateClassSyntheticParts(this); + if (state.getClassBuilderMode() != ClassBuilderMode.LIGHT_CLASSES + || extension.getShouldGenerateClassSyntheticPartsInLightClassesMode() + ) { + extension.generateClassSyntheticParts(this); + } } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/extensions/ExpressionCodegenExtension.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/extensions/ExpressionCodegenExtension.kt index b6a9148a036..0ff3094f2fb 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/extensions/ExpressionCodegenExtension.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/extensions/ExpressionCodegenExtension.kt @@ -47,4 +47,7 @@ interface ExpressionCodegenExtension { fun applyFunction(receiver: StackValue, resolvedCall: ResolvedCall<*>, c: Context): StackValue? = null fun generateClassSyntheticParts(codegen: ImplementationBodyCodegen) {} + + val shouldGenerateClassSyntheticPartsInLightClassesMode: Boolean + get() = false } \ No newline at end of file diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightFieldImpl.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightFieldImpl.kt index 2f27a57175a..0ba552e8d6f 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightFieldImpl.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightFieldImpl.kt @@ -113,7 +113,7 @@ sealed class KtLightFieldImpl( fun lazy( dummyDelegate: PsiField, - origin: LightMemberOriginForDeclaration, + origin: LightMemberOriginForDeclaration?, containingClass: KtLightClass, computeRealDelegate: () -> PsiField ): KtLightField { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/IDELightClassContexts.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/IDELightClassContexts.kt index 1c0078f7b81..08061f141a7 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/IDELightClassContexts.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/IDELightClassContexts.kt @@ -327,8 +327,11 @@ object IDELightClassContexts { private val annotationsThatAffectCodegen = listOf( "JvmField", "JvmOverloads", "JvmName", "JvmStatic", "Synchronized", "Transient", "Volatile", "Strictfp" - ).map { FqName("kotlin.jvm").child(Name.identifier(it)) } + FqName("kotlin.PublishedApi") + FqName("kotlin.Deprecated") + FqName("kotlin.internal.InlineOnly") - + ).map { FqName("kotlin.jvm").child(Name.identifier(it)) } + + FqName("kotlin.PublishedApi") + + FqName("kotlin.Deprecated") + + FqName("kotlin.internal.InlineOnly") + + FqName("kotlinx.android.parcel.Parcelize") } class AdHocAnnotationResolver( diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/LazyLightClassDataHolder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/LazyLightClassDataHolder.kt index 477a6360d8a..9d2836110a9 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/LazyLightClassDataHolder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/lightClasses/LazyLightClassDataHolder.kt @@ -95,7 +95,7 @@ sealed class LazyLightClassDataHolder( if (dummyDelegate == null) return KtLightFieldImpl.fromClsFields(clsDelegate, containingClass) return dummyDelegate!!.fields.map { dummyField -> - val fieldOrigin = KtLightFieldImpl.getOrigin(dummyField)!! + val fieldOrigin = KtLightFieldImpl.getOrigin(dummyField) val fieldName = dummyField.name!! KtLightFieldImpl.lazy(dummyField, fieldOrigin, containingClass) { diff --git a/idea/idea-android/tests/org/jetbrains/kotlin/android/lint/AbstractKotlinLintTest.kt b/idea/idea-android/tests/org/jetbrains/kotlin/android/lint/AbstractKotlinLintTest.kt index 33a62bf4159..0acc40b7c13 100644 --- a/idea/idea-android/tests/org/jetbrains/kotlin/android/lint/AbstractKotlinLintTest.kt +++ b/idea/idea-android/tests/org/jetbrains/kotlin/android/lint/AbstractKotlinLintTest.kt @@ -33,10 +33,12 @@ abstract class AbstractKotlinLintTest : KotlinAndroidTestCase() { AndroidLintInspectionBase.invalidateInspectionShortName2IssueMap() (myFixture as CodeInsightTestFixtureImpl).setVirtualFileFilter { false } // Allow access to tree elements. ConfigLibraryUtil.configureKotlinRuntime(myModule) + ConfigLibraryUtil.addLibrary(myModule, "androidExtensionsRuntime", "dist/kotlinc/lib", arrayOf("android-extensions-runtime.jar")) } override fun tearDown() { ConfigLibraryUtil.unConfigureKotlinRuntime(myModule) + ConfigLibraryUtil.removeLibrary(myModule, "androidExtensionsRuntime") super.tearDown() } diff --git a/idea/testData/android/lint/parcel.kt b/idea/testData/android/lint/parcel.kt index 600130a0df3..84e3e4faba6 100644 --- a/idea/testData/android/lint/parcel.kt +++ b/idea/testData/android/lint/parcel.kt @@ -3,6 +3,7 @@ @file:Suppress("UsePropertyAccessSyntax", "UNUSED_VARIABLE", "unused", "UNUSED_PARAMETER", "DEPRECATION") import android.os.Parcel import android.os.Parcelable +import kotlinx.android.parcel.Parcelize class MyParcelable1 : Parcelable { override fun describeContents() = 0 @@ -98,3 +99,6 @@ internal abstract class MyParcelable4 : Parcelable { override fun describeContents() = 0 override fun writeToParcel(arg0: Parcel, arg1: Int) {} } + +@Parcelize +class ParcelizeUser(val firstName: String, val lastName: String) : Parcelable \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt index a5e7ee00f00..eee9aa3ca6e 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableClinitClassBuilderInterceptorExtension.kt @@ -144,7 +144,7 @@ class ParcelableClinitClassBuilderInterceptorExtension : ClassBuilderInterceptor iv.anew(creatorType) iv.dup() iv.invokespecial(creatorName, "", "()V", false) - iv.putstatic(parcelableName, "CREATOR", creatorType.descriptor) + iv.putstatic(parcelableName, "CREATOR", "Landroid/os/Parcelable\$Creator;") } super.visitInsn(opcode) diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt index 7bec740109b..862d5e0d273 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableCodegenExtension.kt @@ -1,3 +1,5 @@ + +package org.jetbrains.kotlin.android.parcel /* * Copyright 2010-2017 JetBrains s.r.o. * @@ -14,10 +16,9 @@ * limitations under the License. */ -package org.jetbrains.kotlin.android.parcel - import kotlinx.android.parcel.TypeParceler import org.jetbrains.kotlin.android.parcel.ParcelableResolveExtension.Companion.createMethod +import org.jetbrains.kotlin.android.parcel.ParcelableSyntheticComponent.* import org.jetbrains.kotlin.android.parcel.serializers.* import org.jetbrains.kotlin.android.parcel.ParcelableSyntheticComponent.ComponentKind.* import org.jetbrains.kotlin.builtins.KotlinBuiltIns @@ -57,10 +58,14 @@ import java.io.FileDescriptor open class ParcelableCodegenExtension : ExpressionCodegenExtension { private companion object { private val FILE_DESCRIPTOR_FQNAME = FqName(FileDescriptor::class.java.canonicalName) + private val CREATOR_NAME = Name.identifier("CREATOR") } protected open fun isExperimental(element: KtElement) = true + override val shouldGenerateClassSyntheticPartsInLightClassesMode: Boolean + get() = true + override fun generateClassSyntheticParts(codegen: ImplementationBodyCodegen) { val parcelableClass = codegen.descriptor if (!parcelableClass.isParcelize) return @@ -68,24 +73,60 @@ open class ParcelableCodegenExtension : ExpressionCodegenExtension { val sourceElement = (codegen.myClass as? KtClassOrObject) ?: return if (!isExperimental(sourceElement)) return - assert(parcelableClass.kind == ClassKind.CLASS || parcelableClass.kind == ClassKind.OBJECT) + if (parcelableClass.kind != ClassKind.CLASS && parcelableClass.kind != ClassKind.OBJECT) return val propertiesToSerialize = getPropertiesToSerialize(codegen, parcelableClass) - val parcelClassType = ParcelableResolveExtension.resolveParcelClassType(parcelableClass.module) - val parcelAsmType = codegen.typeMapper.mapType(parcelClassType) - val parcelerObject = parcelableClass.companionObjectDescriptor?.takeIf { TypeUtils.getAllSupertypes(it.defaultType).any { it.isParceler } } with (parcelableClass) { - writeDescribeContentsFunction(codegen, propertiesToSerialize) - writeWriteToParcel(codegen, propertiesToSerialize, parcelAsmType, parcelerObject) + if (hasSyntheticDescribeContents()) { + writeDescribeContentsFunction(codegen, propertiesToSerialize) + } + + if (hasSyntheticWriteToParcel()) { + writeWriteToParcel(codegen, propertiesToSerialize, PARCEL_TYPE, parcelerObject) + } + + if (!hasCreatorField()) { + writeCreatorAccessField(codegen) + } } - writeCreatorAccessField(codegen, parcelableClass) - writeCreatorClass(codegen, parcelableClass, parcelClassType, parcelAsmType, parcelerObject, propertiesToSerialize) + if (codegen.state.classBuilderMode != ClassBuilderMode.LIGHT_CLASSES) { + val parcelClassType = ParcelableResolveExtension.resolveParcelClassType(parcelableClass.module) + ?: error("Can't resolve 'android.os.Parcel' class") + + writeCreatorClass(codegen, parcelableClass, parcelClassType, PARCEL_TYPE, parcelerObject, propertiesToSerialize) + } + } + + private fun ClassDescriptor.hasCreatorField(): Boolean { + val companionObject = companionObjectDescriptor ?: return false + + if (companionObject.name == CREATOR_NAME) { + return true + } + + return companionObject.unsubstitutedMemberScope + .getContributedVariables(CREATOR_NAME, NoLookupLocation.FROM_BACKEND) + .isNotEmpty() + } + + private fun ClassDescriptor.hasSyntheticDescribeContents() = hasParcelizeSyntheticMethod(ComponentKind.DESCRIBE_CONTENTS) + + private fun ClassDescriptor.hasSyntheticWriteToParcel() = hasParcelizeSyntheticMethod(ComponentKind.WRITE_TO_PARCEL) + + private fun ClassDescriptor.hasParcelizeSyntheticMethod(componentKind: ParcelableSyntheticComponent.ComponentKind): Boolean { + val methodName = Name.identifier(componentKind.methodName) + + val writeToParcelMethods = unsubstitutedMemberScope + .getContributedFunctions(methodName, NoLookupLocation.FROM_BACKEND) + .filter { it is ParcelableSyntheticComponent && it.componentKind == componentKind } + + return writeToParcelMethods.size == 1 } private fun getCompanionClassType(containerAsmType: Type, parcelerObject: ClassDescriptor): Pair { @@ -166,11 +207,10 @@ open class ParcelableCodegenExtension : ExpressionCodegenExtension { codegen: ImplementationBodyCodegen, parcelableClass: ClassDescriptor ): List { - val constructor = parcelableClass.constructors.first { it.isPrimary } + val constructor = parcelableClass.constructors.firstOrNull { it.isPrimary } ?: return emptyList() - val propertiesToSerialize = constructor.valueParameters.map { param -> + val propertiesToSerialize = constructor.valueParameters.mapNotNull { param -> codegen.bindingContext[BindingContext.VALUE_PARAMETER_AS_PROPERTY, param] - ?: error("Value parameter should have 'val' or 'var' keyword") } val classParcelers = getTypeParcelers(parcelableClass.annotations) @@ -228,12 +268,11 @@ open class ParcelableCodegenExtension : ExpressionCodegenExtension { } } - private fun writeCreatorAccessField(codegen: ImplementationBodyCodegen, parcelableClass: ClassDescriptor) { - val parcelableAsmType = codegen.typeMapper.mapType(parcelableClass.defaultType) - val creatorAsmType = Type.getObjectType(parcelableAsmType.internalName + "\$Creator") + private fun writeCreatorAccessField(codegen: ImplementationBodyCodegen) { + val creatorType = Type.getObjectType("android/os/Parcelable\$Creator") codegen.v.newField(JvmDeclarationOrigin.NO_ORIGIN, ACC_STATIC or ACC_PUBLIC or ACC_FINAL, "CREATOR", - creatorAsmType.descriptor, null, null) + creatorType.descriptor, null, null) } private fun writeCreatorClass( diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableResolveExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableResolveExtension.kt index 1cbd3b1605c..f740edcf959 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableResolveExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/ParcelableResolveExtension.kt @@ -33,14 +33,14 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension import org.jetbrains.kotlin.resolve.source.PsiSourceElement +import org.jetbrains.kotlin.types.ErrorUtils import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.SimpleType open class ParcelableResolveExtension : SyntheticResolveExtension { companion object { - fun resolveParcelClassType(module: ModuleDescriptor): SimpleType { - return module.findClassAcrossModuleDependencies( - ClassId.topLevel(FqName("android.os.Parcel")))?.defaultType ?: error("Can't resolve 'android.os.Parcel' class") + fun resolveParcelClassType(module: ModuleDescriptor): SimpleType? { + return module.findClassAcrossModuleDependencies(ClassId.topLevel(FqName("android.os.Parcel")))?.defaultType } fun createMethod( @@ -103,7 +103,7 @@ open class ParcelableResolveExtension : SyntheticResolveExtension { && result.none { it.isWriteToParcel() } ) { val builtIns = clazz.builtIns - val parcelClassType = resolveParcelClassType(clazz.module) + val parcelClassType = resolveParcelClassType(clazz.module) ?: ErrorUtils.createErrorType("Unresolved 'Parcel' type") result += createMethod(clazz, WRITE_TO_PARCEL, builtIns.unitType, "parcel" to parcelClassType, "flags" to builtIns.intType) } } @@ -120,12 +120,11 @@ open class ParcelableResolveExtension : SyntheticResolveExtension { internal fun SimpleFunctionDescriptor.isWriteToParcel(): Boolean { return typeParameters.isEmpty() && valueParameters.size == 2 - && valueParameters[0].type.isParcel() + // Unfortunately, we can't check the first parameter cause it can be unresolved && KotlinBuiltIns.isInt(valueParameters[1].type) + && returnType?.let { KotlinBuiltIns.isUnit(it) } == true } -private fun KotlinType.isParcel() = constructor.declarationDescriptor?.fqNameSafe == ANDROID_PARCEL_CLASS_FQNAME - interface ParcelableSyntheticComponent { val componentKind: ComponentKind diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializers.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializers.kt index 0e26e0b633e..d4dfaeec534 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializers.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializers.kt @@ -534,7 +534,7 @@ internal class EfficientParcelableParcelSerializer(override val asmType: Type, p override fun readValue(v: InstructionAdapter) { // -> parcel - v.getstatic(asmType.internalName, "CREATOR", creatorAsmType.descriptor) // -> parcel, creator + v.getstatic(asmType.internalName, "CREATOR", "Landroid/os/Parcelable\$Creator;") // -> parcel, creator v.swap() // -> creator, parcel v.invokeinterface("android/os/Parcelable\$Creator", "createFromParcel", "(Landroid/os/Parcel;)Ljava/lang/Object;") v.castIfNeeded(asmType) diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AbstractAndroidExtensionsExpressionCodegenExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AbstractAndroidExtensionsExpressionCodegenExtension.kt index 80848a00418..3a32f0655ec 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AbstractAndroidExtensionsExpressionCodegenExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AbstractAndroidExtensionsExpressionCodegenExtension.kt @@ -24,10 +24,7 @@ import org.jetbrains.kotlin.android.synthetic.descriptors.ContainerOptionsProxy import org.jetbrains.kotlin.android.synthetic.descriptors.AndroidSyntheticPackageFragmentDescriptor import org.jetbrains.kotlin.android.synthetic.res.AndroidSyntheticFunction import org.jetbrains.kotlin.android.synthetic.res.AndroidSyntheticProperty -import org.jetbrains.kotlin.codegen.ClassBuilder -import org.jetbrains.kotlin.codegen.FunctionCodegen -import org.jetbrains.kotlin.codegen.ImplementationBodyCodegen -import org.jetbrains.kotlin.codegen.StackValue +import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.* diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/IBinderIInterface.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/IBinderIInterface.txt index c0a7ffbda44..6cb98345b1d 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/IBinderIInterface.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/IBinderIInterface.txt @@ -50,7 +50,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato } public final class User : java/lang/Object, android/os/Parcelable { - public final static User$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final android.os.IBinder binder diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.txt index e9cba7fb9ac..900f3bc4755 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customDescribeContents.txt @@ -7,7 +7,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato } public final class User : java/lang/Object, android/os/Parcelable { - public final static User$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final int age diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesDifferentModule.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesDifferentModule.txt index 236e35ee066..63b8b5d0c76 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesDifferentModule.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesDifferentModule.txt @@ -22,7 +22,7 @@ public final class test/Foo$Creator : java/lang/Object, android/os/Parcelable$Cr } public final class test/Foo : java/lang/Object, android/os/Parcelable { - public final static test.Foo$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final android.accounts.Account kp @@ -30,7 +30,7 @@ public final class test/Foo : java/lang/Object, android/os/Parcelable { NEW DUP INVOKESPECIAL (test/Foo$Creator, , ()V) - PUTSTATIC (CREATOR, Ltest/Foo$Creator;) + PUTSTATIC (CREATOR, Landroid/os/Parcelable$Creator;) RETURN } diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesSameModule.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesSameModule.txt index 065028d8ec5..0e2875b515d 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesSameModule.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customParcelablesSameModule.txt @@ -112,7 +112,7 @@ public final class test/Foo$Creator : java/lang/Object, android/os/Parcelable$Cr NEW DUP ALOAD (1) - GETSTATIC (CREATOR, Lk/KotlinParcelable$Creator;) + GETSTATIC (CREATOR, Landroid/os/Parcelable$Creator;) SWAP INVOKEINTERFACE (android/os/Parcelable$Creator, createFromParcel, (Landroid/os/Parcel;)Ljava/lang/Object;) CHECKCAST @@ -125,7 +125,7 @@ public final class test/Foo$Creator : java/lang/Object, android/os/Parcelable$Cr } public final class test/Foo : java/lang/Object, android/os/Parcelable { - public final static test.Foo$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final k.KotlinParcelable kp @@ -133,7 +133,7 @@ public final class test/Foo : java/lang/Object, android/os/Parcelable { NEW DUP INVOKESPECIAL (test/Foo$Creator, , ()V) - PUTSTATIC (CREATOR, Ltest/Foo$Creator;) + PUTSTATIC (CREATOR, Landroid/os/Parcelable$Creator;) RETURN } diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.txt index 126536780b7..598b360c1b0 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimple.txt @@ -58,7 +58,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato } public final class User : java/lang/Object, android/os/Parcelable { - public final static User$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR public final static User$Companion Companion diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.txt index 50192d4f828..029315ad9c4 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/customSimpleWithNewArray.txt @@ -47,7 +47,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato } public final class User : java/lang/Object, android/os/Parcelable { - public final static User$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR public final static User$Companion Companion diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.txt index 9573414eabb..d5047e06731 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/describeContentsFromSuperType.txt @@ -19,7 +19,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato } public final class User : AbstractUser { - public final static User$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final int age diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/duplicatingClinit.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/duplicatingClinit.txt index fa037ea2387..2d01e7b4cca 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/duplicatingClinit.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/duplicatingClinit.txt @@ -19,7 +19,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato } public final class User : java/lang/Object, android/os/Parcelable { - public final static User$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR public final static User$Companion Companion @@ -42,7 +42,7 @@ public final class User : java/lang/Object, android/os/Parcelable { NEW DUP INVOKESPECIAL (User$Creator, , ()V) - PUTSTATIC (CREATOR, LUser$Creator;) + PUTSTATIC (CREATOR, Landroid/os/Parcelable$Creator;) RETURN } diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.txt index dbd265cbe58..a3ded3d4d04 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.txt @@ -7,7 +7,7 @@ public final class Test$Creator : java/lang/Object, android/os/Parcelable$Creato } public final class Test : java/lang/Object { - public final static Test$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final java.util.List names diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/nullableNotNullSize.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/nullableNotNullSize.txt index 2ca4f0f4d43..9154808b4b6 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/nullableNotNullSize.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/nullableNotNullSize.txt @@ -7,7 +7,7 @@ public final class TestNotNull$Creator : java/lang/Object, android/os/Parcelable } public final class TestNotNull : java/lang/Object { - public final static TestNotNull$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final android.util.Size a @@ -42,7 +42,7 @@ public final class TestNullable$Creator : java/lang/Object, android/os/Parcelabl } public final class TestNullable : java/lang/Object { - public final static TestNullable$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final android.util.Size a diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.kt index c558e98ae21..ca06ed32acd 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.kt @@ -1,6 +1,25 @@ // CURIOUS_ABOUT writeToParcel, createFromParcel, // WITH_RUNTIME +//FILE: test/JavaClass.java +package test; + +class JavaClass { + void test() { + // Here we test access to CREATOR + Object o = Foo.CREATOR; + } +} + +//FILE: android/os/Parcelable.java +package android.os; + +public interface Parcelable { + public static interface Creator {} +} + + +//FILE: test.kt package test import kotlinx.android.parcel.* diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.txt index 25e8aaa4213..87f1624224d 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/parcelable.txt @@ -21,7 +21,7 @@ public final class test/Foo$Creator : java/lang/Object, android/os/Parcelable$Cr } public final class test/Foo : java/lang/Object, android/os/Parcelable { - public final static test.Foo$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final android.os.Parcelable parcelable @@ -29,7 +29,7 @@ public final class test/Foo : java/lang/Object, android/os/Parcelable { NEW DUP INVOKESPECIAL (test/Foo$Creator, , ()V) - PUTSTATIC (CREATOR, Ltest/Foo$Creator;) + PUTSTATIC (CREATOR, Landroid/os/Parcelable$Creator;) RETURN } diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.txt index 6edf24e7ff4..95027105de8 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/serializable.txt @@ -35,7 +35,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato } public final class User : java/lang/Object, android/os/Parcelable { - public final static User$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final SerializableSimple notNull @@ -45,7 +45,7 @@ public final class User : java/lang/Object, android/os/Parcelable { NEW DUP INVOKESPECIAL (User$Creator, , ()V) - PUTSTATIC (CREATOR, LUser$Creator;) + PUTSTATIC (CREATOR, Landroid/os/Parcelable$Creator;) RETURN } diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt index acbb849af0b..b8c518077e8 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simple.txt @@ -36,7 +36,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato } public final class User : java/lang/Object, android/os/Parcelable { - public final static User$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final int age @@ -50,7 +50,7 @@ public final class User : java/lang/Object, android/os/Parcelable { NEW DUP INVOKESPECIAL (User$Creator, , ()V) - PUTSTATIC (CREATOR, LUser$Creator;) + PUTSTATIC (CREATOR, Landroid/os/Parcelable$Creator;) RETURN } diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.txt index 797fc84e2f4..04f43789eae 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.txt @@ -7,7 +7,7 @@ public final class Test$Creator : java/lang/Object, android/os/Parcelable$Creato } public final class Test : java/lang/Object { - public final static Test$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final java.util.List names diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/size.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/size.txt index 9aa7c64f331..3746b0e298d 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/size.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/size.txt @@ -29,7 +29,7 @@ public final class Test$Creator : java/lang/Object, android/os/Parcelable$Creato } public final class Test : java/lang/Object, android/os/Parcelable { - public final static Test$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final android.util.Size nullable @@ -119,7 +119,7 @@ public final class TestF$Creator : java/lang/Object, android/os/Parcelable$Creat } public final class TestF : java/lang/Object, android/os/Parcelable { - public final static TestF$Creator CREATOR + public final static android.os.Parcelable$Creator CREATOR private final android.util.SizeF nullable diff --git a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/ParcelDetector.java b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/ParcelDetector.java index e5b66dbfa57..0543b7365df 100644 --- a/plugins/lint/lint-checks/src/com/android/tools/klint/checks/ParcelDetector.java +++ b/plugins/lint/lint-checks/src/com/android/tools/klint/checks/ParcelDetector.java @@ -95,11 +95,6 @@ public class ParcelDetector extends Detector implements Detector.UastScanner { return; } - // Do not report errors on our Android Extensions-improved Parcelables - if (declaration.findAnnotation(Parcelize.class.getName()) != null) { - return; - } - PsiField field = declaration.findFieldByName("CREATOR", false); if (field == null) { Location location = context.getUastNameLocation(declaration);