JVM_IR KT-49335 run RepeatedAnnotationLowering per module
Otherwise, we drop annotation constructors in AnnotationLowering, which breaks RAL in case of annotation container declared in different file.
This commit is contained in:
committed by
TeamCityServer
parent
a2b8493f47
commit
d5f6674d2d
+6
@@ -35970,6 +35970,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/reflection/annotations/repeatable/kotlinAnnotation.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt49335.kt")
|
||||
public void testKt49335() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/annotations/repeatable/kt49335.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("nonRepeatedAnnotationWithItsContainer.kt")
|
||||
public void testNonRepeatedAnnotationWithItsContainer() throws Exception {
|
||||
|
||||
@@ -324,7 +324,6 @@ private val jvmFilePhases = listOf(
|
||||
|
||||
inventNamesForLocalClassesPhase,
|
||||
kCallableNamePropertyPhase,
|
||||
repeatedAnnotationPhase,
|
||||
annotationPhase,
|
||||
annotationImplementationPhase,
|
||||
polymorphicSignaturePhase,
|
||||
@@ -437,6 +436,7 @@ private val jvmLoweringPhases = NamedCompilerPhase(
|
||||
scriptsToClassesPhase then
|
||||
fileClassPhase then
|
||||
jvmStaticInObjectPhase then
|
||||
repeatedAnnotationPhase then
|
||||
performByIrFile(lower = jvmFilePhases) then
|
||||
generateMultifileFacadesPhase then
|
||||
resolveInlineCallsPhase then
|
||||
|
||||
+2
-2
@@ -6,7 +6,7 @@
|
||||
package org.jetbrains.kotlin.backend.jvm.lower
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
||||
import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||
import org.jetbrains.kotlin.backend.jvm.codegen.AnnotationCodegen.Companion.annotationClass
|
||||
import org.jetbrains.kotlin.builtins.StandardNames
|
||||
@@ -31,7 +31,7 @@ import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||
|
||||
internal val repeatedAnnotationPhase = makeIrFilePhase(
|
||||
internal val repeatedAnnotationPhase = makeIrModulePhase(
|
||||
::RepeatedAnnotationLowering,
|
||||
name = "RepeatedAnnotation",
|
||||
description = "Enclose repeated annotations in a container annotation, generating a container class if needed"
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
// !LANGUAGE: +RepeatableAnnotations
|
||||
// !OPT_IN: kotlin.ExperimentalStdlibApi
|
||||
// TARGET_BACKEND: JVM_IR
|
||||
// JVM_TARGET: 1.8
|
||||
// FULL_JDK
|
||||
// WITH_REFLECT
|
||||
|
||||
// Android doesn't have @Repeatable, so findAnnotations can't unpack repeatable annotations.
|
||||
// IGNORE_BACKEND: ANDROID
|
||||
|
||||
// FILE: A.kt
|
||||
@java.lang.annotation.Repeatable(A.Container::class)
|
||||
annotation class A(val value: String) {
|
||||
annotation class Container(val value: Array<A>)
|
||||
}
|
||||
|
||||
// FILE: kt49335.kt
|
||||
import kotlin.reflect.full.findAnnotation
|
||||
import kotlin.reflect.full.findAnnotations
|
||||
import kotlin.reflect.full.hasAnnotation
|
||||
|
||||
@A("O")
|
||||
@A("")
|
||||
@A("K")
|
||||
fun f() {}
|
||||
|
||||
fun box(): String {
|
||||
val element = ::f
|
||||
if (element.hasAnnotation<A>()) return "Fail hasAnnotation $element"
|
||||
val find = element.findAnnotation<A>()
|
||||
if (find != null) return "Fail findAnnotation $element: $find"
|
||||
|
||||
val all = (element.annotations.single() as A.Container).value.asList()
|
||||
val findAll = element.findAnnotations<A>()
|
||||
if (all != findAll) throw AssertionError("Fail findAnnotations $element: $all != $findAll")
|
||||
|
||||
return all.fold("") { acc, it -> acc + it.value }
|
||||
}
|
||||
+6
@@ -35970,6 +35970,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/reflection/annotations/repeatable/kotlinAnnotation.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("kt49335.kt")
|
||||
public void testKt49335() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/reflection/annotations/repeatable/kt49335.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("nonRepeatedAnnotationWithItsContainer.kt")
|
||||
public void testNonRepeatedAnnotationWithItsContainer() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user