From f5111180c3a958f61a77a3e82ffd2fe0041989ec Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 15 Apr 2015 19:55:47 +0300 Subject: [PATCH] Load Class as KClass<*> for Java annotations parameters --- .../kClassMapping/arrayClassParameter.java | 7 ++ .../kClassMapping/arrayClassParameter.kt | 11 +++ .../arrayClassParameterOnJavaClass.java | 13 +++ .../arrayClassParameterOnJavaClass.kt | 6 ++ .../kClassMapping/classParameter.java | 7 ++ .../kClassMapping/classParameter.kt | 10 +++ .../classParameterOnJavaClass.java | 12 +++ .../classParameterOnJavaClass.kt | 6 ++ .../kClassMapping/varargClassParameter.java | 7 ++ .../kClassMapping/varargClassParameter.kt | 11 +++ .../varargClassParameterOnJavaClass.java | 13 +++ .../varargClassParameterOnJavaClass.kt | 9 +++ .../annotationParameters/orderWithValue.txt | 6 +- .../orderWithoutValue.txt | 6 +- .../annotationParameters/valueArray.txt | 2 +- .../valueArrayAndOtherDefault.txt | 2 +- .../annotationAsArgument.kt | 19 +++++ .../annotationAsArgument.txt | 41 ++++++++++ .../javaAnnotationsWithKClassParameter/arg.kt | 7 ++ .../arg.txt | 16 ++++ .../argAndOtherDefault.kt | 9 +++ .../argAndOtherDefault.txt | 24 ++++++ .../argArray.kt | 7 ++ .../argArray.txt | 16 ++++ .../argWithDefault.kt | 8 ++ .../argWithDefault.txt | 23 ++++++ .../argWithDefaultAndOther.kt | 9 +++ .../argWithDefaultAndOther.txt | 24 ++++++ .../twoArgs.kt | 8 ++ .../twoArgs.txt | 17 ++++ .../value.kt | 8 ++ .../value.txt | 23 ++++++ .../valueAndOtherDefault.kt | 12 +++ .../valueAndOtherDefault.txt | 38 +++++++++ .../valueArray.kt | 9 +++ .../valueArray.txt | 30 +++++++ .../valueWithDefault.kt | 9 +++ .../valueWithDefault.txt | 30 +++++++ .../valueWithDefaultAndOther.kt | 10 +++ .../valueWithDefaultAndOther.txt | 31 +++++++ .../annotations/ClassObjectArrayInParam.txt | 6 +- .../annotations/ClassObjectInParam.txt | 4 +- .../annotations/ClassObjectInParamRaw.java | 11 +++ .../annotations/ClassObjectInParamRaw.txt | 15 ++++ .../ClassObjectInParamVariance.java | 17 ++++ .../ClassObjectInParamVariance.txt | 17 ++++ ...JetDiagnosticsTestWithStdLibGenerated.java | 81 +++++++++++++++++++ ...ackBoxAgainstJavaCodegenTestGenerated.java | 45 +++++++++++ .../jvm/compiler/LoadJavaTestGenerated.java | 12 +++ ...mRuntimeDescriptorLoaderTestGenerated.java | 12 +++ .../descriptors/LazyJavaClassMemberScope.kt | 2 +- .../lazy/descriptors/LazyJavaMemberScope.kt | 6 +- .../java/lazy/types/LazyJavaTypeResolver.kt | 53 +++++++----- 53 files changed, 804 insertions(+), 33 deletions(-) create mode 100644 compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameter.java create mode 100644 compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameter.kt create mode 100644 compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameterOnJavaClass.java create mode 100644 compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameterOnJavaClass.kt create mode 100644 compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameter.java create mode 100644 compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameter.kt create mode 100644 compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameterOnJavaClass.java create mode 100644 compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameterOnJavaClass.kt create mode 100644 compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameter.java create mode 100644 compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameter.kt create mode 100644 compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameterOnJavaClass.java create mode 100644 compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameterOnJavaClass.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/annotationAsArgument.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/annotationAsArgument.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/arg.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/arg.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argAndOtherDefault.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argAndOtherDefault.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argArray.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argArray.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefault.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefault.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefaultAndOther.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefaultAndOther.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/twoArgs.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/twoArgs.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/value.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/value.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueAndOtherDefault.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueAndOtherDefault.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueArray.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueArray.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefault.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefault.txt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefaultAndOther.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefaultAndOther.txt create mode 100644 compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamRaw.java create mode 100644 compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamRaw.txt create mode 100644 compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamVariance.java create mode 100644 compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamVariance.txt diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameter.java b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameter.java new file mode 100644 index 00000000000..c3797f1384a --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameter.java @@ -0,0 +1,7 @@ +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +@interface JavaAnn { + Class[] args(); +} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameter.kt b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameter.kt new file mode 100644 index 00000000000..bbf3c571821 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameter.kt @@ -0,0 +1,11 @@ +class O +class K + +JavaAnn(args = array(O::class, K::class)) class MyClass + +fun box(): String { + val args = javaClass().getAnnotation(javaClass()).args() + val argName1 = args[0].simpleName ?: "fail 1" + val argName2 = args[1].simpleName ?: "fail 2" + return argName1 + argName2 +} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameterOnJavaClass.java b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameterOnJavaClass.java new file mode 100644 index 00000000000..9693d6169ba --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameterOnJavaClass.java @@ -0,0 +1,13 @@ +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +@interface JavaAnn { + Class[] args(); +} + +class O {} +class K {} + +@JavaAnn(args = {O.class, K.class}) +class MyJavaClass {} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameterOnJavaClass.kt b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameterOnJavaClass.kt new file mode 100644 index 00000000000..58839768c94 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameterOnJavaClass.kt @@ -0,0 +1,6 @@ +fun box(): String { + val args = javaClass().getAnnotation(javaClass()).args() + val argName1 = args[0].simpleName ?: "fail 1" + val argName2 = args[1].simpleName ?: "fail 2" + return argName1 + argName2 +} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameter.java b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameter.java new file mode 100644 index 00000000000..3f7f8278f8e --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameter.java @@ -0,0 +1,7 @@ +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +@interface JavaAnn { + Class value(); +} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameter.kt b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameter.kt new file mode 100644 index 00000000000..4317bede4e3 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameter.kt @@ -0,0 +1,10 @@ + +class OK + +JavaAnn(OK::class) class MyClass + +fun box(): String { + val ann = javaClass().getAnnotation(javaClass()) + if (ann == null) return "fail: cannot find JavaAnn on MyClass" + return ann.value().simpleName!! +} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameterOnJavaClass.java b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameterOnJavaClass.java new file mode 100644 index 00000000000..8d7770fd04a --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameterOnJavaClass.java @@ -0,0 +1,12 @@ +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +@interface JavaAnn { + Class value(); +} + +class OK {} + +@JavaAnn(OK.class) +class MyJavaClass {} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameterOnJavaClass.kt b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameterOnJavaClass.kt new file mode 100644 index 00000000000..b4058cc5b92 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameterOnJavaClass.kt @@ -0,0 +1,6 @@ + +fun box(): String { + val ann = javaClass().getAnnotation(javaClass()) + if (ann == null) return "fail: cannot find JavaAnn on MyClass" + return ann.value().simpleName!! +} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameter.java b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameter.java new file mode 100644 index 00000000000..f17a3c2e606 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameter.java @@ -0,0 +1,7 @@ +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +@interface JavaAnn { + Class[] value(); +} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameter.kt b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameter.kt new file mode 100644 index 00000000000..deaf6880207 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameter.kt @@ -0,0 +1,11 @@ +class O +class K + +JavaAnn(O::class, K::class) class MyClass + +fun box(): String { + val args = javaClass().getAnnotation(javaClass()).value() + val argName1 = args[0].simpleName ?: "fail 1" + val argName2 = args[1].simpleName ?: "fail 2" + return argName1 + argName2 +} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameterOnJavaClass.java b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameterOnJavaClass.java new file mode 100644 index 00000000000..fd0b2588516 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameterOnJavaClass.java @@ -0,0 +1,13 @@ +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +@interface JavaAnn { + Class[] value(); +} + +class O {} +class K {} + +@JavaAnn({O.class, K.class}) +class MyJavaClass {} diff --git a/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameterOnJavaClass.kt b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameterOnJavaClass.kt new file mode 100644 index 00000000000..f2f9da17814 --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameterOnJavaClass.kt @@ -0,0 +1,9 @@ +class O +class K + +fun box(): String { + val args = javaClass().getAnnotation(javaClass()).value() + val argName1 = args[0].simpleName ?: "fail 1" + val argName2 = args[1].simpleName ?: "fail 2" + return argName1 + argName2 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/orderWithValue.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/orderWithValue.txt index 095e0821656..16c9ef11d0b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/orderWithValue.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/orderWithValue.txt @@ -8,7 +8,7 @@ public final annotation class A : kotlin.Annotation { public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public abstract fun value(): kotlin.String - public abstract fun x(): java.lang.Class<*> - public abstract fun x1(): java.lang.Class<*> - public abstract fun x2(): java.lang.Class<*> + public abstract fun x(): kotlin.reflect.KClass<*> + public abstract fun x1(): kotlin.reflect.KClass<*> + public abstract fun x2(): kotlin.reflect.KClass<*> } diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/orderWithoutValue.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/orderWithoutValue.txt index 936f82acf84..d14c18669fa 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/orderWithoutValue.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/orderWithoutValue.txt @@ -7,7 +7,7 @@ public final annotation class A : kotlin.Annotation { 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 abstract fun x(): java.lang.Class<*> - public abstract fun x1(): java.lang.Class<*> - public abstract fun x2(): java.lang.Class<*> + public abstract fun x(): kotlin.reflect.KClass<*> + public abstract fun x1(): kotlin.reflect.KClass<*> + public abstract fun x2(): kotlin.reflect.KClass<*> } diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArray.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArray.txt index 63104a923f3..a3441777675 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArray.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArray.txt @@ -15,6 +15,6 @@ public final annotation class A : kotlin.Annotation { public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public abstract fun value(): kotlin.Array - public abstract fun x(): java.lang.Class<*> + public abstract fun x(): kotlin.reflect.KClass<*> public abstract fun y(): kotlin.Int } diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayAndOtherDefault.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayAndOtherDefault.txt index 6b445a2c118..6bede1ffedc 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayAndOtherDefault.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationParameters/valueArrayAndOtherDefault.txt @@ -18,6 +18,6 @@ public final annotation class A : kotlin.Annotation { public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String public abstract fun value(): kotlin.Array - public abstract fun x(): java.lang.Class<*> + public abstract fun x(): kotlin.reflect.KClass<*> public abstract fun y(): kotlin.Int } diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/annotationAsArgument.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/annotationAsArgument.kt new file mode 100644 index 00000000000..7f5a0741787 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/annotationAsArgument.kt @@ -0,0 +1,19 @@ +// FILE: A.java +public @interface A { + Class arg() default Integer.class; + int x() default 1; + B b(); +} + +// FILE: B.java +public @interface B { + Class arg() default String.class; + int y() default 2; +} + +// FILE: c.kt +A(arg = String::class, b = B(y = 1)) class MyClass1 + +A(b = B(y = 3)) class MyClass2 + +A(arg = String::class, b = B(arg = Boolean::class)) class MyClass3 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/annotationAsArgument.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/annotationAsArgument.txt new file mode 100644 index 00000000000..588cf460b0b --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/annotationAsArgument.txt @@ -0,0 +1,41 @@ +package + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ arg: kotlin.reflect.KClass<*> = ..., /*1*/ x: kotlin.Int = ..., /*2*/ b: B) + public abstract fun arg(): kotlin.reflect.KClass<*> + public abstract fun b(): B + 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 abstract fun x(): kotlin.Int +} + +public final annotation class B : kotlin.Annotation { + public constructor B(/*0*/ arg: kotlin.reflect.KClass<*> = ..., /*1*/ y: kotlin.Int = ...) + public abstract fun arg(): kotlin.reflect.KClass<*> + 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 abstract fun y(): kotlin.Int +} + +A(arg = kotlin.String::class: kotlin.reflect.KClass, b = B(y = IntegerValueType(1): IntegerValueType(1)): B) internal final class MyClass1 { + public constructor MyClass1() + 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 +} + +A(b = B(y = IntegerValueType(3): IntegerValueType(3)): B) internal final class MyClass2 { + public constructor MyClass2() + 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 +} + +A(arg = kotlin.String::class: kotlin.reflect.KClass, b = B(arg = kotlin.Boolean::class: kotlin.reflect.KClass): B) internal final class MyClass3 { + public constructor MyClass3() + 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 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/arg.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/arg.kt new file mode 100644 index 00000000000..8ebceba25de --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/arg.kt @@ -0,0 +1,7 @@ +// FILE: A.java +public @interface A { + Class arg(); +} + +// FILE: b.kt +A(arg = String::class) class MyClass3 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/arg.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/arg.txt new file mode 100644 index 00000000000..0c4c47f4a71 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/arg.txt @@ -0,0 +1,16 @@ +package + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ arg: kotlin.reflect.KClass<*>) + public abstract fun arg(): kotlin.reflect.KClass<*> + 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 +} + +A(arg = kotlin.String::class: kotlin.reflect.KClass) internal final class MyClass3 { + public constructor MyClass3() + 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 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argAndOtherDefault.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argAndOtherDefault.kt new file mode 100644 index 00000000000..e63b667127e --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argAndOtherDefault.kt @@ -0,0 +1,9 @@ +// FILE: A.java +public @interface A { + Class arg(); + int x() default 1; +} + +// FILE: b.kt +A(arg = String::class) class MyClass1 +A(arg = String::class, x = 2) class MyClass2 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argAndOtherDefault.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argAndOtherDefault.txt new file mode 100644 index 00000000000..2b96bfe15bd --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argAndOtherDefault.txt @@ -0,0 +1,24 @@ +package + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ arg: kotlin.reflect.KClass<*>, /*1*/ x: kotlin.Int = ...) + public abstract fun arg(): kotlin.reflect.KClass<*> + 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 abstract fun x(): kotlin.Int +} + +A(arg = kotlin.String::class: kotlin.reflect.KClass) internal final class MyClass1 { + public constructor MyClass1() + 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 +} + +A(arg = kotlin.String::class: kotlin.reflect.KClass, x = IntegerValueType(2): IntegerValueType(2)) internal final class MyClass2 { + public constructor MyClass2() + 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 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argArray.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argArray.kt new file mode 100644 index 00000000000..daa0894b1f7 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argArray.kt @@ -0,0 +1,7 @@ +// FILE: A.java +public @interface A { + Class[] arg(); +} + +// FILE: b.kt +A(arg = array(String::class, Int::class)) class MyClass diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argArray.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argArray.txt new file mode 100644 index 00000000000..c09e133d3be --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argArray.txt @@ -0,0 +1,16 @@ +package + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ arg: kotlin.Array>) + public abstract fun arg(): kotlin.Array> + 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 +} + +A(arg = {kotlin.String::class, kotlin.Int::class}: kotlin.Array>) internal final class MyClass { + public constructor MyClass() + 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 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefault.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefault.kt new file mode 100644 index 00000000000..64aed105d66 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefault.kt @@ -0,0 +1,8 @@ +// FILE: A.java +public @interface A { + Class arg() default Integer.class; +} + +// FILE: b.kt +A(arg = String::class) class MyClass1 +A class MyClass2 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefault.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefault.txt new file mode 100644 index 00000000000..19a0e779624 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefault.txt @@ -0,0 +1,23 @@ +package + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ arg: kotlin.reflect.KClass<*> = ...) + public abstract fun arg(): kotlin.reflect.KClass<*> + 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 +} + +A(arg = kotlin.String::class: kotlin.reflect.KClass) internal final class MyClass1 { + public constructor MyClass1() + 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 +} + +A() internal final class MyClass2 { + public constructor MyClass2() + 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 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefaultAndOther.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefaultAndOther.kt new file mode 100644 index 00000000000..958ed4fefdf --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefaultAndOther.kt @@ -0,0 +1,9 @@ +// FILE: A.java +public @interface A { + Class arg() default Integer.class; + int x(); +} + +// FILE: b.kt +A(arg = String::class, x = 4) class MyClass2 +A(x = 5) class MyClass3 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefaultAndOther.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefaultAndOther.txt new file mode 100644 index 00000000000..c729ab764bc --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefaultAndOther.txt @@ -0,0 +1,24 @@ +package + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ arg: kotlin.reflect.KClass<*> = ..., /*1*/ x: kotlin.Int) + public abstract fun arg(): kotlin.reflect.KClass<*> + 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 abstract fun x(): kotlin.Int +} + +A(arg = kotlin.String::class: kotlin.reflect.KClass, x = IntegerValueType(4): IntegerValueType(4)) internal final class MyClass2 { + public constructor MyClass2() + 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 +} + +A(x = IntegerValueType(5): IntegerValueType(5)) internal final class MyClass3 { + public constructor MyClass3() + 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 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/twoArgs.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/twoArgs.kt new file mode 100644 index 00000000000..c375d41a9dd --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/twoArgs.kt @@ -0,0 +1,8 @@ +// FILE: A.java +public @interface A { + Class arg1(); + Class arg2(); +} + +// FILE: b.kt +A(arg1 = String::class, arg2 = Int::class) class MyClass diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/twoArgs.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/twoArgs.txt new file mode 100644 index 00000000000..f8679f9b717 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/twoArgs.txt @@ -0,0 +1,17 @@ +package + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ arg1: kotlin.reflect.KClass<*>, /*1*/ arg2: kotlin.reflect.KClass<*>) + public abstract fun arg1(): kotlin.reflect.KClass<*> + public abstract fun arg2(): kotlin.reflect.KClass<*> + 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 +} + +A(arg1 = kotlin.String::class: kotlin.reflect.KClass, arg2 = kotlin.Int::class: kotlin.reflect.KClass) internal final class MyClass { + public constructor MyClass() + 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 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/value.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/value.kt new file mode 100644 index 00000000000..85e0e4a59f2 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/value.kt @@ -0,0 +1,8 @@ +// FILE: A.java +public @interface A { + Class value(); +} + +// FILE: b.kt +A(String::class) class MyClass1 +A(value = String::class) class MyClass2 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/value.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/value.txt new file mode 100644 index 00000000000..f31821897cd --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/value.txt @@ -0,0 +1,23 @@ +package + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ value: kotlin.reflect.KClass<*>) + 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 abstract fun value(): kotlin.reflect.KClass<*> +} + +A(value = kotlin.String::class: kotlin.reflect.KClass) internal final class MyClass1 { + public constructor MyClass1() + 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 +} + +A(value = kotlin.String::class: kotlin.reflect.KClass) internal final class MyClass2 { + public constructor MyClass2() + 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 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueAndOtherDefault.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueAndOtherDefault.kt new file mode 100644 index 00000000000..e7a00b6e965 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueAndOtherDefault.kt @@ -0,0 +1,12 @@ +// FILE: A.java +public @interface A { + Class value(); + int x() default 1; +} + +// FILE: b.kt +A(String::class) class MyClass1 +A(value = String::class) class MyClass2 + +A(String::class, x = 2) class MyClass3 +A(value = String::class, x = 4) class MyClass4 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueAndOtherDefault.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueAndOtherDefault.txt new file mode 100644 index 00000000000..50df2e9a0d8 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueAndOtherDefault.txt @@ -0,0 +1,38 @@ +package + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ value: kotlin.reflect.KClass<*>, /*1*/ 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 + public abstract fun value(): kotlin.reflect.KClass<*> + public abstract fun x(): kotlin.Int +} + +A(value = kotlin.String::class: kotlin.reflect.KClass) internal final class MyClass1 { + public constructor MyClass1() + 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 +} + +A(value = kotlin.String::class: kotlin.reflect.KClass) internal final class MyClass2 { + public constructor MyClass2() + 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 +} + +A(value = kotlin.String::class: kotlin.reflect.KClass, x = IntegerValueType(2): IntegerValueType(2)) internal final class MyClass3 { + public constructor MyClass3() + 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 +} + +A(value = kotlin.String::class: kotlin.reflect.KClass, x = IntegerValueType(4): IntegerValueType(4)) internal final class MyClass4 { + public constructor MyClass4() + 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 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueArray.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueArray.kt new file mode 100644 index 00000000000..68d6931f2f9 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueArray.kt @@ -0,0 +1,9 @@ +// FILE: A.java +public @interface A { + Class[] value(); +} + +// FILE: b.kt +A(String::class, Int::class) class MyClass1 +A(*array(String::class, Int::class)) class MyClass2 +A(value = *array(String::class, Int::class)) class MyClass3 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueArray.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueArray.txt new file mode 100644 index 00000000000..d4c377b12f1 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueArray.txt @@ -0,0 +1,30 @@ +package + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ vararg value: kotlin.reflect.KClass<*> /*kotlin.Array>*/) + 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 abstract fun value(): kotlin.Array> +} + +A(value = {kotlin.String::class, kotlin.Int::class}: kotlin.Array>) internal final class MyClass1 { + public constructor MyClass1() + 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 +} + +A(value = {kotlin.String::class, kotlin.Int::class}: kotlin.Array>>) internal final class MyClass2 { + public constructor MyClass2() + 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 +} + +A(value = {kotlin.String::class, kotlin.Int::class}: kotlin.Array>>) internal final class MyClass3 { + public constructor MyClass3() + 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 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefault.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefault.kt new file mode 100644 index 00000000000..ede8c8a4dd2 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefault.kt @@ -0,0 +1,9 @@ +// FILE: A.java +public @interface A { + Class value() default Integer.class; +} + +// FILE: b.kt +A(String::class) class MyClass1 +A(value = String::class) class MyClass2 +A class MyClass3 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefault.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefault.txt new file mode 100644 index 00000000000..8368c972861 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefault.txt @@ -0,0 +1,30 @@ +package + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ value: kotlin.reflect.KClass<*> = ...) + 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 abstract fun value(): kotlin.reflect.KClass<*> +} + +A(value = kotlin.String::class: kotlin.reflect.KClass) internal final class MyClass1 { + public constructor MyClass1() + 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 +} + +A(value = kotlin.String::class: kotlin.reflect.KClass) internal final class MyClass2 { + public constructor MyClass2() + 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 +} + +A() internal final class MyClass3 { + public constructor MyClass3() + 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 +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefaultAndOther.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefaultAndOther.kt new file mode 100644 index 00000000000..b011a4d01e4 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefaultAndOther.kt @@ -0,0 +1,10 @@ +// FILE: A.java +public @interface A { + Class value() default Integer.class; + int x(); +} + +// FILE: b.kt +A(String::class, x = 2) class MyClass1 +A(value = String::class, x = 4) class MyClass2 +A(x = 5) class MyClass3 diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefaultAndOther.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefaultAndOther.txt new file mode 100644 index 00000000000..1718b115441 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefaultAndOther.txt @@ -0,0 +1,31 @@ +package + +public final annotation class A : kotlin.Annotation { + public constructor A(/*0*/ value: kotlin.reflect.KClass<*> = ..., /*1*/ 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 + public abstract fun value(): kotlin.reflect.KClass<*> + public abstract fun x(): kotlin.Int +} + +A(value = kotlin.String::class: kotlin.reflect.KClass, x = IntegerValueType(2): IntegerValueType(2)) internal final class MyClass1 { + public constructor MyClass1() + 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 +} + +A(value = kotlin.String::class: kotlin.reflect.KClass, x = IntegerValueType(4): IntegerValueType(4)) internal final class MyClass2 { + public constructor MyClass2() + 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 +} + +A(x = IntegerValueType(5): IntegerValueType(5)) internal final class MyClass3 { + public constructor MyClass3() + 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 +} diff --git a/compiler/testData/loadJava/compiledJava/annotations/ClassObjectArrayInParam.txt b/compiler/testData/loadJava/compiledJava/annotations/ClassObjectArrayInParam.txt index be0fd0de016..67b645f4baf 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/ClassObjectArrayInParam.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/ClassObjectArrayInParam.txt @@ -4,11 +4,11 @@ public open class ClassObjectArrayInParam { public constructor ClassObjectArrayInParam() public final annotation class Anno : kotlin.Annotation { - public constructor Anno(/*0*/ vararg value: java.lang.Class<*> /*kotlin.Array>*/) - public abstract fun value(): kotlin.Array> + public constructor Anno(/*0*/ vararg value: kotlin.reflect.KClass<*> /*kotlin.Array>*/) + public abstract fun value(): kotlin.Array> } - test.ClassObjectArrayInParam.Anno(value = {test.ClassObjectArrayInParam.class, test.ClassObjectArrayInParam.Nested.class, kotlin.String.class}: kotlin.Array>) public open class Nested { + test.ClassObjectArrayInParam.Anno(value = {test.ClassObjectArrayInParam.class, test.ClassObjectArrayInParam.Nested.class, kotlin.String.class}: kotlin.Array>) public open class Nested { public constructor Nested() } } diff --git a/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParam.txt b/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParam.txt index 93e0a77bac8..02e15614f31 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParam.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParam.txt @@ -4,8 +4,8 @@ public open class ClassObjectInParam { public constructor ClassObjectInParam() public final annotation class Anno : kotlin.Annotation { - public constructor Anno(/*0*/ value: java.lang.Class<*>) - public abstract fun value(): java.lang.Class<*> + public constructor Anno(/*0*/ value: kotlin.reflect.KClass<*>) + public abstract fun value(): kotlin.reflect.KClass<*> } test.ClassObjectInParam.Anno(value = test.ClassObjectInParam.class: java.lang.Class) public open class Nested { diff --git a/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamRaw.java b/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamRaw.java new file mode 100644 index 00000000000..e537f7f74f1 --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamRaw.java @@ -0,0 +1,11 @@ +package test; + +public class ClassObjectInParamRaw { + public @interface Anno { + Class value(); + Class[] arg(); + } + + @Anno(value = ClassObjectInParamRaw.class, arg = {}) + public static class Nested {} +} diff --git a/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamRaw.txt b/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamRaw.txt new file mode 100644 index 00000000000..c1f3277e54b --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamRaw.txt @@ -0,0 +1,15 @@ +package test + +public open class ClassObjectInParamRaw { + public constructor ClassObjectInParamRaw() + + public final annotation class Anno : kotlin.Annotation { + public constructor Anno(/*0*/ value: kotlin.reflect.KClass<*>, /*1*/ arg: kotlin.Array>) + public abstract fun arg(): kotlin.Array> + public abstract fun value(): kotlin.reflect.KClass<*> + } + + test.ClassObjectInParamRaw.Anno(arg = {}: kotlin.Array>, value = test.ClassObjectInParamRaw.class: java.lang.Class) public open class Nested { + public constructor Nested() + } +} diff --git a/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamVariance.java b/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamVariance.java new file mode 100644 index 00000000000..7d7beadfc6d --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamVariance.java @@ -0,0 +1,17 @@ +package test; + +public class ClassObjectInParamVariance { + public @interface Anno { + Class arg1(); + Class arg2(); + + Class[] arg3(); + Class[] arg4(); + + Class>[] arg5(); + Class>[] arg6(); + + Class>[] arg7(); + Class>[] arg8(); + } +} diff --git a/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamVariance.txt b/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamVariance.txt new file mode 100644 index 00000000000..d0e7cc2870d --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamVariance.txt @@ -0,0 +1,17 @@ +package test + +public open class ClassObjectInParamVariance { + public constructor ClassObjectInParamVariance() + + public final annotation class Anno : kotlin.Annotation { + public constructor Anno(/*0*/ arg1: kotlin.reflect.KClass, /*1*/ arg2: kotlin.reflect.KClass, /*2*/ arg3: kotlin.Array>, /*3*/ arg4: kotlin.Array>, /*4*/ arg5: kotlin.Array!>>, /*5*/ arg6: kotlin.Array!>>, /*6*/ arg7: kotlin.Array!>>, /*7*/ arg8: kotlin.Array!>>) + public abstract fun arg1(): kotlin.reflect.KClass + public abstract fun arg2(): kotlin.reflect.KClass + public abstract fun arg3(): kotlin.Array> + public abstract fun arg4(): kotlin.Array> + public abstract fun arg5(): kotlin.Array!>> + public abstract fun arg6(): kotlin.Array!>> + public abstract fun arg7(): kotlin.Array!>> + public abstract fun arg8(): kotlin.Array!>> + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java index 17a84bbb46d..33a03194f79 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java @@ -175,6 +175,87 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic } } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class JavaAnnotationsWithKClassParameter extends AbstractJetDiagnosticsTestWithStdLib { + public void testAllFilesPresentInJavaAnnotationsWithKClassParameter() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("annotationAsArgument.kt") + public void testAnnotationAsArgument() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/annotationAsArgument.kt"); + doTest(fileName); + } + + @TestMetadata("arg.kt") + public void testArg() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/arg.kt"); + doTest(fileName); + } + + @TestMetadata("argAndOtherDefault.kt") + public void testArgAndOtherDefault() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argAndOtherDefault.kt"); + doTest(fileName); + } + + @TestMetadata("argArray.kt") + public void testArgArray() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argArray.kt"); + doTest(fileName); + } + + @TestMetadata("argWithDefault.kt") + public void testArgWithDefault() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefault.kt"); + doTest(fileName); + } + + @TestMetadata("argWithDefaultAndOther.kt") + public void testArgWithDefaultAndOther() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/argWithDefaultAndOther.kt"); + doTest(fileName); + } + + @TestMetadata("twoArgs.kt") + public void testTwoArgs() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/twoArgs.kt"); + doTest(fileName); + } + + @TestMetadata("value.kt") + public void testValue() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/value.kt"); + doTest(fileName); + } + + @TestMetadata("valueAndOtherDefault.kt") + public void testValueAndOtherDefault() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueAndOtherDefault.kt"); + doTest(fileName); + } + + @TestMetadata("valueArray.kt") + public void testValueArray() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueArray.kt"); + doTest(fileName); + } + + @TestMetadata("valueWithDefault.kt") + public void testValueWithDefault() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefault.kt"); + doTest(fileName); + } + + @TestMetadata("valueWithDefaultAndOther.kt") + public void testValueWithDefaultAndOther() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/javaAnnotationsWithKClassParameter/valueWithDefaultAndOther.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java index 84502283963..1ef87f4d885 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -90,6 +90,51 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxCod String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/annotations/retentionInJava.kt"); doTestAgainstJava(fileName); } + + @TestMetadata("compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class KClassMapping extends AbstractBlackBoxCodegenTest { + public void testAllFilesPresentInKClassMapping() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("arrayClassParameter.kt") + public void testArrayClassParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameter.kt"); + doTestAgainstJava(fileName); + } + + @TestMetadata("arrayClassParameterOnJavaClass.kt") + public void testArrayClassParameterOnJavaClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/arrayClassParameterOnJavaClass.kt"); + doTestAgainstJava(fileName); + } + + @TestMetadata("classParameter.kt") + public void testClassParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameter.kt"); + doTestAgainstJava(fileName); + } + + @TestMetadata("classParameterOnJavaClass.kt") + public void testClassParameterOnJavaClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/classParameterOnJavaClass.kt"); + doTestAgainstJava(fileName); + } + + @TestMetadata("varargClassParameter.kt") + public void testVarargClassParameter() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameter.kt"); + doTestAgainstJava(fileName); + } + + @TestMetadata("varargClassParameterOnJavaClass.kt") + public void testVarargClassParameterOnJavaClass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/annotations/kClassMapping/varargClassParameterOnJavaClass.kt"); + doTestAgainstJava(fileName); + } + } } @TestMetadata("compiler/testData/codegen/boxAgainstJava/callableReference") diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java index a04808b491b..70d091df7db 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java @@ -351,6 +351,18 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTestCompiledJava(fileName); } + @TestMetadata("ClassObjectInParamRaw.java") + public void testClassObjectInParamRaw() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamRaw.java"); + doTestCompiledJava(fileName); + } + + @TestMetadata("ClassObjectInParamVariance.java") + public void testClassObjectInParamVariance() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamVariance.java"); + doTestCompiledJava(fileName); + } + @TestMetadata("CustomAnnotation.java") public void testCustomAnnotation() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/CustomAnnotation.java"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java index 730f6039637..77bd618058f 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java @@ -3357,6 +3357,18 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD doTest(fileName); } + @TestMetadata("ClassObjectInParamRaw.java") + public void testClassObjectInParamRaw() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamRaw.java"); + doTest(fileName); + } + + @TestMetadata("ClassObjectInParamVariance.java") + public void testClassObjectInParamVariance() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/ClassObjectInParamVariance.java"); + doTest(fileName); + } + @TestMetadata("CustomAnnotation.java") public void testCustomAnnotation() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/loadJava/compiledJava/annotations/CustomAnnotation.java"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt index 6055415095e..8c83f0632d0 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -168,7 +168,7 @@ public class LazyJavaClassMemberScope( val methods = jClass.getMethods() val result = ArrayList(methods.size()) - val attr = TypeUsage.MEMBER_SIGNATURE_INVARIANT.toAttributes(allowFlexible = false) + val attr = TypeUsage.MEMBER_SIGNATURE_INVARIANT.toAttributes(allowFlexible = false, isForAnnotationParameter = true) val (methodsNamedValue, otherMethods) = methods. partition { it.getName() == JvmAnnotationNames.DEFAULT_ANNOTATION_MEMBER_NAME } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaMemberScope.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaMemberScope.kt index 7e73ced017e..75ee636330c 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaMemberScope.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaMemberScope.kt @@ -120,7 +120,11 @@ public abstract class LazyJavaMemberScope( val valueParameters = resolveValueParameters(c, functionDescriptorImpl, method.getValueParameters()) val annotationMethod = method.getContainingClass().isAnnotationType() - val returnTypeAttrs = LazyJavaTypeAttributes(c, method, TypeUsage.MEMBER_SIGNATURE_COVARIANT, annotations, allowFlexible = !annotationMethod) + val returnTypeAttrs = LazyJavaTypeAttributes( + c, method, TypeUsage.MEMBER_SIGNATURE_COVARIANT, annotations, + allowFlexible = !annotationMethod, + isForAnnotationParameter = annotationMethod + ) val returnJavaType = method.getReturnType() ?: throw IllegalStateException("Constructor passed as method: $method") // Annotation arguments are never null in Java val returnType = c.typeResolver.transformJavaType(returnJavaType, returnTypeAttrs).let { diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt index ba0a81ac0f4..4260b7f7af2 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/LazyJavaTypeResolver.kt @@ -35,10 +35,13 @@ import org.jetbrains.kotlin.resolve.jvm.PLATFORM_TYPES import org.jetbrains.kotlin.load.java.lazy.types.JavaTypeFlexibility.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.load.java.JvmAnnotationNames +import org.jetbrains.kotlin.name.FqName import kotlin.platform.platformStatic import org.jetbrains.kotlin.types.typeUtil.replaceAnnotations import kotlin.properties.* +private val JAVA_LANG_CLASS_FQ_NAME: FqName = FqName("java.lang.Class") + class LazyJavaTypeResolver( private val c: LazyJavaResolverContext, private val typeParameterResolver: TypeParameterResolver @@ -76,7 +79,8 @@ class LazyJavaTypeResolver( } } - val componentType = transformJavaType(javaComponentType, TYPE_ARGUMENT.toAttributes(attr.allowFlexible)) + val componentType = transformJavaType(javaComponentType, + TYPE_ARGUMENT.toAttributes(attr.allowFlexible, attr.isForAnnotationParameter)) if (PLATFORM_TYPES && attr.allowFlexible) { return@run FlexibleJavaClassifierTypeCapabilities.create( @@ -117,21 +121,7 @@ class LazyJavaTypeResolver( val fqName = classifier.getFqName() .sure("Class type should have a FQ name: " + classifier) - val javaToKotlinClassMap = JavaToKotlinClassMap.INSTANCE - val howThisTypeIsUsedEffectively = when { - attr.flexibility == FLEXIBLE_LOWER_BOUND -> MEMBER_SIGNATURE_COVARIANT - attr.flexibility == FLEXIBLE_UPPER_BOUND -> MEMBER_SIGNATURE_CONTRAVARIANT - - // This case has to be checked before isMarkedReadOnly/isMarkedMutable, because those two are slow - // not mapped, we don't care about being marked mutable/read-only - javaToKotlinClassMap.mapPlatformClass(fqName).isEmpty() -> attr.howThisTypeIsUsed - - // Read (possibly external) annotations - else -> attr.howThisTypeIsUsedAccordingToAnnotations - } - - val classData = javaToKotlinClassMap.mapKotlinClass(fqName, howThisTypeIsUsedEffectively) - ?: c.moduleClassResolver.resolveClass(classifier) + val classData = mapKotlinClass(fqName) ?: c.moduleClassResolver.resolveClass(classifier) classData?.getTypeConstructor() ?: ErrorUtils.createErrorTypeConstructor("Unresolved java classifier: " + javaType.getPresentableText()) @@ -149,6 +139,28 @@ class LazyJavaTypeResolver( } } + private fun mapKotlinClass(fqName: FqName): ClassDescriptor? { + if (attr.isForAnnotationParameter && fqName == JAVA_LANG_CLASS_FQ_NAME) { + return c.reflectionTypes.kClass + } + + val javaToKotlinClassMap = JavaToKotlinClassMap.INSTANCE + + val howThisTypeIsUsedEffectively = when { + attr.flexibility == FLEXIBLE_LOWER_BOUND -> MEMBER_SIGNATURE_COVARIANT + attr.flexibility == FLEXIBLE_UPPER_BOUND -> MEMBER_SIGNATURE_CONTRAVARIANT + + // This case has to be checked before isMarkedReadOnly/isMarkedMutable, because those two are slow + // not mapped, we don't care about being marked mutable/read-only + javaToKotlinClassMap.mapPlatformClass(fqName).isEmpty() -> attr.howThisTypeIsUsed + + // Read (possibly external) annotations + else -> attr.howThisTypeIsUsedAccordingToAnnotations + } + + return javaToKotlinClassMap.mapKotlinClass(fqName, howThisTypeIsUsedEffectively) + } + private fun isConstructorTypeParameter(): Boolean { val classifier = classifier() return classifier is JavaTypeParameter && classifier.getOwner() is JavaConstructor @@ -331,6 +343,8 @@ trait JavaTypeAttributes { val allowFlexible: Boolean get() = true val annotations: Annotations + val isForAnnotationParameter: Boolean + get() = false } enum class JavaTypeFlexibility { @@ -344,7 +358,8 @@ class LazyJavaTypeAttributes( val annotationOwner: JavaAnnotationOwner, override val howThisTypeIsUsed: TypeUsage, override val annotations: Annotations, - override val allowFlexible: Boolean = true + override val allowFlexible: Boolean = true, + override val isForAnnotationParameter: Boolean = false ): JavaTypeAttributes { override val howThisTypeIsUsedAccordingToAnnotations: TypeUsage by c.storageManager.createLazyValue { @@ -362,7 +377,7 @@ private fun Annotations.isMarkedMutable() = findAnnotation(JvmAnnotationNames.JE internal fun Annotations.isMarkedNotNull() = findAnnotation(JvmAnnotationNames.JETBRAINS_NOT_NULL_ANNOTATION) != null internal fun Annotations.isMarkedNullable() = findAnnotation(JvmAnnotationNames.JETBRAINS_NULLABLE_ANNOTATION) != null -fun TypeUsage.toAttributes(allowFlexible: Boolean = true) = object : JavaTypeAttributes { +fun TypeUsage.toAttributes(allowFlexible: Boolean = true, isForAnnotationParameter: Boolean = false) = object : JavaTypeAttributes { override val howThisTypeIsUsed: TypeUsage = this@toAttributes override val howThisTypeIsUsedAccordingToAnnotations: TypeUsage get() = howThisTypeIsUsed @@ -370,6 +385,8 @@ fun TypeUsage.toAttributes(allowFlexible: Boolean = true) = object : JavaTypeAtt override val allowFlexible: Boolean = allowFlexible override val annotations: Annotations = Annotations.EMPTY + + override val isForAnnotationParameter: Boolean = isForAnnotationParameter } fun JavaTypeAttributes.toFlexible(flexibility: JavaTypeFlexibility) =