Generate function type parameter annotations and type annotations on their bounds into bytecode
Generate type parameter annotation by default for `-Xjvm-target 1.8` and above #KT-46539 #KT-13228 #KT-46545 Fixed
This commit is contained in:
committed by
TeamCityServer
parent
209ec68591
commit
cbe3c66156
@@ -0,0 +1,23 @@
|
||||
// KOTLIN_CONFIGURATION_FLAGS: -JVM.EMIT_JVM_TYPE_ANNOTATIONS
|
||||
// RENDER_ANNOTATIONS
|
||||
// TARGET_BACKEND: JVM
|
||||
// JVM_TARGET: 1.8
|
||||
package foo
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class TypeAnn(val name: String)
|
||||
|
||||
@Target(AnnotationTarget.TYPE_PARAMETER)
|
||||
annotation class TypeParameterAnn(val name: String)
|
||||
|
||||
|
||||
class Kotlin {
|
||||
|
||||
fun foo(s: @TypeAnn("1") String) {
|
||||
}
|
||||
|
||||
fun <T : @TypeAnn("Ant") Any> bar(p: T): T {
|
||||
return p
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
public final class foo/Kotlin : java/lang/Object {
|
||||
public void <init>()
|
||||
|
||||
<T:Ljava/lang/Object;>(TT;)TT;
|
||||
public final java.lang.Object bar(java.lang.Object p)
|
||||
@Lorg/jetbrains/annotations/NotNull;([]) // invisible
|
||||
@Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0
|
||||
|
||||
public final void foo(java.lang.String s)
|
||||
@Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0
|
||||
}
|
||||
|
||||
public abstract interface foo/TypeAnn : java/lang/Object, java/lang/annotation/Annotation {
|
||||
public abstract java.lang.String name()
|
||||
}
|
||||
|
||||
public abstract interface foo/TypeParameterAnn : java/lang/Object, java/lang/annotation/Annotation {
|
||||
public abstract java.lang.String name()
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
// IGNORE_BACKEND: JVM
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.EMIT_JVM_TYPE_ANNOTATIONS
|
||||
// RENDER_ANNOTATIONS
|
||||
// TARGET_BACKEND: JVM
|
||||
// JVM_TARGET: 1.8
|
||||
package foo
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class TypeAnn(val name: String)
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class ClassTypeAnn(val name: String)
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
@Retention(AnnotationRetention.BINARY)
|
||||
annotation class TypeAnnBinary
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
@Retention(AnnotationRetention.SOURCE)
|
||||
annotation class TypeAnnSource
|
||||
|
||||
@Target( AnnotationTarget.TYPE_PARAMETER)
|
||||
annotation class TypeParameterAnn(val name: String)
|
||||
|
||||
@Target(AnnotationTarget.TYPE_PARAMETER)
|
||||
@Retention(AnnotationRetention.BINARY)
|
||||
annotation class TypeParameterAnnBinary
|
||||
|
||||
@Target(AnnotationTarget.TYPE_PARAMETER)
|
||||
@Retention(AnnotationRetention.SOURCE)
|
||||
annotation class TypeParameterAnnSource
|
||||
|
||||
interface Generic<Z>
|
||||
class GenericClass<Z>
|
||||
class B<Y>
|
||||
|
||||
class Kotlin {
|
||||
|
||||
fun <@TypeParameterAnn("TP1") @TypeParameterAnnBinary @TypeParameterAnnSource T, @TypeParameterAnn("TP2") @TypeParameterAnnBinary @TypeParameterAnnSource T2> typeParameter() {
|
||||
}
|
||||
|
||||
fun <@TypeParameterAnn("TP") T> genericParameterAndReturn(s: @TypeAnn("1") @TypeAnnBinary @TypeAnnSource T): @TypeAnn("2") @TypeAnnBinary @TypeAnnSource T {
|
||||
return s
|
||||
}
|
||||
|
||||
fun <@TypeParameterAnn("Y") Y, @TypeParameterAnn("T") T: @TypeAnn("Generic") @TypeAnnBinary @TypeAnnSource Generic<@TypeAnn("Generic Argument") @TypeAnnBinary @TypeAnnSource Y>> genericInterfaceBound() {
|
||||
}
|
||||
|
||||
fun <@TypeParameterAnn("Y") Y, @TypeParameterAnn("T") T: @TypeAnn("Generic") @TypeAnnBinary @TypeAnnSource GenericClass<@TypeAnn("Generic Argument") @TypeAnnBinary @TypeAnnSource Y>> genericClassBound() {
|
||||
}
|
||||
|
||||
fun <@TypeParameterAnn("Y") Y, @TypeParameterAnn("T") T: @TypeAnn("Generic") Generic<@TypeAnn("Generic Argument") Y>> whereClause() where T : @ClassTypeAnn("Any") Any {
|
||||
|
||||
}
|
||||
|
||||
fun <@TypeParameterAnn("Y") Y, @TypeParameterAnn("T") T: @TypeAnn("Y as Bound") @TypeAnnBinary @TypeAnnSource Y> typeParameterTypeParameterBound() {
|
||||
}
|
||||
|
||||
// Second annotation is missed: see KT-46483, remove this test after prohibition of such cases
|
||||
fun <@TypeParameterAnn("T") T: Any> whereClauseWithAnnotation() where @TypeParameterAnn("Additional") T : Generic<String> {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
<Y:Ljava/lang/Object;>Ljava/lang/Object;
|
||||
public final class foo/B : java/lang/Object {
|
||||
public void <init>()
|
||||
}
|
||||
|
||||
public abstract interface foo/ClassTypeAnn : java/lang/Object, java/lang/annotation/Annotation {
|
||||
public abstract java.lang.String name()
|
||||
}
|
||||
|
||||
<Z:Ljava/lang/Object;>Ljava/lang/Object;
|
||||
public abstract interface foo/Generic : java/lang/Object {
|
||||
|
||||
}
|
||||
|
||||
<Z:Ljava/lang/Object;>Ljava/lang/Object;
|
||||
public final class foo/GenericClass : java/lang/Object {
|
||||
public void <init>()
|
||||
}
|
||||
|
||||
public final class foo/Kotlin : java/lang/Object {
|
||||
public void <init>()
|
||||
|
||||
<Y:Ljava/lang/Object;T:Lfoo/GenericClass<TY;>;>()V
|
||||
public final void genericClassBound()
|
||||
@Lfoo/TypeParameterAnn;([name="Y"]) : METHOD_TYPE_PARAMETER 0, null
|
||||
@Lfoo/TypeParameterAnn;([name="T"]) : METHOD_TYPE_PARAMETER 1, null
|
||||
@Lfoo/TypeAnn;([name="Generic"]) : METHOD_TYPE_PARAMETER_BOUND 1, 0, null
|
||||
@Lfoo/TypeAnn;([name="Generic Argument"]) : METHOD_TYPE_PARAMETER_BOUND 1, 0, 0;
|
||||
@Lfoo/TypeAnnBinary;([]) : METHOD_TYPE_PARAMETER_BOUND 1, 0, null // invisible
|
||||
@Lfoo/TypeAnnBinary;([]) : METHOD_TYPE_PARAMETER_BOUND 1, 0, 0; // invisible
|
||||
|
||||
<Y:Ljava/lang/Object;T::Lfoo/Generic<TY;>;>()V
|
||||
public final void genericInterfaceBound()
|
||||
@Lfoo/TypeParameterAnn;([name="Y"]) : METHOD_TYPE_PARAMETER 0, null
|
||||
@Lfoo/TypeParameterAnn;([name="T"]) : METHOD_TYPE_PARAMETER 1, null
|
||||
@Lfoo/TypeAnn;([name="Generic"]) : METHOD_TYPE_PARAMETER_BOUND 1, 1, null
|
||||
@Lfoo/TypeAnn;([name="Generic Argument"]) : METHOD_TYPE_PARAMETER_BOUND 1, 1, 0;
|
||||
@Lfoo/TypeAnnBinary;([]) : METHOD_TYPE_PARAMETER_BOUND 1, 1, null // invisible
|
||||
@Lfoo/TypeAnnBinary;([]) : METHOD_TYPE_PARAMETER_BOUND 1, 1, 0; // invisible
|
||||
|
||||
<T:Ljava/lang/Object;>(TT;)TT;
|
||||
public final java.lang.Object genericParameterAndReturn(java.lang.Object s)
|
||||
@Lfoo/TypeAnn;([name="2"]) : METHOD_RETURN, null
|
||||
@Lfoo/TypeParameterAnn;([name="TP"]) : METHOD_TYPE_PARAMETER 0, null
|
||||
@Lfoo/TypeAnn;([name="1"]) : METHOD_FORMAL_PARAMETER 0, null
|
||||
@Lfoo/TypeAnnBinary;([]) : METHOD_RETURN, null // invisible
|
||||
@Lfoo/TypeAnnBinary;([]) : METHOD_FORMAL_PARAMETER 0, null // invisible
|
||||
|
||||
<T:Ljava/lang/Object;T2:Ljava/lang/Object;>()V
|
||||
public final void typeParameter()
|
||||
@Lfoo/TypeParameterAnn;([name="TP1"]) : METHOD_TYPE_PARAMETER 0, null
|
||||
@Lfoo/TypeParameterAnn;([name="TP2"]) : METHOD_TYPE_PARAMETER 1, null
|
||||
@Lfoo/TypeParameterAnnBinary;([]) : METHOD_TYPE_PARAMETER 0, null // invisible
|
||||
@Lfoo/TypeParameterAnnBinary;([]) : METHOD_TYPE_PARAMETER 1, null // invisible
|
||||
|
||||
<Y:Ljava/lang/Object;T::TY;>()V
|
||||
public final void typeParameterTypeParameterBound()
|
||||
@Lfoo/TypeParameterAnn;([name="Y"]) : METHOD_TYPE_PARAMETER 0, null
|
||||
@Lfoo/TypeParameterAnn;([name="T"]) : METHOD_TYPE_PARAMETER 1, null
|
||||
@Lfoo/TypeAnn;([name="Y as Bound"]) : METHOD_TYPE_PARAMETER_BOUND 1, 0, null
|
||||
@Lfoo/TypeAnnBinary;([]) : METHOD_TYPE_PARAMETER_BOUND 1, 0, null // invisible
|
||||
|
||||
<Y:Ljava/lang/Object;T:Ljava/lang/Object;:Lfoo/Generic<TY;>;>()V
|
||||
public final void whereClause()
|
||||
@Lfoo/TypeParameterAnn;([name="Y"]) : METHOD_TYPE_PARAMETER 0, null
|
||||
@Lfoo/TypeParameterAnn;([name="T"]) : METHOD_TYPE_PARAMETER 1, null
|
||||
@Lfoo/TypeAnn;([name="Generic"]) : METHOD_TYPE_PARAMETER_BOUND 1, 1, null
|
||||
@Lfoo/TypeAnn;([name="Generic Argument"]) : METHOD_TYPE_PARAMETER_BOUND 1, 1, 0;
|
||||
@Lfoo/ClassTypeAnn;([name="Any"]) : METHOD_TYPE_PARAMETER_BOUND 1, 0, null
|
||||
|
||||
<T:Ljava/lang/Object;:Lfoo/Generic<Ljava/lang/String;>;>()V
|
||||
public final void whereClauseWithAnnotation()
|
||||
@Lfoo/TypeParameterAnn;([name="T"]) : METHOD_TYPE_PARAMETER 0, null
|
||||
}
|
||||
|
||||
public abstract interface foo/TypeAnn : java/lang/Object, java/lang/annotation/Annotation {
|
||||
public abstract java.lang.String name()
|
||||
}
|
||||
|
||||
public abstract interface foo/TypeAnnBinary : java/lang/Object, java/lang/annotation/Annotation {
|
||||
|
||||
}
|
||||
|
||||
public abstract interface foo/TypeAnnSource : java/lang/Object, java/lang/annotation/Annotation {
|
||||
|
||||
}
|
||||
|
||||
public abstract interface foo/TypeParameterAnn : java/lang/Object, java/lang/annotation/Annotation {
|
||||
public abstract java.lang.String name()
|
||||
}
|
||||
|
||||
public abstract interface foo/TypeParameterAnnBinary : java/lang/Object, java/lang/annotation/Annotation {
|
||||
|
||||
}
|
||||
|
||||
public abstract interface foo/TypeParameterAnnSource : java/lang/Object, java/lang/annotation/Annotation {
|
||||
|
||||
}
|
||||
@@ -52,5 +52,7 @@ class Kotlin {
|
||||
fun <T> fooGenericOut(s: @Ann Bar<out @Ann2 T>) {
|
||||
}
|
||||
|
||||
fun <T: Bar<Outer.Inner<@Ann Outer>>> innerClassInBound() {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -58,6 +58,9 @@ public final class foo/Kotlin : java/lang/Object {
|
||||
public final void fooGenericOut(foo.Bar s)
|
||||
@Lfoo/Ann;([]) : METHOD_FORMAL_PARAMETER 0, null
|
||||
@Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0
|
||||
|
||||
<T:Lfoo/Bar<Lfoo/Outer$Inner<Lfoo/Outer;>;>;>()V
|
||||
public final void innerClassInBound()
|
||||
}
|
||||
|
||||
<T:Ljava/lang/Object;>Ljava/lang/Object;
|
||||
@@ -70,4 +73,4 @@ public final class foo/Outer$Inner : java/lang/Object {
|
||||
|
||||
public final class foo/Outer : java/lang/Object {
|
||||
public void <init>()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
// IGNORE_BACKEND: JVM
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.EMIT_JVM_TYPE_ANNOTATIONS
|
||||
// RENDER_ANNOTATIONS
|
||||
// TARGET_BACKEND: JVM
|
||||
// JVM_TARGET: 1.8
|
||||
package foo
|
||||
|
||||
@Target(AnnotationTarget.TYPE)
|
||||
annotation class TypeAnn(val name: String)
|
||||
|
||||
@Target( AnnotationTarget.TYPE_PARAMETER)
|
||||
annotation class TypeParameterAnn()
|
||||
|
||||
interface Simple
|
||||
|
||||
class Kotlin {
|
||||
|
||||
var <@TypeParameterAnn T: @TypeAnn("Simple") Simple> T.z: T?
|
||||
get() = null
|
||||
set(value) {}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
public final class foo/Kotlin : java/lang/Object {
|
||||
public void <init>()
|
||||
|
||||
<T::Lfoo/Simple;>(TT;)TT;
|
||||
public final foo.Simple getZ(foo.Simple $this$z)
|
||||
@Lorg/jetbrains/annotations/Nullable;([]) // invisible
|
||||
@Lfoo/TypeParameterAnn;([]) : METHOD_TYPE_PARAMETER 0, null
|
||||
@Lfoo/TypeAnn;([name="Simple"]) : METHOD_TYPE_PARAMETER_BOUND 0, 1, null
|
||||
@Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0
|
||||
|
||||
<T::Lfoo/Simple;>(TT;TT;)V
|
||||
public final void setZ(foo.Simple $this$z, foo.Simple value)
|
||||
@Lfoo/TypeParameterAnn;([]) : METHOD_TYPE_PARAMETER 0, null
|
||||
@Lfoo/TypeAnn;([name="Simple"]) : METHOD_TYPE_PARAMETER_BOUND 0, 1, null
|
||||
@Lorg/jetbrains/annotations/NotNull;([]) // invisible, parameter 0
|
||||
@Lorg/jetbrains/annotations/Nullable;([]) // invisible, parameter 1
|
||||
}
|
||||
|
||||
public abstract interface foo/Simple : java/lang/Object {
|
||||
|
||||
}
|
||||
|
||||
public abstract interface foo/TypeAnn : java/lang/Object, java/lang/annotation/Annotation {
|
||||
public abstract java.lang.String name()
|
||||
}
|
||||
|
||||
public abstract interface foo/TypeParameterAnn : java/lang/Object, java/lang/annotation/Annotation {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// IGNORE_BACKEND: JVM
|
||||
// RENDER_ANNOTATIONS
|
||||
// TARGET_BACKEND: JVM
|
||||
// JVM_TARGET: 1.8
|
||||
package foo
|
||||
|
||||
@Target(AnnotationTarget.TYPE_PARAMETER)
|
||||
annotation class TypeParameterAnn(val name: String)
|
||||
|
||||
class Kotlin {
|
||||
|
||||
fun <@TypeParameterAnn("T") T> bar(p: T): T {
|
||||
return p
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
public final class foo/Kotlin : java/lang/Object {
|
||||
public void <init>()
|
||||
|
||||
<T:Ljava/lang/Object;>(TT;)TT;
|
||||
public final java.lang.Object bar(java.lang.Object p)
|
||||
@Lfoo/TypeParameterAnn;([name="T"]) : METHOD_TYPE_PARAMETER 0, null
|
||||
}
|
||||
|
||||
public abstract interface foo/TypeParameterAnn : java/lang/Object, java/lang/annotation/Annotation {
|
||||
public abstract java.lang.String name()
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
// RENDER_ANNOTATIONS
|
||||
// TARGET_BACKEND: JVM
|
||||
// JVM_TARGET: 1.6
|
||||
package foo
|
||||
|
||||
@Target(AnnotationTarget.TYPE_PARAMETER)
|
||||
annotation class TypeParameterAnn(val name: String)
|
||||
|
||||
class Kotlin {
|
||||
|
||||
fun <@TypeParameterAnn("T") T> bar(p: T): T {
|
||||
return p
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
public final class foo/Kotlin : java/lang/Object {
|
||||
public void <init>()
|
||||
|
||||
<T:Ljava/lang/Object;>(TT;)TT;
|
||||
public final java.lang.Object bar(java.lang.Object p)
|
||||
}
|
||||
|
||||
public abstract interface foo/TypeParameterAnn : java/lang/Object, java/lang/annotation/Annotation {
|
||||
public abstract java.lang.String name()
|
||||
}
|
||||
Reference in New Issue
Block a user