Do not report inspection "no reflection" in annotation entries

Annotation codegen shouldn't use something from reflection.jar
This commit is contained in:
Denis Zharkov
2015-04-22 20:06:07 +03:00
parent 14df5b72b7
commit 470ad93328
3 changed files with 27 additions and 0 deletions
@@ -45,6 +45,8 @@ import org.jetbrains.kotlin.psi.JetVisitorVoid
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.serialization.deserialization.findClassAcrossModuleDependencies
import org.jetbrains.kotlin.builtins.ReflectionTypes
import org.jetbrains.kotlin.psi.JetAnnotationEntry
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.utils.PathUtil
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import org.jetbrains.kotlin.utils.singletonOrEmptyList
@@ -75,6 +77,8 @@ public class ReflectionNotFoundInspection : AbstractKotlinInspection() {
val expectedType = expression.analyze().get(BindingContext.EXPECTED_EXPRESSION_TYPE, expression)
if (expectedType != null && !ReflectionTypes.isReflectionType(expectedType)) return
if (expression.getStrictParentOfType<JetAnnotationEntry>() != null) return
// If a callable reference is used where a KFunction/KProperty/... expected, we should report that usage as dangerous
// because reflection features will fail without kotlin-reflect.jar in the classpath.
// If it's only used as a Function however (for example, "list.map(::function)"), we should not report anything
@@ -15,4 +15,12 @@
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Reflection not found</problem_class>
<description>Reflection not found in the classpath</description>
</problem>
<problem>
<file>withinAnnotationEntry.kt</file>
<line>13</line>
<module>light_idea_test_case</module>
<entry_point TYPE="file" FQNAME="temp:///src/withinAnnotationEntry.kt" />
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Reflection not found</problem_class>
<description>Reflection not found in the classpath</description>
</problem>
</problems>
@@ -0,0 +1,15 @@
package test
// WITH_RUNTIME
import kotlin.reflect.KClass
annotation class A(val arg: KClass<*>, val args: Array<KClass<*>>, vararg val other: KClass<*>)
A(Int::class, array(String::class), Double::class, Char::class)
class MyClass {
throws(Exception::class)
fun foo() {
Exception::class
}
}