FIR checker: report non-typed LHS of callable references

This commit is contained in:
Jinseong Jeon
2021-03-04 09:44:34 -08:00
committed by Mikhail Glukhikh
parent 329be4f906
commit 33c5b49632
20 changed files with 195 additions and 39 deletions
+5 -5
View File
@@ -28,8 +28,8 @@ class Test1<T>()
{
fun test(t : T) {
<!OTHER_ERROR!>T<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
<!OTHER_ERROR!>T<!>.<!UNRESOLVED_REFERENCE!>bar<!>()
<!TYPE_PARAMETER_ON_LHS_OF_DOT!>T<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
<!TYPE_PARAMETER_ON_LHS_OF_DOT!>T<!>.<!UNRESOLVED_REFERENCE!>bar<!>()
t.foo()
t.bar()
}
@@ -56,8 +56,8 @@ fun <T> test2(t : T)
T : B,
B : T
{
<!OTHER_ERROR!>T<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
<!OTHER_ERROR!>T<!>.<!UNRESOLVED_REFERENCE!>bar<!>()
<!TYPE_PARAMETER_ON_LHS_OF_DOT!>T<!>.<!UNRESOLVED_REFERENCE!>foo<!>()
<!TYPE_PARAMETER_ON_LHS_OF_DOT!>T<!>.<!UNRESOLVED_REFERENCE!>bar<!>()
t.foo()
t.bar()
}
@@ -66,4 +66,4 @@ val t1 = <!INAPPLICABLE_CANDIDATE!>test2<!><A>(A())
val t2 = <!INAPPLICABLE_CANDIDATE!>test2<!><B>(C())
val t3 = test2<C>(C())
val <T, B : T> x : Int = 0
val <T, B : T> x : Int = 0
@@ -1,19 +1,19 @@
// !WITH_NEW_INFERENCE
class A<T, U : Any> {
fun foo() = <!OTHER_ERROR!>T<!>::toString
fun foo() = <!CALLABLE_REFERENCE_LHS_NOT_A_CLASS!>T::toString<!>
fun bar() = <!OTHER_ERROR!>U<!>::toString
fun bar() = <!CALLABLE_REFERENCE_LHS_NOT_A_CLASS!>U::toString<!>
fun baz() {
take(<!OTHER_ERROR!>T<!>::toString)
take(<!CALLABLE_REFERENCE_LHS_NOT_A_CLASS!>T::toString<!>)
take(<!OTHER_ERROR!>U<!>::toString)
take(<!CALLABLE_REFERENCE_LHS_NOT_A_CLASS!>U::toString<!>)
}
}
fun <T> foo() = <!OTHER_ERROR!>T<!>::toString
fun <T> foo() = <!CALLABLE_REFERENCE_LHS_NOT_A_CLASS!>T::toString<!>
fun <U : Any> bar() = <!OTHER_ERROR!>U<!>::toString
fun <U : Any> bar() = <!CALLABLE_REFERENCE_LHS_NOT_A_CLASS!>U::toString<!>
fun take(arg: Any) {}
@@ -9,8 +9,8 @@ val l1 = <!NULLABLE_TYPE_IN_CLASS_LITERAL_LHS!>List<String>?::class<!>
val l2 = <!NULLABLE_TYPE_IN_CLASS_LITERAL_LHS!>List?::class<!>
fun <T : Any> foo() {
val t1 = <!OTHER_ERROR!>T<!>::class
val t2 = <!OTHER_ERROR!>T<!>?::class
val t1 = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>::class
val t2 = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>?::class
}
inline fun <reified T : Any> bar() {
@@ -1,23 +1,23 @@
// !DIAGNOSTICS: -TYPE_PARAMETER_AS_REIFIED -TYPE_PARAMETER_OF_PROPERTY_NOT_USED_IN_RECEIVER -UNUSED_VARIABLE -UNUSED_PARAMETER
fun <T> test1() = <!OTHER_ERROR!>T<!>::class
fun <T : Any> test2() = <!OTHER_ERROR!>T<!>::class
fun <T> test1() = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>::class
fun <T : Any> test2() = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>::class
val <T> test3 = <!OTHER_ERROR!>T<!>::class
val <T> test4 get() = <!OTHER_ERROR!>T<!>::class
val <T> test3 = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>::class
val <T> test4 get() = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>::class
fun <T> test5() = listOf(<!OTHER_ERROR!>T<!>::class)
fun <T> test5() = listOf(T::class)
fun <T> test6(): kotlin.reflect.KClass<T> = <!OTHER_ERROR!>T<!>::class
fun <T> test7(): kotlin.reflect.KClass<*> = <!OTHER_ERROR!>T<!>::class
fun <T> test6(): kotlin.reflect.KClass<T> = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>::class
fun <T> test7(): kotlin.reflect.KClass<*> = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>::class
fun test8() = <!NULLABLE_TYPE_IN_CLASS_LITERAL_LHS!>String?::class<!>
fun <T> listOf(e: T): List<T> = null!!
fun <L> locals() {
fun <T> test1() = <!OTHER_ERROR!>T<!>::class
fun <T : Any> test2() = <!OTHER_ERROR!>T<!>::class
fun <T> test1() = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>::class
fun <T : Any> test2() = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>::class
val test3 = <!OTHER_ERROR!>L<!>::class
fun test4() = <!OTHER_ERROR!>L<!>::class
val test3 = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>L<!>::class
fun test4() = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>L<!>::class
}
@@ -1,5 +1,9 @@
// !WITH_NEW_INFERENCE
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !DIAGNOSTICS: -UNUSED_PARAMETER, -UNUSED_EXPRESSION
inline fun <reified T> foo() {
<!CALLABLE_REFERENCE_LHS_NOT_A_CLASS!>T::toString<!>
}
inline fun <reified T> f(): T = throw UnsupportedOperationException()
@@ -1,5 +1,9 @@
// !WITH_NEW_INFERENCE
// !DIAGNOSTICS: -UNUSED_PARAMETER
// !DIAGNOSTICS: -UNUSED_PARAMETER, -UNUSED_EXPRESSION
inline fun <reified T> foo() {
<!CALLABLE_REFERENCE_LHS_NOT_A_CLASS!>T::<!UNRESOLVED_REFERENCE!>toString<!><!>
}
inline fun <reified T> f(): T = throw UnsupportedOperationException()
@@ -1,5 +1,6 @@
package
public inline fun </*0*/ reified T> f(): T
public inline fun </*0*/ reified T> foo(): kotlin.Unit
public fun </*0*/ T> id(/*0*/ p: T): T
public fun </*0*/ A> main(): kotlin.Unit
@@ -1,8 +0,0 @@
package bar
class S<T> {
fun foo() {
<!OTHER_ERROR!>T<!>
<!OTHER_ERROR!>T<!>.<!UNRESOLVED_REFERENCE!>create<!>()
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
package bar
class S<T> {
@@ -14,6 +14,6 @@ fun test() {
}
fun <T> bar() {
val typeParameter_as_val = <!OTHER_ERROR!>T<!>
val typeParameter_as_val = <!TYPE_PARAMETER_IS_NOT_AN_EXPRESSION!>T<!>
val typeParameter_as_fun = <!UNRESOLVED_REFERENCE!>T<!>()
}