Refactor and improve class literal type checking code

Infer something sensible instead of error types when an error is reported, such
as absence of a type argument for Array or presence of type arguments for other
types
This commit is contained in:
Alexander Udalov
2016-04-21 18:39:05 +03:00
parent 1b79770121
commit ca7e4496c7
11 changed files with 91 additions and 58 deletions
@@ -3,3 +3,5 @@ val a02 = Array<<!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Array<!>>::class
val a03 = Array<Any?>::class
val a04 = Array<Array<Any?>?>::class
val a05 = Array<IntArray?>::class
val a06 = <!ARRAY_CLASS_LITERAL_REQUIRES_ARGUMENT!>kotlin.Array::class<!>
val a07 = kotlin.Array<IntArray?>::class
@@ -1,7 +1,9 @@
package
public val a01: [ERROR : Unresolved class]
public val a01: kotlin.reflect.KClass<kotlin.Array<*>>
public val a02: kotlin.reflect.KClass<kotlin.Array<[ERROR : Array]>>
public val a03: kotlin.reflect.KClass<kotlin.Array<kotlin.Any?>>
public val a04: kotlin.reflect.KClass<kotlin.Array<kotlin.Array<kotlin.Any?>?>>
public val a05: kotlin.reflect.KClass<kotlin.Array<kotlin.IntArray?>>
public val a06: kotlin.reflect.KClass<kotlin.Array<*>>
public val a07: kotlin.reflect.KClass<kotlin.Array<kotlin.IntArray?>>
@@ -4,5 +4,8 @@ fun <T> f1(): KClass<Array<T>> = <!CLASS_LITERAL_LHS_NOT_A_CLASS!>Array<T>::clas
fun <T> f2(): KClass<Array<Array<T>>> = <!CLASS_LITERAL_LHS_NOT_A_CLASS!>Array<Array<T>>::class<!>
inline fun <reified T> f3() = Array<T>::class
inline fun <reified T> f4() = Array<Array<T>>::class
fun f5(): KClass<Array<Any>> = <!CLASS_LITERAL_LHS_NOT_A_CLASS!>Array<*>::class<!>
fun f6(): KClass<Array<Int?>> = Array<Int?>::class
fun f5(): KClass<Array<Any>> = <!CLASS_LITERAL_LHS_NOT_A_CLASS, TYPE_MISMATCH!>Array<*>::class<!>
fun f6(): KClass<Array<Int?>> = Array<Int?>::class
fun f7() = <!CLASS_LITERAL_LHS_NOT_A_CLASS!>Array<List<String>>::class<!>
fun f8() = <!CLASS_LITERAL_LHS_NOT_A_CLASS!>Array<List<String>?>::class<!>
fun f9() = <!CLASS_LITERAL_LHS_NOT_A_CLASS!>Array<List<*>?>::class<!>
@@ -6,3 +6,6 @@ public inline fun </*0*/ reified T> f3(): kotlin.reflect.KClass<kotlin.Array<T>>
public inline fun </*0*/ reified T> f4(): kotlin.reflect.KClass<kotlin.Array<kotlin.Array<T>>>
public fun f5(): kotlin.reflect.KClass<kotlin.Array<kotlin.Any>>
public fun f6(): kotlin.reflect.KClass<kotlin.Array<kotlin.Int?>>
public fun f7(): kotlin.reflect.KClass<kotlin.Array<kotlin.collections.List<kotlin.String>>>
public fun f8(): kotlin.reflect.KClass<kotlin.Array<kotlin.collections.List<kotlin.String>?>>
public fun f9(): kotlin.reflect.KClass<kotlin.Array<kotlin.collections.List<*>?>>
@@ -1,19 +1,19 @@
package
public val a1: kotlin.reflect.KClass<A<*>>
public val a2: [ERROR : Unresolved class]
public val a3: [ERROR : Unresolved class]
public val a4: [ERROR : Unresolved class]
public val a2: kotlin.reflect.KClass<A<*>>
public val a3: kotlin.reflect.KClass<A<kotlin.String>>
public val a4: kotlin.reflect.KClass<A<out kotlin.String?>>
public val b1: kotlin.reflect.KClass<kotlin.Int>
public val b2: kotlin.reflect.KClass<kotlin.Nothing>
public val i1: kotlin.reflect.KClass<A<*>.Inner<*>>
public val i2: [ERROR : Unresolved class]
public val i3: [ERROR : Unresolved class]
public val i2: kotlin.reflect.KClass<A<*>.Inner<*>>
public val i3: kotlin.reflect.KClass<A<kotlin.Int>.Inner<kotlin.CharSequence>>
public val m1: kotlin.reflect.KClass<kotlin.collections.Map<*, *>>
public val m2: [ERROR : Unresolved class]
public val m2: kotlin.reflect.KClass<kotlin.collections.Map<kotlin.Int, *>>
public val m3: kotlin.reflect.KClass<kotlin.collections.Map.Entry<*, *>>
public val n1: kotlin.reflect.KClass<A.Nested<*>>
public val n2: [ERROR : Unresolved class]
public val n2: kotlin.reflect.KClass<A.Nested<*>>
public final class A</*0*/ T> {
public constructor A</*0*/ T>()
@@ -13,4 +13,8 @@ fun <T : Any> foo() {
val t2 = <!CLASS_LITERAL_LHS_NOT_A_CLASS!>T?::class<!>
}
val m = Map<!WRONG_NUMBER_OF_TYPE_ARGUMENTS!><String><!>::class
inline fun <reified T : Any> bar() {
val t3 = <!CLASS_LITERAL_LHS_NOT_A_CLASS!>T?::class<!>
}
val m = Map<!WRONG_NUMBER_OF_TYPE_ARGUMENTS!><String><!>::class
@@ -1,10 +1,11 @@
package
public val a1: [ERROR : Unresolved class]
public val a2: [ERROR : Unresolved class]
public val l1: [ERROR : Unresolved class]
public val l2: [ERROR : Unresolved class]
public val a1: kotlin.reflect.KClass<A?>
public val a2: kotlin.reflect.KClass<A?>
public val l1: kotlin.reflect.KClass<kotlin.collections.List<kotlin.String>?>
public val l2: kotlin.reflect.KClass<kotlin.collections.List<*>?>
public val m: [ERROR : Unresolved class]
public inline fun </*0*/ reified T : kotlin.Any> bar(): kotlin.Unit
public fun </*0*/ T : kotlin.Any> foo(): kotlin.Unit
public final class A {
@@ -0,0 +1,7 @@
package test.foo.bar
class A
val k = test.foo.bar.A::class
val l = java.lang.Class::class
@@ -0,0 +1,19 @@
package
package test {
package test.foo {
package test.foo.bar {
public val k: kotlin.reflect.KClass<test.foo.bar.A>
public val l: kotlin.reflect.KClass<java.lang.Class<*>>
public final class A {
public constructor A()
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
}
}
}
}