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:
Dmitry Petrov
2021-10-21 17:55:46 +03:00
committed by TeamCityServer
parent a2b8493f47
commit d5f6674d2d
5 changed files with 53 additions and 3 deletions
@@ -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
@@ -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 }
}
@@ -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 {