diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 70570e4b4e3f2..78e7d94fdf5fc 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -21,12 +21,6 @@ - - - - - - @@ -39,6 +33,12 @@ + + + + + + @@ -159,10 +159,22 @@ - - - - + + + + + + + + + + + + + + + + @@ -171,12 +183,6 @@ - - - - - - @@ -201,16 +207,10 @@ - - - - - - - - - - + + + + @@ -807,18 +807,18 @@ - - - - - - + + + + + + @@ -885,6 +885,12 @@ + + + + + + @@ -945,12 +951,6 @@ - - - - - - @@ -981,6 +981,12 @@ + + + + + + @@ -1029,12 +1035,6 @@ - - - - - - @@ -1095,6 +1095,12 @@ + + + + + + @@ -1161,18 +1167,18 @@ - - - - - - + + + + + + @@ -2457,18 +2463,6 @@ - - - - - - - - - - - - @@ -2583,24 +2577,12 @@ - - - - - - - - - - - - @@ -2685,12 +2667,6 @@ - - - - - - @@ -2703,12 +2679,6 @@ - - - - - - @@ -2727,12 +2697,6 @@ - - - - - - @@ -2751,18 +2715,6 @@ - - - - - - - - - - - - @@ -2799,30 +2751,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -2847,12 +2775,6 @@ - - - - - - @@ -2931,42 +2853,18 @@ - - - - - - - - - - - - - - - - - - - - - - - - @@ -3009,18 +2907,18 @@ - - - - - - + + + + + + @@ -3129,18 +3027,6 @@ - - - - - - - - - - - - @@ -3159,12 +3045,6 @@ - - - - - - @@ -3213,6 +3093,12 @@ + + + + + + @@ -3291,12 +3177,6 @@ - - - - - - @@ -5549,12 +5429,6 @@ - - - - - - @@ -5603,12 +5477,6 @@ - - - - - - @@ -5627,12 +5495,6 @@ - - - - - - @@ -5681,58 +5543,88 @@ - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5863,6 +5755,12 @@ + + + + + + diff --git a/gradle/versions.properties b/gradle/versions.properties index 903ff4bcfd46a..91588a1484f2d 100644 --- a/gradle/versions.properties +++ b/gradle/versions.properties @@ -40,7 +40,7 @@ versions.kotlinx-metadata-klib=0.0.1-dev-10 versions.native-platform=0.14 versions.protobuf-relocated=2.6.1-2 versions.r8=2.2.64 -versions.robolectric=4.0 +versions.robolectric=4.16 versions.nodejs=25.0.0 versions.nodejs.lts=24.10.0 versions.nodejs.for.building.wasm.debug.browsers=22.0.0 diff --git a/plugins/parcelize/parcelize-compiler/build.gradle.kts b/plugins/parcelize/parcelize-compiler/build.gradle.kts index e2d3ba5f439a1..9e9a35ab6f42e 100644 --- a/plugins/parcelize/parcelize-compiler/build.gradle.kts +++ b/plugins/parcelize/parcelize-compiler/build.gradle.kts @@ -1,4 +1,5 @@ import org.jetbrains.kotlin.build.androidsdkprovisioner.ProvisioningType +import java.util.zip.ZipFile description = "Parcelize compiler plugin" @@ -9,7 +10,42 @@ plugins { id("project-tests-convention") } -val robolectricClasspath by configurations.creating +repositories { + google() +} + +@CacheableTransform +/** + * Used to unpack the `classes.jar` from `.aar` artifacts. + * + * See `androidx.test:monitor` package below. + */ +abstract class AarToJarTransform : TransformAction { + @get:InputArtifact + @get:PathSensitive(PathSensitivity.RELATIVE) + abstract val inputAar: Provider + + override fun transform(outputs: TransformOutputs) { + val aarFile = inputAar.get().asFile + ZipFile(aarFile).use { zip -> + val classesJarEntry = zip.getEntry("classes.jar") + if (classesJarEntry != null) { + val outputJar = outputs.file("${aarFile.nameWithoutExtension}-classes.jar") + zip.getInputStream(classesJarEntry).use { inputStream -> + outputJar.outputStream().use { outputStream -> + inputStream.copyTo(outputStream) + } + } + } + } + } +} + +val robolectricClasspath by configurations.creating { + attributes { + attribute(Attribute.of("artifactType", String::class.java), "jar") + } +} val robolectricDependency by configurations.creating val parcelizeRuntimeForTests by configurations.creating @@ -17,6 +53,10 @@ val layoutLib by configurations.creating val layoutLibApi by configurations.creating dependencies { + registerTransform(AarToJarTransform::class.java) { + from.attribute(Attribute.of("artifactType", String::class.java), "aar") + to.attribute(Attribute.of("artifactType", String::class.java), "jar") + } embedded(project(":plugins:parcelize:parcelize-compiler:parcelize.common")) { isTransitive = false } embedded(project(":plugins:parcelize:parcelize-compiler:parcelize.k1")) { isTransitive = false } embedded(project(":plugins:parcelize:parcelize-compiler:parcelize.k2")) { isTransitive = false } @@ -44,9 +84,14 @@ dependencies { testRuntimeOnly(toolsJar()) testFixturesApi(libs.junit4) - robolectricDependency("org.robolectric:android-all:5.0.2_r3-robolectric-r0") + // Must be kept in sync with ANDROID_API_VERSION in ParcelizeRuntimeClasspathProvider. + // The dependency version defined here determines the Android API version. + robolectricDependency("org.robolectric:android-all-instrumented:16-robolectric-13921718-i7") robolectricClasspath(commonDependency("org.robolectric", "robolectric")) + + // This dependency is an `.aar` file. + robolectricClasspath("androidx.test:monitor:1.8.0") robolectricClasspath(project(":plugins:parcelize:parcelize-runtime")) { isTransitive = false } parcelizeRuntimeForTests(project(":plugins:parcelize:parcelize-runtime")) { isTransitive = false } diff --git a/plugins/parcelize/parcelize-compiler/testData/box/additionalAnnotationTrigger.kt b/plugins/parcelize/parcelize-compiler/testData/box/additionalAnnotationTrigger.kt index 80eb3f1397715..f0dc80a953a8a 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/additionalAnnotationTrigger.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/additionalAnnotationTrigger.kt @@ -1,4 +1,3 @@ -// TARGET_BACKEND: JVM_IR // WITH_STDLIB @file:JvmName("TestKt") diff --git a/plugins/parcelize/parcelize-compiler/testData/box/changingBaseClassProperty.kt b/plugins/parcelize/parcelize-compiler/testData/box/changingBaseClassProperty.kt index 2f6e76adeee6a..dc54b2d5d7832 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/changingBaseClassProperty.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/changingBaseClassProperty.kt @@ -1,5 +1,4 @@ // WITH_STDLIB -// IGNORE K1 @file:JvmName("TestKt") package test diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt19747.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt19747.kt index 86b6fc0c3a36d..62fbda71a2b1c 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/kt19747.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt19747.kt @@ -18,18 +18,12 @@ class J(val j: @RawValue JHelp) : Parcelable fun box() = parcelTest { parcel -> val test = J(JHelp("A")) - var exceptionCaught = false try { test.writeToParcel(parcel, 0) - } catch (e: RuntimeException) { - if (e.message!!.contains("Parcel: unable to marshal value test.JHelp")) { - exceptionCaught = true - } else { - throw e + } catch (e: IllegalArgumentException) { + val isExpectedErrorMessage = e.message!!.contains("Parcel: unknown type for value test.JHelp") + if (!isExpectedErrorMessage) { + error("Unexpected error: ${e.toString()}") } } - - if (!exceptionCaught) { - error("Exception should be thrown") - } } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/kt19747Deprecated.kt b/plugins/parcelize/parcelize-compiler/testData/box/kt19747Deprecated.kt index 65bbfcd39ace1..b2c3777d3a827 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/kt19747Deprecated.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/kt19747Deprecated.kt @@ -19,18 +19,12 @@ class J(val j: @RawValue JHelp) : Parcelable fun box() = parcelTest { parcel -> val test = J(JHelp("A")) - var exceptionCaught = false try { test.writeToParcel(parcel, 0) } catch (e: RuntimeException) { - if (e.message!!.contains("Parcel: unable to marshal value test.JHelp")) { - exceptionCaught = true - } else { - throw e + val isExpectedErrorMessage = e.message!!.contains("Parcel: unknown type for value test.JHelp") + if (!isExpectedErrorMessage) { + error("Unexpected error: ${e.toString()}") } } - - if (!exceptionCaught) { - error("Exception should be thrown") - } } \ No newline at end of file diff --git a/plugins/parcelize/parcelize-compiler/testData/box/listKinds.kt b/plugins/parcelize/parcelize-compiler/testData/box/listKinds.kt index c267479bc884d..1fdd69ea682dd 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/listKinds.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/listKinds.kt @@ -1,5 +1,4 @@ // WITH_STDLIB -// FULL_JDK @file:JvmName("TestKt") package test diff --git a/plugins/parcelize/parcelize-compiler/testData/box/mapKinds.kt b/plugins/parcelize/parcelize-compiler/testData/box/mapKinds.kt index ef00022e1989d..24907c89ae0f7 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/mapKinds.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/mapKinds.kt @@ -1,5 +1,4 @@ // WITH_STDLIB -// FULL_JDK @file:JvmName("TestKt") package test diff --git a/plugins/parcelize/parcelize-compiler/testData/box/mppAdditionalAnnotations_k1.kt b/plugins/parcelize/parcelize-compiler/testData/box/mppAdditionalAnnotations_k1.kt index f218d6dac2b22..3c041a8b0a685 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/mppAdditionalAnnotations_k1.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/mppAdditionalAnnotations_k1.kt @@ -1,4 +1,3 @@ -// TARGET_BACKEND: JVM_IR // IGNORE_BACKEND_K2: ANY // LANGUAGE: +MultiPlatformProjects // WITH_STDLIB diff --git a/plugins/parcelize/parcelize-compiler/testData/box/mppAdditionalAnnotations_k2.kt b/plugins/parcelize/parcelize-compiler/testData/box/mppAdditionalAnnotations_k2.kt index 495a4defd3a1f..97f1d9dfa0e42 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/mppAdditionalAnnotations_k2.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/mppAdditionalAnnotations_k2.kt @@ -1,4 +1,3 @@ -// TARGET_BACKEND: JVM_IR // IGNORE_BACKEND_K1: ANY // LANGUAGE: +MultiPlatformProjects // WITH_STDLIB diff --git a/plugins/parcelize/parcelize-compiler/testData/box/mppWithExpectParcelable_k1.kt b/plugins/parcelize/parcelize-compiler/testData/box/mppWithExpectParcelable_k1.kt index 62f1a135e7a5e..b4cfa5f89a966 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/mppWithExpectParcelable_k1.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/mppWithExpectParcelable_k1.kt @@ -1,4 +1,3 @@ -// TARGET_BACKEND: JVM_IR // IGNORE_BACKEND_K2: ANY // LANGUAGE: +MultiPlatformProjects // WITH_STDLIB diff --git a/plugins/parcelize/parcelize-compiler/testData/box/mppWithExpectParcelable_k2.kt b/plugins/parcelize/parcelize-compiler/testData/box/mppWithExpectParcelable_k2.kt index 2f24b2f14d202..b557841898da2 100644 --- a/plugins/parcelize/parcelize-compiler/testData/box/mppWithExpectParcelable_k2.kt +++ b/plugins/parcelize/parcelize-compiler/testData/box/mppWithExpectParcelable_k2.kt @@ -1,4 +1,3 @@ -// TARGET_BACKEND: JVM_IR // IGNORE_BACKEND_K1: ANY // LANGUAGE: +MultiPlatformProjects // WITH_STDLIB diff --git a/plugins/parcelize/parcelize-compiler/testFixtures/org/jetbrains/kotlin/parcelize/test/runners/AbstractFirParcelizeBytecodeListingTest.kt b/plugins/parcelize/parcelize-compiler/testFixtures/org/jetbrains/kotlin/parcelize/test/runners/AbstractFirParcelizeBytecodeListingTest.kt index dc321e1e5435f..0b9660043ca45 100644 --- a/plugins/parcelize/parcelize-compiler/testFixtures/org/jetbrains/kotlin/parcelize/test/runners/AbstractFirParcelizeBytecodeListingTest.kt +++ b/plugins/parcelize/parcelize-compiler/testFixtures/org/jetbrains/kotlin/parcelize/test/runners/AbstractFirParcelizeBytecodeListingTest.kt @@ -8,8 +8,10 @@ package org.jetbrains.kotlin.parcelize.test.runners import org.jetbrains.kotlin.parcelize.test.services.ParcelizeDirectives.ENABLE_PARCELIZE import org.jetbrains.kotlin.test.runners.codegen.AbstractFirPsiAsmLikeInstructionListingTest import org.jetbrains.kotlin.parcelize.test.services.ParcelizeEnvironmentConfigurator +import org.jetbrains.kotlin.test.TestJdkKind import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives.FIR_DIFFERENCE +import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.JDK_KIND open class AbstractFirParcelizeBytecodeListingTest : AbstractFirPsiAsmLikeInstructionListingTest() { @@ -23,6 +25,8 @@ private fun TestConfigurationBuilder.configureParcelizeSpecific() { defaultDirectives { +FIR_DIFFERENCE +ENABLE_PARCELIZE + // Robolectric 4.16 (onward) with Android SDK 36 requires JDK 21 + JDK_KIND with TestJdkKind.FULL_JDK_21 } useConfigurators(::ParcelizeEnvironmentConfigurator) } diff --git a/plugins/parcelize/parcelize-compiler/testFixtures/org/jetbrains/kotlin/parcelize/test/runners/AbstractFirPsiParcelizeDiagnosticTest.kt b/plugins/parcelize/parcelize-compiler/testFixtures/org/jetbrains/kotlin/parcelize/test/runners/AbstractFirPsiParcelizeDiagnosticTest.kt index fcb45a56d5eee..db0a0cacd7493 100644 --- a/plugins/parcelize/parcelize-compiler/testFixtures/org/jetbrains/kotlin/parcelize/test/runners/AbstractFirPsiParcelizeDiagnosticTest.kt +++ b/plugins/parcelize/parcelize-compiler/testFixtures/org/jetbrains/kotlin/parcelize/test/runners/AbstractFirPsiParcelizeDiagnosticTest.kt @@ -8,9 +8,11 @@ package org.jetbrains.kotlin.parcelize.test.runners import org.jetbrains.kotlin.parcelize.test.services.ParcelizeDirectives.ENABLE_PARCELIZE import org.jetbrains.kotlin.parcelize.test.services.ParcelizeEnvironmentConfigurator import org.jetbrains.kotlin.test.FirParser +import org.jetbrains.kotlin.test.TestJdkKind import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives.ENABLE_PLUGIN_PHASES import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives.FIR_PARSER +import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.JDK_KIND import org.jetbrains.kotlin.test.frontend.fir.FirFailingTestSuppressor import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest import org.jetbrains.kotlin.test.configuration.baseFirDiagnosticTestConfiguration @@ -26,6 +28,8 @@ abstract class AbstractFirParcelizeDiagnosticTestBase(val parser: FirParser) : A +ENABLE_PARCELIZE +ENABLE_PLUGIN_PHASES FIR_PARSER with parser + // Robolectric 4.16 (onward) with Android SDK 36 requires JDK 21 + JDK_KIND with TestJdkKind.FULL_JDK_21 } useConfigurators(::ParcelizeEnvironmentConfigurator) diff --git a/plugins/parcelize/parcelize-compiler/testFixtures/org/jetbrains/kotlin/parcelize/test/runners/AbstractParcelizeBoxTest.kt b/plugins/parcelize/parcelize-compiler/testFixtures/org/jetbrains/kotlin/parcelize/test/runners/AbstractParcelizeBoxTest.kt index 26378259dcf65..87949b8401744 100644 --- a/plugins/parcelize/parcelize-compiler/testFixtures/org/jetbrains/kotlin/parcelize/test/runners/AbstractParcelizeBoxTest.kt +++ b/plugins/parcelize/parcelize-compiler/testFixtures/org/jetbrains/kotlin/parcelize/test/runners/AbstractParcelizeBoxTest.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.parcelize.test.services.ParcelizeUtilSourcesProvider import org.jetbrains.kotlin.test.Constructor import org.jetbrains.kotlin.test.FirParser import org.jetbrains.kotlin.test.TargetBackend +import org.jetbrains.kotlin.test.TestJdkKind import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor import org.jetbrains.kotlin.test.backend.handlers.IrTextDumpHandler import org.jetbrains.kotlin.test.backend.ir.BackendCliJvmFacade @@ -26,6 +27,7 @@ import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.REQUIRES_SEPAR import org.jetbrains.kotlin.test.directives.DiagnosticsDirectives.REPORT_ONLY_EXPLICITLY_DEFINED_DEBUG_INFO import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives.ENABLE_PLUGIN_PHASES +import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.JDK_KIND import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontend2IrConverter import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendFacade import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendOutputArtifact @@ -57,6 +59,8 @@ abstract class AbstractParcelizeBoxTestBase): File { + val resourceName = clazz.java.name.replace('.', '/') + ".class" + return File( + clazz.java.classLoader.getResource(resourceName)!!.file + .substringAfter("file:") + .substringBeforeLast('!') + ) + } }