Update typing rules for class literal expressions.

C::class : KClass<C>
expr: T => expr::class : KClass<out T>

NB: this means Obj::class : KClass<out Obj> for object Obj.
This commit is contained in:
Dmitry Petrov
2016-12-15 18:25:14 +03:00
parent 9fc3d0838e
commit 33ed98a0d3
16 changed files with 110 additions and 26 deletions
@@ -7,6 +7,8 @@ fun test(s: String) {
val g: () -> String = s::toString
val h: (Any?) -> Boolean = s::equals
val k: KClass<String> = s::class
val k: KClass<out String> = s::class
val l: KClass<*> = s::class
val m: KClass<String> = String::class
val n: KClass<Unit> = Unit::class
}
@@ -21,9 +21,9 @@ package test {
public final fun </*0*/ T> kotlin.collections.List<T>.testCallable2(): () -> kotlin.Unit
public final fun </*0*/ T> kotlin.collections.List<T>.testCallable3(): () -> kotlin.Unit
public final fun </*0*/ T> kotlin.collections.List<T>.testCallable4(): () -> kotlin.Unit
public final fun </*0*/ T> kotlin.collections.List<T>.testClassLiteral1(): kotlin.reflect.KClass<kotlin.Int>
public final fun </*0*/ T> kotlin.collections.List<T>.testClassLiteral2(): kotlin.reflect.KClass<kotlin.Int?>
public final fun </*0*/ T> kotlin.collections.List<T>.testClassLiteral3(): kotlin.reflect.KClass<kotlin.Int?>
public final fun </*0*/ T> kotlin.collections.List<T>.testClassLiteral1(): kotlin.reflect.KClass<out kotlin.Int>
public final fun </*0*/ T> kotlin.collections.List<T>.testClassLiteral2(): kotlin.reflect.KClass<out kotlin.Int?>
public final fun </*0*/ T> kotlin.collections.List<T>.testClassLiteral3(): kotlin.reflect.KClass<out kotlin.Int?>
public final fun </*0*/ T> kotlin.collections.List<T>.testUnresolved1(): [ERROR : Error function type]
public final fun </*0*/ T> kotlin.collections.List<T>.testUnresolved2(): kotlin.reflect.KFunction0<kotlin.Unit>
public final fun </*0*/ T> kotlin.collections.List<T>.testUnresolved3(): kotlin.reflect.KFunction0<kotlin.Unit>
@@ -8,11 +8,11 @@ public fun f5(): kotlin.reflect.KClass<test.GenericSam<*>>
public fun f6(): kotlin.reflect.KFunction2<test.GenericSam<*>, @kotlin.ParameterName(name = "t") kotlin.Nothing!, kotlin.Unit>
public fun f7(): kotlin.reflect.KClass<test.GenericSam<*>>
public fun f8(): kotlin.reflect.KFunction2<test.GenericSam<kotlin.String>, @kotlin.ParameterName(name = "t") kotlin.String!, kotlin.Unit>
public fun g1(): kotlin.reflect.KClass<java.lang.Runnable>
public fun g1(): kotlin.reflect.KClass<out java.lang.Runnable>
public fun g2(): kotlin.reflect.KFunction0<kotlin.Unit>
public fun g3(): kotlin.reflect.KClass<java.lang.Runnable>
public fun g3(): kotlin.reflect.KClass<out java.lang.Runnable>
public fun g4(): kotlin.reflect.KFunction0<kotlin.Unit>
public fun g5(): kotlin.reflect.KClass<test.GenericSam<kotlin.String>>
public fun g5(): kotlin.reflect.KClass<out test.GenericSam<kotlin.String>>
public fun g6(): kotlin.reflect.KFunction1<@kotlin.ParameterName(name = "t") kotlin.String!, kotlin.Unit>
public fun g7(): kotlin.reflect.KClass<test.GenericSam<kotlin.String>>
public fun g7(): kotlin.reflect.KClass<out test.GenericSam<kotlin.String>>
public fun g8(): kotlin.reflect.KFunction1<@kotlin.ParameterName(name = "t") kotlin.String!, kotlin.Unit>
@@ -0,0 +1,16 @@
import kotlin.reflect.KClass
abstract class Base<T : Any>(val klass: KClass<out T>)
class DerivedClass : Base<DerivedClass>(DerivedClass::class)
object DerivedObject : Base<DerivedObject>(DerivedObject::class)
enum class TestEnum {
TEST_ENTRY
}
val test1: KClass<DerivedClass> = DerivedClass::class
val test2: KClass<DerivedObject> = DerivedObject::class
val test3: KClass<TestEnum> = TestEnum::class
val test4: KClass<out TestEnum> = TestEnum.TEST_ENTRY::class
@@ -0,0 +1,49 @@
package
public val test1: kotlin.reflect.KClass<DerivedClass>
public val test2: kotlin.reflect.KClass<DerivedObject>
public val test3: kotlin.reflect.KClass<TestEnum>
public val test4: kotlin.reflect.KClass<out TestEnum>
public abstract class Base</*0*/ T : kotlin.Any> {
public constructor Base</*0*/ T : kotlin.Any>(/*0*/ klass: kotlin.reflect.KClass<out T>)
public final val klass: kotlin.reflect.KClass<out T>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class DerivedClass : Base<DerivedClass> {
public constructor DerivedClass()
public final override /*1*/ /*fake_override*/ val klass: kotlin.reflect.KClass<out DerivedClass>
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 object DerivedObject : Base<DerivedObject> {
private constructor DerivedObject()
public final override /*1*/ /*fake_override*/ val klass: kotlin.reflect.KClass<out DerivedObject>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final enum class TestEnum : kotlin.Enum<TestEnum> {
enum entry TEST_ENTRY
private constructor TestEnum()
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: TestEnum): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<TestEnum!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): TestEnum
public final /*synthesized*/ fun values(): kotlin.Array<TestEnum>
}
@@ -3,7 +3,13 @@ import kotlin.reflect.KClass
class A
class B
val listOfString: List<String> = null!!
val arrayOfString: Array<String> = null!!
val a1 : KClass<*> = A::class
val a2 : KClass<A> = A::class
val a3 : KClass<B> = <!TYPE_MISMATCH!>A::class<!>
val a4 : B = <!TYPE_MISMATCH!>A::class<!>
val a5 : KClass<out List<String>> = listOfString::class
val a6 : KClass<out Array<String>> = arrayOfString::class
@@ -4,6 +4,10 @@ public val a1: kotlin.reflect.KClass<*>
public val a2: kotlin.reflect.KClass<A>
public val a3: kotlin.reflect.KClass<B>
public val a4: B
public val a5: kotlin.reflect.KClass<out kotlin.collections.List<kotlin.String>>
public val a6: kotlin.reflect.KClass<out kotlin.Array<kotlin.String>>
public val arrayOfString: kotlin.Array<kotlin.String>
public val listOfString: kotlin.collections.List<kotlin.String>
public final class A {
public constructor A()
@@ -2,7 +2,7 @@
import kotlin.reflect.KClass
fun f(<!UNUSED_PARAMETER!>x<!>: KClass<Int>) {}
fun f(<!UNUSED_PARAMETER!>x<!>: KClass<out Int>) {}
fun test() {
f(42::class)
@@ -1,4 +1,4 @@
package
public fun f(/*0*/ x: kotlin.reflect.KClass<kotlin.Int>): kotlin.Unit
public fun f(/*0*/ x: kotlin.reflect.KClass<out kotlin.Int>): kotlin.Unit
public fun test(): kotlin.Unit
@@ -1,9 +1,9 @@
package
public val fail1: kotlin.reflect.KClass<kotlin.String>
public val fail1: kotlin.reflect.KClass<out kotlin.String>
public val fail2: kotlin.reflect.KClass<kotlin.String?>
public val fail3: kotlin.reflect.KClass<C.Companion>
public val fail4: kotlin.reflect.KClass<C.Companion>
public val fail3: kotlin.reflect.KClass<out C.Companion>
public val fail4: kotlin.reflect.KClass<out C.Companion>
public val ok1: kotlin.reflect.KClass<C>
public val ok2: kotlin.reflect.KClass<C.Companion>
public val ok3: kotlin.reflect.KClass<O>