Do not report "reflection is not available" on built-in sources

This commit is contained in:
Alexander Udalov
2016-07-19 17:39:56 +03:00
parent 9be219b69c
commit a92f0a0446
@@ -17,10 +17,13 @@
package org.jetbrains.kotlin.resolve.jvm.checkers
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.builtins.KOTLIN_REFLECT_FQ_NAME
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.ReflectionTypes
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker
import org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext
@@ -48,6 +51,9 @@ class ReflectionAPICallChecker(private val module: ModuleDescriptor, storageMana
override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {
if (isReflectionAvailable) return
// Do not report the diagnostic on built-in sources
if (isReflectionSource(reportOn)) return
val descriptor = resolvedCall.resultingDescriptor
val containingClass = descriptor.containingDeclaration as? ClassDescriptor ?: return
if (!ReflectionTypes.isReflectionClass(containingClass)) return
@@ -66,4 +72,11 @@ class ReflectionAPICallChecker(private val module: ModuleDescriptor, storageMana
context.trace.report(NO_REFLECTION_IN_CLASS_PATH.on(reportOn))
}
private fun isReflectionSource(reportOn: PsiElement): Boolean {
val file = reportOn.containingFile as? KtFile ?: return false
val fqName = file.packageFqName.toUnsafe()
return fqName.startsWith(KotlinBuiltIns.BUILT_INS_PACKAGE_NAME) &&
(fqName == KOTLIN_REFLECT_FQ_NAME.toUnsafe() || fqName.asString().startsWith(KOTLIN_REFLECT_FQ_NAME.asString() + "."))
}
}