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
This commit is contained in:
committed by
Space Team
parent
11504fda18
commit
7a9c59aeb5
+18
@@ -85,6 +85,11 @@ public class IncrementalMultiplatformJvmCompilerRunnerTestGenerated extends Abst
|
|||||||
runTest("jps/jps-plugin/testData/incremental/mpp/jvmOnly/multifilePartChanged/");
|
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")
|
@TestMetadata("jps/jps-plugin/testData/incremental/mpp/jvmOnly/multifilePartChanged")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@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);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -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.DescriptorMetadataSource
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
|
import org.jetbrains.kotlin.resolve.multiplatform.OptionalAnnotationUtil
|
||||||
|
|
||||||
internal val processOptionalAnnotationsPhase = makeIrModulePhase(
|
internal val processOptionalAnnotationsPhase = makeIrModulePhase(
|
||||||
::ProcessOptionalAnnotations,
|
::ProcessOptionalAnnotations,
|
||||||
@@ -30,6 +31,7 @@ class ProcessOptionalAnnotations(private val context: JvmBackendContext) : FileL
|
|||||||
private fun IrClass.registerOptionalAnnotations() {
|
private fun IrClass.registerOptionalAnnotations() {
|
||||||
// TODO FirMetadataSource.Class
|
// TODO FirMetadataSource.Class
|
||||||
val metadataSource = (metadata as? DescriptorMetadataSource.Class)?.descriptor ?: return
|
val metadataSource = (metadata as? DescriptorMetadataSource.Class)?.descriptor ?: return
|
||||||
|
if (!OptionalAnnotationUtil.shouldGenerateExpectClass(metadataSource)) return
|
||||||
context.state.factory.packagePartRegistry.optionalAnnotations += metadataSource
|
context.state.factory.packagePartRegistry.optionalAnnotations += metadataSource
|
||||||
|
|
||||||
declarations.forEach {
|
declarations.forEach {
|
||||||
|
|||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
package org.example
|
||||||
|
|
||||||
|
@OptIn(kotlin.ExperimentalMultiplatform::class)
|
||||||
|
@Target(AnnotationTarget.FILE)
|
||||||
|
@Retention(AnnotationRetention.SOURCE)
|
||||||
|
internal actual annotation class A
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
-Xmulti-platform
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
@file:A
|
||||||
|
|
||||||
|
package org.example
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
// 1
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
@file:A
|
||||||
|
|
||||||
|
package org.example
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
// 2
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
@file:A
|
||||||
|
|
||||||
|
package org.example
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
// 3
|
||||||
|
}
|
||||||
+14
@@ -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
|
||||||
|
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
package org.example
|
||||||
|
|
||||||
|
@OptIn(kotlin.ExperimentalMultiplatform::class)
|
||||||
|
@OptionalExpectation
|
||||||
|
@Target(AnnotationTarget.FILE)
|
||||||
|
@Retention(AnnotationRetention.SOURCE)
|
||||||
|
internal expect annotation class A
|
||||||
@@ -13,8 +13,14 @@ expect annotation class B(val a: Array<String>)
|
|||||||
@OptionalExpectation
|
@OptionalExpectation
|
||||||
expect annotation class C()
|
expect annotation class C()
|
||||||
|
|
||||||
|
@OptionalExpectation
|
||||||
|
expect annotation class D()
|
||||||
|
|
||||||
|
actual annotation class D actual constructor()
|
||||||
|
|
||||||
@Suppress("OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE")
|
@Suppress("OPTIONAL_DECLARATION_USAGE_IN_NON_COMMON_SOURCE")
|
||||||
@A(42)
|
@A(42)
|
||||||
@B(["OK", ""])
|
@B(["OK", ""])
|
||||||
@C
|
@C
|
||||||
|
@D()
|
||||||
fun ok() {}
|
fun ok() {}
|
||||||
|
|||||||
@@ -1,3 +1,12 @@
|
|||||||
|
// test/D.class
|
||||||
|
// ------------------------------------------
|
||||||
|
public final annotation class test/D : kotlin/Annotation {
|
||||||
|
|
||||||
|
// signature: <init>()V
|
||||||
|
public constructor()
|
||||||
|
|
||||||
|
// module name: test-module
|
||||||
|
}
|
||||||
// test/OptionalAnnotationKt.class
|
// test/OptionalAnnotationKt.class
|
||||||
// ------------------------------------------
|
// ------------------------------------------
|
||||||
package {
|
package {
|
||||||
|
|||||||
Reference in New Issue
Block a user