Load annotation parameter's type for ctr as contravariant

See comment in code
This commit is contained in:
Denis Zharkov
2015-04-15 21:39:05 +03:00
parent 8f0e290dec
commit 294eb1dceb
6 changed files with 23 additions and 14 deletions
@@ -1,15 +1,15 @@
package
public final annotation class A : kotlin.Annotation {
public /*synthesized*/ constructor A(/*0*/ arg: kotlin.Array<java.lang.Class<*>>)
public constructor A(/*0*/ arg: kotlin.Array<kotlin.reflect.KClass<*>>)
public /*synthesized*/ constructor A(/*0*/ arg: kotlin.Array<out java.lang.Class<*>>)
public constructor A(/*0*/ arg: kotlin.Array<out kotlin.reflect.KClass<*>>)
public abstract fun arg(): kotlin.Array<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.Int.class}: kotlin.Array<java.lang.Class<*>>) internal final class MyClass1 {
A(arg = {kotlin.String.class, kotlin.Int.class}: kotlin.Array<java.lang.Class<out kotlin.Comparable<out kotlin.Any?>>>) 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
@@ -1,15 +1,15 @@
package
public final annotation class A : kotlin.Annotation {
public /*synthesized*/ constructor A(/*0*/ arg: kotlin.Array<java.lang.Class<*>>)
public constructor A(/*0*/ arg: kotlin.Array<kotlin.reflect.KClass<*>>)
public /*synthesized*/ constructor A(/*0*/ arg: kotlin.Array<out java.lang.Class<*>>)
public constructor A(/*0*/ arg: kotlin.Array<out kotlin.reflect.KClass<*>>)
public abstract fun arg(): kotlin.Array<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.Int::class}: kotlin.Array<kotlin.reflect.KClass<*>>) internal final class MyClass {
A(arg = {kotlin.String::class, kotlin.Int::class}: kotlin.Array<kotlin.reflect.KClass<out kotlin.Comparable<out kotlin.Any?>>>) 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
@@ -4,13 +4,13 @@ public open class ClassObjectInParamRaw {
public constructor ClassObjectInParamRaw()
public final annotation class Anno : kotlin.Annotation {
public /*synthesized*/ constructor Anno(/*0*/ value: java.lang.Class<*>, /*1*/ arg: kotlin.Array<java.lang.Class<*>>)
public constructor Anno(/*0*/ value: kotlin.reflect.KClass<*>, /*1*/ arg: kotlin.Array<kotlin.reflect.KClass<*>>)
public /*synthesized*/ constructor Anno(/*0*/ value: java.lang.Class<*>, /*1*/ arg: kotlin.Array<out java.lang.Class<*>>)
public constructor Anno(/*0*/ value: kotlin.reflect.KClass<*>, /*1*/ arg: kotlin.Array<out kotlin.reflect.KClass<*>>)
public abstract fun arg(): kotlin.Array<kotlin.reflect.KClass<*>>
public abstract fun value(): kotlin.reflect.KClass<*>
}
test.ClassObjectInParamRaw.Anno(arg = {}: kotlin.Array<kotlin.reflect.KClass<*>>, value = test.ClassObjectInParamRaw.class: java.lang.Class<test.ClassObjectInParamRaw>) public open class Nested {
test.ClassObjectInParamRaw.Anno(arg = {}: kotlin.Array<out kotlin.reflect.KClass<*>>, value = test.ClassObjectInParamRaw.class: java.lang.Class<test.ClassObjectInParamRaw>) public open class Nested {
public constructor Nested()
}
}
@@ -4,8 +4,8 @@ public open class ClassObjectInParamVariance {
public constructor ClassObjectInParamVariance()
public final annotation class Anno : kotlin.Annotation {
public /*synthesized*/ constructor Anno(/*0*/ arg1: java.lang.Class<out kotlin.Int!>, /*1*/ arg2: java.lang.Class<in kotlin.Int!>, /*2*/ arg3: kotlin.Array<java.lang.Class<out kotlin.Int!>>, /*3*/ arg4: kotlin.Array<java.lang.Class<in kotlin.Int!>>, /*4*/ arg5: kotlin.Array<java.lang.Class<out java.lang.Class<*>!>>, /*5*/ arg6: kotlin.Array<java.lang.Class<in java.lang.Class<*>!>>, /*6*/ arg7: kotlin.Array<java.lang.Class<out java.lang.Class<kotlin.Int!>!>>, /*7*/ arg8: kotlin.Array<java.lang.Class<in java.lang.Class<kotlin.Int!>!>>)
public constructor Anno(/*0*/ arg1: kotlin.reflect.KClass<out kotlin.Int!>, /*1*/ arg2: kotlin.reflect.KClass<in kotlin.Int!>, /*2*/ arg3: kotlin.Array<kotlin.reflect.KClass<out kotlin.Int!>>, /*3*/ arg4: kotlin.Array<kotlin.reflect.KClass<in kotlin.Int!>>, /*4*/ arg5: kotlin.Array<kotlin.reflect.KClass<out java.lang.Class<*>!>>, /*5*/ arg6: kotlin.Array<kotlin.reflect.KClass<in java.lang.Class<*>!>>, /*6*/ arg7: kotlin.Array<kotlin.reflect.KClass<out java.lang.Class<kotlin.Int!>!>>, /*7*/ arg8: kotlin.Array<kotlin.reflect.KClass<in java.lang.Class<kotlin.Int!>!>>)
public /*synthesized*/ constructor Anno(/*0*/ arg1: java.lang.Class<out kotlin.Int!>, /*1*/ arg2: java.lang.Class<in kotlin.Int!>, /*2*/ arg3: kotlin.Array<out java.lang.Class<out kotlin.Int!>>, /*3*/ arg4: kotlin.Array<out java.lang.Class<in kotlin.Int!>>, /*4*/ arg5: kotlin.Array<out java.lang.Class<out java.lang.Class<*>!>>, /*5*/ arg6: kotlin.Array<out java.lang.Class<in java.lang.Class<*>!>>, /*6*/ arg7: kotlin.Array<out java.lang.Class<out java.lang.Class<kotlin.Int!>!>>, /*7*/ arg8: kotlin.Array<out java.lang.Class<in java.lang.Class<kotlin.Int!>!>>)
public constructor Anno(/*0*/ arg1: kotlin.reflect.KClass<out kotlin.Int!>, /*1*/ arg2: kotlin.reflect.KClass<in kotlin.Int!>, /*2*/ arg3: kotlin.Array<out kotlin.reflect.KClass<out kotlin.Int!>>, /*3*/ arg4: kotlin.Array<out kotlin.reflect.KClass<in kotlin.Int!>>, /*4*/ arg5: kotlin.Array<out kotlin.reflect.KClass<out java.lang.Class<*>!>>, /*5*/ arg6: kotlin.Array<out kotlin.reflect.KClass<in java.lang.Class<*>!>>, /*6*/ arg7: kotlin.Array<out kotlin.reflect.KClass<out java.lang.Class<kotlin.Int!>!>>, /*7*/ arg8: kotlin.Array<out kotlin.reflect.KClass<in java.lang.Class<kotlin.Int!>!>>)
public abstract fun arg1(): kotlin.reflect.KClass<out kotlin.Int!>
public abstract fun arg2(): kotlin.reflect.KClass<in kotlin.Int!>
public abstract fun arg3(): kotlin.Array<kotlin.reflect.KClass<out kotlin.Int!>>
@@ -3,10 +3,10 @@ package test
public /*synthesized*/ fun NullInAnnotation(/*0*/ function: () -> kotlin.Unit): test.NullInAnnotation
public trait NullInAnnotation {
test.NullInAnnotation.Ann(a = null: kotlin.Nothing?, b = {null}: kotlin.Array<kotlin.String>) public abstract fun foo(): kotlin.Unit
test.NullInAnnotation.Ann(a = null: kotlin.Nothing?, b = {null}: kotlin.Array<out kotlin.String>) public abstract fun foo(): kotlin.Unit
public final annotation class Ann : kotlin.Annotation {
public constructor Ann(/*0*/ a: kotlin.String, /*1*/ b: kotlin.Array<kotlin.String>)
public constructor Ann(/*0*/ a: kotlin.String, /*1*/ b: kotlin.Array<out kotlin.String>)
public abstract fun a(): kotlin.String
public abstract fun b(): kotlin.Array<kotlin.String>
}
@@ -194,7 +194,16 @@ public class LazyJavaClassMemberScope(
val methods = jClass.getMethods()
val result = ArrayList<ValueParameterDescriptor>(methods.size())
val attr = TypeUsage.MEMBER_SIGNATURE_INVARIANT.toAttributes(
// Using MEMBER_SIGNATURE_CONTRAVARIANT is just a hack to make overload resolution work in cases like
// Ann(arg = array(javaClass<Int>())) class Annotated
//
// If we load constructor parameters' types as invariant: Ann(arg: Array<Class<*>>), Ann(arg: Array<KClass<*>>), then
// when resolving `Ann(arg = array(javaClass<Int>()))` type of array is inferred as Array<Class<Int>>
// which is neither subtype of Array<Class<*>> nor Array<KClass<*>> (similar case is KT-7410)
//
// Hack should be removed if support of Class<*> in annotations is dropped or KT-7410 is fixed
// Also see tests `AnnotationsWithClassParameterOverload`
val attr = TypeUsage.MEMBER_SIGNATURE_CONTRAVARIANT.toAttributes(
allowFlexible = false, isForAnnotationParameter = loadJavaClassAsKClass)
val (methodsNamedValue, otherMethods) = methods.