Make "reflection not found" a warning, provide a quick fix

Reporting the warning on each "::", as ReflectionNotFoundInspection did, is not
correct anymore, because for example name/get/set on properties works perfectly
without kotlin-reflect.jar in the classpath. So instead we report the warning
on calls to functions from reflection interfaces. This is not perfect either
because it's wrong in projects with custom implementations of reflection
interfaces, but this case is so rare that the users can suppress the warning
there anyway

 #KT-7176 Fixed
This commit is contained in:
Alexander Udalov
2015-07-02 17:39:16 +03:00
parent 4f1247f03f
commit 636b63a8c5
24 changed files with 240 additions and 261 deletions
@@ -0,0 +1,21 @@
import kotlin.reflect.*
class Foo(val prop: Any) {
fun func() {}
}
fun n01() = Foo::prop
fun n02() = Foo::func
fun n03() = Foo::class
fun n04(p: KProperty0<Int>) = p.get()
fun n05(p: KMutableProperty0<String>) = p.set("")
fun n06(p: KProperty0<Int>) = p.get()
fun n07(p: KFunction<String>) = p.name
fun n08(p: KProperty1<String, Int>) = p[""]
fun n09(p: KProperty2<String, String, Int>) = p["", ""]
fun n10() = (Foo::func).invoke(Foo(""))
fun n11() = (Foo::func)(Foo(""))
fun y01() = Foo::prop.<!NO_REFLECTION_IN_CLASS_PATH!>getter<!>
fun y02() = Foo::class.<!NO_REFLECTION_IN_CLASS_PATH!>properties<!>
fun y03() = Foo::class.<!NO_REFLECTION_IN_CLASS_PATH!>simpleName<!>
@@ -0,0 +1,25 @@
package
internal fun n01(): kotlin.reflect.KProperty1<Foo, kotlin.Any>
internal fun n02(): kotlin.reflect.KFunction1<Foo, kotlin.Unit>
internal fun n03(): kotlin.reflect.KClass<Foo>
internal fun n04(/*0*/ p: kotlin.reflect.KProperty0<kotlin.Int>): kotlin.Int
internal fun n05(/*0*/ p: kotlin.reflect.KMutableProperty0<kotlin.String>): kotlin.Unit
internal fun n06(/*0*/ p: kotlin.reflect.KProperty0<kotlin.Int>): kotlin.Int
internal fun n07(/*0*/ p: kotlin.reflect.KFunction<kotlin.String>): kotlin.String
internal fun n08(/*0*/ p: kotlin.reflect.KProperty1<kotlin.String, kotlin.Int>): kotlin.Int
internal fun n09(/*0*/ p: kotlin.reflect.KProperty2<kotlin.String, kotlin.String, kotlin.Int>): kotlin.Int
internal fun n10(): kotlin.Unit
internal fun n11(): kotlin.Unit
internal fun y01(): kotlin.reflect.KProperty1.Getter<Foo, kotlin.Any>
internal fun y02(): kotlin.Collection<kotlin.reflect.KProperty1<Foo, *>>
internal fun y03(): kotlin.String?
internal final class Foo {
public constructor Foo(/*0*/ prop: kotlin.Any)
internal final val prop: kotlin.Any
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
internal final fun func(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}