Support using Java-repeatable annotations in Kotlin

#KT-12794
This commit is contained in:
Alexander Udalov
2021-07-20 16:30:04 +02:00
parent f723389565
commit 87130edfa2
42 changed files with 958 additions and 42 deletions
@@ -1,3 +1,4 @@
// !LANGUAGE: -RepeatableAnnotations
// FULL_JDK
// FILE: Runtime.java
@@ -1,3 +1,4 @@
// !LANGUAGE: -RepeatableAnnotations
// FULL_JDK
// FILE: Runtime.java
@@ -0,0 +1,49 @@
// FIR_IDENTICAL
// !LANGUAGE: +RepeatableAnnotations
// FULL_JDK
// FILE: Runtime.java
import java.lang.annotation.*;
@Repeatable(Runtime.Container.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface Runtime {
public @interface Container {
Runtime[] value();
}
}
// FILE: Clazz.java
import java.lang.annotation.*;
@Repeatable(Clazz.Container.class)
@Retention(RetentionPolicy.CLASS)
public @interface Clazz {
public @interface Container {
Clazz[] value();
}
}
// FILE: Source.java
import java.lang.annotation.*;
@Repeatable(Source.Container.class)
@Retention(RetentionPolicy.SOURCE)
public @interface Source {
public @interface Container {
Source[] value();
}
}
// FILE: usage.kt
@Runtime @Runtime
class UseRuntime
@Clazz @Clazz
class UseClazz
@Source @Source
class UseSource
@@ -0,0 +1,68 @@
package
@java.lang.annotation.Repeatable(value = Clazz.Container::class) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class Clazz : kotlin.Annotation {
public constructor Clazz()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final annotation class Container : kotlin.Annotation {
public constructor Container(/*0*/ vararg value: Clazz /*kotlin.Array<out Clazz>*/)
public final val value: kotlin.Array<Clazz>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@java.lang.annotation.Repeatable(value = Runtime.Container::class) @kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class Runtime : kotlin.Annotation {
public constructor Runtime()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final annotation class Container : kotlin.Annotation {
public constructor Container(/*0*/ vararg value: Runtime /*kotlin.Array<out Runtime>*/)
public final val value: kotlin.Array<Runtime>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@java.lang.annotation.Repeatable(value = Source.Container::class) @kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) public final annotation class Source : kotlin.Annotation {
public constructor Source()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final annotation class Container : kotlin.Annotation {
public constructor Container(/*0*/ vararg value: Source /*kotlin.Array<out Source>*/)
public final val value: kotlin.Array<Source>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@Clazz @Clazz public final class UseClazz {
public constructor UseClazz()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@Runtime @Runtime public final class UseRuntime {
public constructor UseRuntime()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@Source @Source public final class UseSource {
public constructor UseSource()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,3 +1,4 @@
// !LANGUAGE: -RepeatableAnnotations
// FULL_JDK
// FILE: Runtime.java
@@ -1,3 +1,4 @@
// !LANGUAGE: -RepeatableAnnotations
// FULL_JDK
// FILE: Runtime.java
@@ -0,0 +1,33 @@
// !LANGUAGE: +RepeatableAnnotations
// FULL_JDK
// FILE: Runtime.java
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
public @interface Runtime {}
// FILE: Clazz.java
import java.lang.annotation.*;
@Retention(RetentionPolicy.CLASS)
public @interface Clazz {}
// FILE: Source.java
import java.lang.annotation.*;
@Retention(RetentionPolicy.SOURCE)
public @interface Source {}
// FILE: usage.kt
@Runtime @Runtime
class UseRuntime
@Clazz @Clazz
class UseClazz
@Source @Source
class UseSource
@@ -0,0 +1,33 @@
// !LANGUAGE: +RepeatableAnnotations
// FULL_JDK
// FILE: Runtime.java
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
public @interface Runtime {}
// FILE: Clazz.java
import java.lang.annotation.*;
@Retention(RetentionPolicy.CLASS)
public @interface Clazz {}
// FILE: Source.java
import java.lang.annotation.*;
@Retention(RetentionPolicy.SOURCE)
public @interface Source {}
// FILE: usage.kt
@Runtime <!REPEATED_ANNOTATION!>@Runtime<!>
class UseRuntime
@Clazz <!REPEATED_ANNOTATION!>@Clazz<!>
class UseClazz
@Source <!REPEATED_ANNOTATION!>@Source<!>
class UseSource
@@ -0,0 +1,44 @@
package
@kotlin.annotation.Retention(value = AnnotationRetention.BINARY) public final annotation class Clazz : kotlin.Annotation {
public constructor Clazz()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.annotation.Retention(value = AnnotationRetention.RUNTIME) public final annotation class Runtime : kotlin.Annotation {
public constructor Runtime()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) public final annotation class Source : kotlin.Annotation {
public constructor Source()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@Clazz @Clazz public final class UseClazz {
public constructor UseClazz()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@Runtime @Runtime public final class UseRuntime {
public constructor UseRuntime()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@Source @Source public final class UseSource {
public constructor UseSource()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,3 +1,5 @@
// !LANGUAGE: -RepeatableAnnotations
@Repeatable
annotation class repann
@@ -1,3 +1,5 @@
// !LANGUAGE: -RepeatableAnnotations
@Repeatable
annotation class repann
@@ -28,4 +30,4 @@ annotation class repexpr
@repann <!NON_SOURCE_REPEATED_ANNOTATION!>@repann<!> fun foo(@repann <!NON_SOURCE_REPEATED_ANNOTATION!>@repann<!> x: Int): Int {
@repexpr @repexpr return x
}
}
@@ -0,0 +1,34 @@
// FIR_IDENTICAL
// !LANGUAGE: +RepeatableAnnotations
@Repeatable
annotation class repann
@Retention(AnnotationRetention.SOURCE)
@Repeatable
annotation class repann1(val x: Int)
@Retention(AnnotationRetention.SOURCE)
@Repeatable
annotation class repann2(val f: Boolean)
@Retention(AnnotationRetention.BINARY)
@Repeatable
annotation class binrepann
@Target(AnnotationTarget.EXPRESSION)
@Retention(AnnotationRetention.SOURCE)
@Repeatable
annotation class repexpr
@repann @repann class DoubleAnnotated
@repann1(1) @repann1(2) @repann1(3) class TripleAnnotated
@repann2(true) @repann2(false) @repann2(false) @repann2(true) class FourTimesAnnotated
@binrepann @binrepann class BinaryAnnotated
@repann @repann fun foo(@repann @repann x: Int): Int {
@repexpr @repexpr return x
}
@@ -0,0 +1,68 @@
package
@repann @repann public fun foo(/*0*/ @repann @repann x: kotlin.Int): kotlin.Int
@binrepann @binrepann public final class BinaryAnnotated {
public constructor BinaryAnnotated()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@repann @repann public final class DoubleAnnotated {
public constructor DoubleAnnotated()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@repann2(f = true) @repann2(f = false) @repann2(f = false) @repann2(f = true) public final class FourTimesAnnotated {
public constructor FourTimesAnnotated()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@repann1(x = 1) @repann1(x = 2) @repann1(x = 3) public final class TripleAnnotated {
public constructor TripleAnnotated()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.Repeatable public final annotation class binrepann : kotlin.Annotation {
public constructor binrepann()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.annotation.Repeatable public final annotation class repann : kotlin.Annotation {
public constructor repann()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) @kotlin.annotation.Repeatable public final annotation class repann1 : kotlin.Annotation {
public constructor repann1(/*0*/ x: kotlin.Int)
public final val x: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) @kotlin.annotation.Repeatable public final annotation class repann2 : kotlin.Annotation {
public constructor repann2(/*0*/ f: kotlin.Boolean)
public final val f: kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.EXPRESSION}) @kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) @kotlin.annotation.Repeatable public final annotation class repexpr : kotlin.Annotation {
public constructor repexpr()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}