From 7a9c59aeb521ec0681873fde10353ee5b0e19bd8 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 27 Dec 2022 22:56:18 +0100 Subject: [PATCH] JVM IR: do not serialize metadata for actualized optional expectations Optional-expectation annotations which have an actual counterpart should have never been serialized to the kotlin_module's proto. See for example the original (correct) implementation in the old JVM backend in `PackageCodegenImpl.addDescriptorToOptionalAnnotationsIfNeeded`. #KT-55611 Fixed --- ...platformJvmCompilerRunnerTestGenerated.java | 18 ++++++++++++++++++ .../jvm/lower/ProcessOptionalAnnotations.kt | 2 ++ .../optionalExpectationWithActual/actualA.kt | 6 ++++++ .../optionalExpectationWithActual/args.txt | 1 + .../jvmOnly/optionalExpectationWithActual/b.kt | 7 +++++++ .../optionalExpectationWithActual/b.kt.new.1 | 7 +++++++ .../optionalExpectationWithActual/b.kt.new.2 | 7 +++++++ .../optionalExpectationWithActual/build.log | 14 ++++++++++++++ .../optionalExpectationWithActual/expectA.kt | 7 +++++++ .../kotlinp/testData/OptionalAnnotation.kt | 6 ++++++ .../kotlinp/testData/OptionalAnnotation.txt | 9 +++++++++ 11 files changed, 84 insertions(+) create mode 100644 jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/actualA.kt create mode 100644 jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/args.txt create mode 100644 jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/b.kt create mode 100644 jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/b.kt.new.1 create mode 100644 jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/b.kt.new.2 create mode 100644 jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/build.log create mode 100644 jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/expectA.kt diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalMultiplatformJvmCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalMultiplatformJvmCompilerRunnerTestGenerated.java index 2750e185f63..473a8cd65bb 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalMultiplatformJvmCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalMultiplatformJvmCompilerRunnerTestGenerated.java @@ -85,6 +85,11 @@ public class IncrementalMultiplatformJvmCompilerRunnerTestGenerated extends Abst runTest("jps/jps-plugin/testData/incremental/mpp/jvmOnly/multifilePartChanged/"); } + @TestMetadata("optionalExpectationWithActual") + public void testOptionalExpectationWithActual() throws Exception { + runTest("jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/"); + } + @TestMetadata("jps/jps-plugin/testData/incremental/mpp/jvmOnly/multifilePartChanged") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) @@ -97,5 +102,18 @@ public class IncrementalMultiplatformJvmCompilerRunnerTestGenerated extends Abst KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("jps/jps-plugin/testData/incremental/mpp/jvmOnly/multifilePartChanged"), Pattern.compile("^([^\\.]+)$"), null, true); } } + + @TestMetadata("jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class OptionalExpectationWithActual extends AbstractIncrementalMultiplatformJvmCompilerRunnerTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInOptionalExpectationWithActual() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual"), Pattern.compile("^([^\\.]+)$"), null, true); + } + } } } diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ProcessOptionalAnnotations.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ProcessOptionalAnnotations.kt index 10074c7cfbc..f23d08ae602 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ProcessOptionalAnnotations.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ProcessOptionalAnnotations.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.jvm.ir.isOptionalAnnotationClass import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.resolve.multiplatform.OptionalAnnotationUtil internal val processOptionalAnnotationsPhase = makeIrModulePhase( ::ProcessOptionalAnnotations, @@ -30,6 +31,7 @@ class ProcessOptionalAnnotations(private val context: JvmBackendContext) : FileL private fun IrClass.registerOptionalAnnotations() { // TODO FirMetadataSource.Class val metadataSource = (metadata as? DescriptorMetadataSource.Class)?.descriptor ?: return + if (!OptionalAnnotationUtil.shouldGenerateExpectClass(metadataSource)) return context.state.factory.packagePartRegistry.optionalAnnotations += metadataSource declarations.forEach { diff --git a/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/actualA.kt b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/actualA.kt new file mode 100644 index 00000000000..634c8b758f5 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/actualA.kt @@ -0,0 +1,6 @@ +package org.example + +@OptIn(kotlin.ExperimentalMultiplatform::class) +@Target(AnnotationTarget.FILE) +@Retention(AnnotationRetention.SOURCE) +internal actual annotation class A diff --git a/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/args.txt b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/args.txt new file mode 100644 index 00000000000..4ed48ce4667 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/args.txt @@ -0,0 +1 @@ +-Xmulti-platform diff --git a/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/b.kt b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/b.kt new file mode 100644 index 00000000000..736f36874bf --- /dev/null +++ b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/b.kt @@ -0,0 +1,7 @@ +@file:A + +package org.example + +fun foo() { + // 1 +} diff --git a/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/b.kt.new.1 b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/b.kt.new.1 new file mode 100644 index 00000000000..245e8688b5e --- /dev/null +++ b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/b.kt.new.1 @@ -0,0 +1,7 @@ +@file:A + +package org.example + +fun foo() { + // 2 +} diff --git a/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/b.kt.new.2 b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/b.kt.new.2 new file mode 100644 index 00000000000..6f9c0310352 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/b.kt.new.2 @@ -0,0 +1,7 @@ +@file:A + +package org.example + +fun foo() { + // 3 +} diff --git a/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/build.log b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/build.log new file mode 100644 index 00000000000..36d63dcfd97 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/build.log @@ -0,0 +1,14 @@ +================ Step #1 ================= + +Compiling files: + src/b.kt +End of files +Exit code: OK + +================ Step #2 ================= + +Compiling files: + src/b.kt +End of files +Exit code: OK + diff --git a/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/expectA.kt b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/expectA.kt new file mode 100644 index 00000000000..8ae344283e3 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/mpp/jvmOnly/optionalExpectationWithActual/expectA.kt @@ -0,0 +1,7 @@ +package org.example + +@OptIn(kotlin.ExperimentalMultiplatform::class) +@OptionalExpectation +@Target(AnnotationTarget.FILE) +@Retention(AnnotationRetention.SOURCE) +internal expect annotation class A diff --git a/libraries/tools/kotlinp/testData/OptionalAnnotation.kt b/libraries/tools/kotlinp/testData/OptionalAnnotation.kt index 111e80925f4..85fc91e7437 100644 --- a/libraries/tools/kotlinp/testData/OptionalAnnotation.kt +++ b/libraries/tools/kotlinp/testData/OptionalAnnotation.kt @@ -13,8 +13,14 @@ expect annotation class B(val a: Array) @OptionalExpectation expect annotation class C() +@OptionalExpectation +expect annotation class D() + +actual annotation class D actual constructor() + @Suppress("OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE") @A(42) @B(["OK", ""]) @C +@D() fun ok() {} diff --git a/libraries/tools/kotlinp/testData/OptionalAnnotation.txt b/libraries/tools/kotlinp/testData/OptionalAnnotation.txt index 7d14b2ff891..1d068e8fe4f 100644 --- a/libraries/tools/kotlinp/testData/OptionalAnnotation.txt +++ b/libraries/tools/kotlinp/testData/OptionalAnnotation.txt @@ -1,3 +1,12 @@ +// test/D.class +// ------------------------------------------ +public final annotation class test/D : kotlin/Annotation { + + // signature: ()V + public constructor() + + // module name: test-module +} // test/OptionalAnnotationKt.class // ------------------------------------------ package {